OpenGL Wiki: спецификация вершин говорится, что:
Замечания:
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(...);
Это означает, что при повторном связывании VAO
GL_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
является хранится в ВАО
Ниже в той же записи вики вы также можете увидеть объяснение — 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.
…