OpenGL Wiki: Vertex Specification表示:
注意:
GL_ARRAY_BUFFER
绑定是 NOT VAO状态的一部分!我知道这很令人困惑,但事实就是如此。
以下是我如何使用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(...);
答案 0 :(得分:5)
这意味着当您重新绑定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
存储在VAO中
答案 1 :(得分:1)
在同一个Wiki条目的下方,您也可以看到解释 - 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.
...