不同的 VAO 可以使用之前使用的顶点属性索引号吗

Posted

技术标签:

【中文标题】不同的 VAO 可以使用之前使用的顶点属性索引号吗【英文标题】:Can a different VAO use the previous used vertex attribute index number 【发布时间】:2016-12-04 01:44:01 【问题描述】:

两个VAO(va01, vao2)可以有相同的顶点属性索引号吗?

GLuint vao1, vao2;

glGenVertexArrays(1, &vao1); 
glGenVertexArrays(1, &vao2); 


glBindVertexArray(vao1);
...
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
...
glBindVertexArray(0);



glBindVertexArray(vao2);
...
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
...
glBindVertexArray(0);

假设vbo1vbo2在这些代码之前定义并且他们已经得到glBufferDatavao1vao2 可以有相同的顶点属性索引号 0 吗?

【问题讨论】:

【参考方案1】:

是的,多个 VAO 可以设置相同的顶点属性,分别指向不同的 VBO。

假设在这些代码之前定义了 vbo1 和 vbo2,并且它们已经获得了 glBufferData。 vao1和vao2可以有相同的顶点属性索引号0吗?

你在这里混淆了一些东西。 VAO 从不关心BufferData。 VAO 存储属性指针、属性启用和GL_ELEMENT_ARRAY_BUFFER_BINDING。他们确实存储任何顶点数据,他们只引用它。他们确实通过名称引用了 VBO - 这意味着您可以这样做:

glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glVertexAttribPointer(i, ...); // here, a reference to vbo1 gets part of the attrib pointer for attrib i 
...
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(...); // VAO will now point into this buffer storage 

(这也意味着您可以在为 VBO 创建缓冲区存储之前设置指针,您只需要创建 VBO 对象即可)。也许你觉得我在this answer 中的插图很有帮助。

【讨论】:

以上是关于不同的 VAO 可以使用之前使用的顶点属性索引号吗的主要内容,如果未能解决你的问题,请参考以下文章

没有 VAO 的每个着色器属性的 VBO 或不同的方法?

初识OpenGL (-)VAO顶点数组对象

初识OpenGL (-)VAO顶点数组对象

初识OpenGL (-)VAO顶点数组对象

将纹理连接到 VAO 是不是有意义?

在两个不同的顶点数组对象中使用顶点缓冲区