OpenGL communityФорумУроки по OpenGL

Урок 2 - Рисуем первый треугольник (комментарии)

Страницы: 1 2 3 4 5 Следующая »
#0
19:58, 26 окт 2010

Урок 2 - Рисуем первый треугольник (комментарии)

Это сообщение сгенерировано автоматически.

#1
19:58, 26 окт 2010

Дублирую http://code.google.com/p/gl33lessons/wiki/Lesson02

#2
0:17, 27 окт 2010

Неплохо бы вставить в соответствующие места такие картинки:
Изображение

Изображение
Изображение

с соответствующими комментариями. Думаю, этот урок - самое подходящее для них место, т.к. картинки очень хорошо проясняют происходящее в коде.

#3
21:29, 28 окт 2010

OpenGL SuperBible 5th
Изображение

#4
1:26, 30 окт 2010

У меня появились вопросы по VBO.

// назначим на атрибут параметры доступа к VBO
glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE,
   VERTEX_SIZE, (const GLvoid*)VERTEX_POSITION_OFFSET);

параллельно приведу определение функции, чтобы удобнее было спрашивать.

void glVertexAttribPointer(  GLuint    index, 
   GLint    size, 
   GLenum    type, 
   GLboolean    normalized, 
   GLsizei    stride, 
   const GLvoid *    pointer); 

1)Почему мы указываем в параметре stride значение VERTEX_SIZE? Почему это не разница между данными? То есть, почему мы не указываем размер, который занимает цвет вершины?

2)Ещё не могу перевести следующие предложения, то есть понять их смысл :).

If a non-zero named buffer object is bound to the GL_ARRAY_BUFFER target while a generic vertex attribute array is specified, pointer is treated as a byte offset into the buffer object's data store.

When a generic vertex attribute array is specified, size, type, normalized, stride, and pointer are saved as client-side state, in addition to the current vertex array buffer object binding.

#5
3:58, 30 окт 2010

Pixar

1) потому что данные для атрибутов лежат в одном и том же массиве. вот так:

v[0]: pos[0] <--*                                <-- pos offset
         [1]    |
         [2]    | 
      tex[0]    |        <--*                    <-- tex offset
         [1]     >pos       |
      nor[0]    | stride    |        <--*        <-- nor offset
         [1]    |           |           |
         [2]    |            >tex       |
v[1]: pos[0] <--*           | stride    |
         [1]                |            >nor
         [2]                |           | stride
      tex[0]             <--*           |
         [1]                            |
      nor[0]                         <--*
         [1]
         [2]
#6
8:11, 30 окт 2010

Pixar
> 1)Почему мы указываем в параметре stride значение VERTEX_SIZE? Почему это не
> разница между данными? То есть, почему мы не указываем размер, который занимает
> цвет вершины?

Потому что указывается сдвиг прибавив который мы попадём на следующий элемент... pos[0] + stride = pos[1]

#7
10:47, 30 окт 2010

Executor
Можно ли в буфере хранить структуры аттрибутов различных размеров? (ну т.е. данные разных форматов вершин)

вот я например устанавливаю аттрибут со смещением = offset_base + offset2 и шагом stride2 которые:

000011112222333444555
------------             offset_base
                         offset1
               -         offset2
               --        offset3
----                     stride1
               ---       stride2

Это к мысли о том, чтобы буферов поменьше было. Хотя сейчас даже не знаю смысл есть или нет.

PS Как то темка поднималась о степени "тяжести" операций изменения состояния OpenGL. Вроде она заглохла, может поднять? =)

#8
11:33, 30 окт 2010

AxMeT
> Можно ли в буфере хранить структуры аттрибутов различных размеров? (ну т.е. данные разных форматов вершин)

Не понял вопроса...

> PS Как то темка поднималась о степени "тяжести" операций изменения состояния OpenGL. Вроде она заглохла, может поднять? =)

Это не будет ботлнеком, поэтому смысла в оптимизации нету...
Через мерная оптимизация ни к чему хорошему не приводит, наоборот только усложняет всё и делает медленнее...
Вот когда у тебя будет рендер упираться в переключение буферов, тогда и стоит подумать над оптимизацией...

