OpenGL: путаница VAO / VBO

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(...);

1

Решение

Это означает, что при повторном связывании 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 является хранится в ВАО

5

Другие решения

Ниже в той же записи вики вы также можете увидеть объяснение — 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​.

1

По вопросам рекламы [email protected]