首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL: VAO/VBO混淆

OpenGL: VAO/VBO混淆
EN

Stack Overflow用户
提问于 2014-01-03 15:24:07
回答 2查看 1.6K关注 0票数 1

OpenGL Wiki:顶点规范指出:

注: GL_ARRAY_BUFFER​绑定是而不是的状态的一部分!我知道这很让人困惑,但事情就是这样。

下面是我如何使用VAO,这似乎是按照预期的工作。这里怎么了?我对OpenGL (或OpenGL Wiki)、我的OpenGL驱动程序(OSX10.9)或OpenGL Wiki的理解?

代码语言:javascript
复制
// ------ 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(...);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-03 15:47:32

这意味着当您重新绑定VAO时,GL_ARRAY_BUFFER不会反弹。

但是,glVertexAttribPointer确实将绑定的GL_ARRAY_BUFFER绑定到VAO中的正确属性,因此它确实按照您的要求工作。

实际上,他们可以将glVertexAttribPointer定义为:

代码语言:javascript
复制
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中。

票数 6
EN

Stack Overflow用户

发布于 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​. .

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20906957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档