2014-01-03 7 views
1

В OpenGL Wiki: Vertex Specification говорится, что:OpenGL: ВАО/ВБО путаница

Примечание:GL_ARRAY_BUFFER связывание НЕ части состояния Вао в! Я знаю, что это сбивает с толку, но так оно и есть.

Ниже приведен пример использования VAO, который, как представляется, работает по назначению. Что здесь не так? Мое понимание OpenGL (или OpenGL Wiki), моего драйвера OpenGL (OSX 10.9) или OpenGL Wiki?

// ------ Pseudo-code ------ 
// setup 
[...] 
glBindVertexArray(vertexArrayObjectIdx1); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId1); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBufferId1); 
for each vertex attribute 
    glEnableVertexAttribArray(...); 
    glVertexAttribPointer(...); 

glBindVertexArray(vertexArrayObjectIdx2); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId2); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBufferId2); 
for each vertex attribute 
    glEnableVertexAttribArray(...); 
    glVertexAttribPointer(...); 

// rendering 
[...] 
glBindVertexArray(vertexArrayObjectIdx1); 
glDrawElements(...); 
glBindVertexArray(vertexArrayObjectIdx2); 
glDrawElements(...); 

ответ

5

Это означает, что когда вы пересвязать VAOGL_ARRAY_BUFFER не получает отскок

Однако glVertexAttribPointer связывает (затем) связанный GL_ARRAY_BUFFER с правильным атрибутом в VAO, поэтому он работает так, как вы хотите.

На самом деле они могли бы определить glVertexAttribPointer как:

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

и устранить его зависимость от связанного GL_ARRAY_BUFFER. Но задним числом и всем этим ...

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

в отличие от этого GL_ELEMENT_ARRAY_BUFFERявляется хранится в ВАО

+1

Существует на самом деле версия 'glVertexAttribPointer (...)' примерно с этой подписью. Но вы должны использовать расширение [Direct State Access] (http://www.opengl.org/registry/specs/EXT/direct_state_access.txt) (которое в основном исключает реализацию Apple, Intel и Mesa и оставляет только AMD и NV). *** *** *** неловко обернуть вокруг вас сначала (в основном из-за имени функции), но этот уродливый беспорядок функции: 'glVertexArrayVertexAttribOffsetEXT (...)' позволит вам установить указатель на Данные VBO хранятся в VAO по определенному индексу без привязки к VBO или VAO. –

+0

Тем не менее, они действительно не могли бы определить 'glVertexAttribPointer (...)' таким образом, потому что эта функция была введена OpenGL с расширением программы ARB Vertex. И ARBVP1 может быть реализован в отсутствие Vertex Buffer Objects (довоенные VBO ARBVP1 на 2-3 года). –

+0

@ AndonM.Coleman не отрицает, что если бы они могли перепроектировать с нуля, они бы ослабили зависимость от глобального состояния так много. –

1

вниз ниже в той же записи вики, вы можете увидеть объяснение, а также - This is also why GL_ARRAY_BUFFER​ is not VAO state; the actual association between an attribute index and a buffer is made by glVertexAttribPointer​. ...