glEnableClientState с современным OpenGL (glVertexAttribPointer и т. д.) - PullRequest
10 голосов
/ 18 декабря 2011

Я хотел бы изложить некоторые вещи, которые, как мне кажется, я выучил, но не уверен насчет:

  • VBO - это путь.Они созданы с glGenBuffers и glBufferData.
  • . Для максимальной гибкости лучше всего передавать общие атрибуты вершин шейдерам с glVertexAttribPointer, а не glVertex, glNormal и т. Д.
  • glDrawElements можно использовать с буферами вершин и индексным буфером для эффективной визуализации геометрии с множеством общих вершин, таких как сетка ландшафта.

При условии, что все это правильнопока вот мой вопрос.Все руководства, которые я читал о современном OpenGL, полностью опущены glEnableClientState.Но справочные страницы OpenGL говорят, что без glEnableClientState, glDrawElements ничего не будет делать:

http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

Ключевой отрывок: «Если GL_VERTEX_ARRAY не включен, то геометрическийПримитивы созданы. "

Это приводит меня к следующим вопросам:

  • Ни в одном из руководств не используется glEnableClientState перед вызовом glDrawElements.Означает ли это, что справочная страница неверна или устарела?
  • GL_VERTEX_ARRAY может показаться тем, что вы активируете, если собираетесь использовать glVertexPointer, а также вы используете GL_NORMAL_ARRAY с glNormalPointer и т. Д.Но если я не использую эти функции, а вместо этого использую общие атрибуты вершин с glVertexAttribPointer, то почему необходимо включить GL_VERTEX_ARRAY?

Ответы [ 3 ]

20 голосов
/ 18 декабря 2011

Если GL_VERTEX_ARRAY не включен, геометрические примитивы не создаются.

Это потому, что справочная страница неверна . Страница руководства охватывает GL 2.1 (и это все еще неправильно), и по какой-то причине люди, обновляющие страницу руководства, отказываются обновлять более старые версии GL для исправления ошибок.

В GL 2.1 вы должны использовать общий индекс атрибута 0 или GL_VERTEX_ARRAY. В GL 3.1+ вам не нужно использовать какие-либо конкретные индексы атрибутов.

Это связано с тем, что в версиях GL до 3.1 все функции рендеринга массива были определены в терминах вызовов glArrayElement, в которых использовался немедленный рендеринг на основе режима. Это означает, что вам нужно что-то, чтобы спровоцировать вершину. Напомним, что в непосредственном режиме вызов glVertex*() не только устанавливает положение вершины, но также вызывает отправку вершины с другими атрибутами. Вызов glVertexAttrib*(0, ...) делает то же самое. Вот почему в старых версиях требуется использовать атрибут 0 или GL_VERTEX_ARRAY.

В GL 3.1+, как только они вышли из немедленного режима, им пришлось по-разному определять рендеринг массива. И поэтому им не нужно было ограничивать себя использованием атрибута 0.

Если вы хотите, чтобы документы API для ядра GL 3.3 работали, я предлагаю вам взглянуть на фактические документы API для ядра GL 3.3 . Хотя, если честно, я бы просто посмотрел спецификации, если вам нужна точная информация. В этих документах много дезинформации. И поскольку они на самом деле не являются вики-страницами, эта информация никогда не исправляется.

2 голосов
/ 18 декабря 2011

Ваши первые 3 балла верны. И чтобы ответить на последнюю половину вашего вопроса, не используйте glEnableClientState для современного OpenGL. Начните кодировать!

1 голос
/ 18 декабря 2011

VBOS - это путь.Они созданы с помощью glGenBuffers и glBufferData.

VBO часто используются в высокопроизводительных приложениях.Вы могли бы хотеть сделать что-то более простое сначала.Вершинные массивы могут быть хорошим способом быстро начать работу.Поскольку VBO в любом случае располагаются поверх массивов вершин, при переключении на VBO вы будете использовать большую часть того же кода, и может быть целесообразно сначала выполнить тест с использованием массивов вершин или индексированных массивов.

Для максимальной гибкости лучше передавать общие атрибуты вершин шейдерам с помощью glVertexAttribPointer, а не glVertex, glNormal и т. Д.

Это хороший подход.

glDrawElements может использоваться с буферами вершин и индексным буфером для эффективной визуализации геометрии с множеством общих вершин, таких как ландшафтная сетка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...