#9
11:48, 30 окт 2010

Executor
> Это не будет ботлнеком, поэтому смысла в оптимизации нету...
> Через мерная оптимизация ни к чему хорошему не приводит, наоборот только
> усложняет всё и делает медленнее...
> Вот когда у тебя будет рендер упираться в переключение буферов, тогда и стоит
> подумать над оптимизацией...

Я тоже так подумал и забил на это.

А вот про то что имел ввиду, может так понятнее будет. Код условный:

struct A{
    float a1[4];
    float a2[4];
}

struct B {
   float b1[4];
}

uint size = sizeof(A)*countA + sizeof(B)*countB;
byte* bytes = new byte[size];

// Заполнение bytes ...

glBufferData(GL_ARRAY_BUFFER, size, bytes, GL_STATIC_DRAW);
#10
12:19, 30 окт 2010

stream
Классная картинка, всё понял :).

Остался второй вопрос.

When a generic vertex attribute array is specified, size, type, normalized, stride, and pointer are saved as client-side state, in addition to the current vertex array buffer object binding.

Что это значит?

====

Всё, я закончил перепечатывать проект :). Вроде даже скомпилировалось, но треугольника не вижу. В логе вылезает такая ошибка:

c:\...\documents\visual studio 2008\projects\opengl\opengl\main.cpp:GLWindowRender:205 ERROR OpenGL error 1282

Эта строчка печатается в OPENGL_CHECK_FOR_ERRORS().

#11
12:25, 30 окт 2010

AxMeT
> А вот про то что имел ввиду, может так понятнее будет. Код условный:

Ты хочешь два буфера объединить в один как я понял... Как? ABABABAB... или же AAAAABBBBB? Второй вариант тут был бы предпочтительнее, если уж хочется в один буфер запихать... Можно конечно и первым сделать, но расстояние между вершинами слишком большое будет, смысла не вижу так делать...

#12
12:27, 30 окт 2010

Pixar
> main.cpp:GLWindowRender:205 ERROR OpenGL error 1282
Это самый обычный GL_INVALID_OPERATION, что-то было сделано не так.

Pixar
> When a generic vertex attribute array is specified, size, type, normalized,
> stride, and pointer are saved as client-side state, in addition to the current
> vertex array buffer object binding.

В дополнение к текущим биндингам сохраняются и новые.

#13
12:30, 30 окт 2010

KpeHDeJIb
> Это самый обычный GL_INVALID_OPERATION, что-то было сделано не так.
А в какую сторону смотреть? Что искать?

KpeHDeJIb
>В дополнение к текущим биндингам сохраняются и новые.
Что значит "текущие биндинги"?

#14
12:45, 30 окт 2010

Pixar
> 2)Ещё не могу перевести следующие предложения, то есть понять их смысл :).
>
> If a non-zero named buffer object is bound to the GL_ARRAY_BUFFER target while
> a generic vertex attribute array is specified, pointer is treated as a byte
> offset into the buffer object's data store.

Если до этого был вызов glBindBuffer(GL_ARRAY_BUFFER, vbo); то данные будут браться оттуда, а последний параметр glVertexAttribPointer укажет на смещение
внутри этого буфера, а не на место в памяти откуда брать данные, т.е. данные будут браться из vbo_memory_ptr + (unsigned int)pointer.

> When a generic vertex attribute array is specified, size, type, normalized,
> stride, and pointer are saved as client-side state, in addition to the current
> vertex array buffer object binding.

Это тебя вообще не должно волновать, тут говорится что данные вершинных атрибутов хранятся на стороне клиента (в нашем случае клиент и сервер всегда на
одном компьютере), и то что они не затирают предыдущие вызовы таких функций как glVertexAttribPointer, glVertexPointer, glTexCoordPointer и т.п.

Страницы: 1 2 3 4 5 Следующая »
OpenGL communityФорумУроки по OpenGL

Тема в архиве.