OpenGL:VAO/VBO混乱

Mor*_*bel 1 c++ opengl vbo vao

OpenGL的维基:顶点规格指出:

注:GL_ARRAY_BUFFER绑定是不是该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(...);
Run Code Online (Sandbox Code Playgroud)

rat*_*eak 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?);
Run Code Online (Sandbox Code Playgroud)

并消除它对边界的依赖GL_ARRAY_BUFFER.但事后才知道......

重要的是要记住,GL_ARRAY_BUFFER绘制并不重要,但顶点属性的界限是如此.

相反,GL_ELEMENT_ARRAY_BUFFER 存储在VAO中