OpenGL Wiki:顶点规范指出:
注:
GL_ARRAY_BUFFER绑定是而不是的状态的一部分!我知道这很让人困惑,但事情就是这样。
下面是我如何使用VAO,这似乎是按照预期的工作。这里怎么了?我对OpenGL (或OpenGL Wiki)、我的OpenGL驱动程序(OSX10.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(...);发布于 2014-01-03 15:47:32
这意味着当您重新绑定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中。
发布于 2014-01-03 15:42:06
在下面同样的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. .
https://stackoverflow.com/questions/20906957
复制相似问题