Урок 2 - Рисуем первый треугольник (комментарии)
Это сообщение сгенерировано автоматически.
Неплохо бы вставить в соответствующие места такие картинки:
с соответствующими комментариями. Думаю, этот урок - самое подходящее для них место, т.к. картинки очень хорошо проясняют происходящее в коде.
У меня появились вопросы по 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.
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]
Pixar
> 1)Почему мы указываем в параметре stride значение VERTEX_SIZE? Почему это не
> разница между данными? То есть, почему мы не указываем размер, который занимает
> цвет вершины?
Потому что указывается сдвиг прибавив который мы попадём на следующий элемент... pos[0] + stride = pos[1]
Executor
Можно ли в буфере хранить структуры аттрибутов различных размеров? (ну т.е. данные разных форматов вершин)
вот я например устанавливаю аттрибут со смещением = offset_base + offset2 и шагом stride2 которые:
000011112222333444555 ------------ offset_base offset1 - offset2 -- offset3 ---- stride1 --- stride2
Это к мысли о том, чтобы буферов поменьше было. Хотя сейчас даже не знаю смысл есть или нет.
PS Как то темка поднималась о степени "тяжести" операций изменения состояния OpenGL. Вроде она заглохла, может поднять? =)
AxMeT
> Можно ли в буфере хранить структуры аттрибутов различных размеров? (ну т.е. данные разных форматов вершин)
Не понял вопроса...
> PS Как то темка поднималась о степени "тяжести" операций изменения состояния OpenGL. Вроде она заглохла, может поднять? =)
Это не будет ботлнеком, поэтому смысла в оптимизации нету...
Через мерная оптимизация ни к чему хорошему не приводит, наоборот только усложняет всё и делает медленнее...
Вот когда у тебя будет рендер упираться в переключение буферов, тогда и стоит подумать над оптимизацией...
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);
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().
AxMeT
> А вот про то что имел ввиду, может так понятнее будет. Код условный:
Ты хочешь два буфера объединить в один как я понял... Как? ABABABAB... или же AAAAABBBBB? Второй вариант тут был бы предпочтительнее, если уж хочется в один буфер запихать... Можно конечно и первым сделать, но расстояние между вершинами слишком большое будет, смысла не вижу так делать...
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.
В дополнение к текущим биндингам сохраняются и новые.
KpeHDeJIb
> Это самый обычный GL_INVALID_OPERATION, что-то было сделано не так.
А в какую сторону смотреть? Что искать?
KpeHDeJIb
>В дополнение к текущим биндингам сохраняются и новые.
Что значит "текущие биндинги"?
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 и т.п.
Тема в архиве.