OpenGL:VAO / VBO混乱

时间:2014-01-03 15:24:08

标签: c++ opengl vbo vao

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

2 个答案:

答案 0 :(得分: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 存储在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​. ...