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

Can a different VAO use the previous used vertex attribute index number

两个 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 是在这些代码之前定义的,并且它们已经 glBufferData 了。 vao1vao2 可以有相同的顶点属性索引号 0 吗?

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

Suppose vbo1 and vbo2are defined before these code and they got glBufferDataalready. Can vao1 and vao2 both have the same vertex attribute index number 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对象即可)。也许你觉得我在 中的插图很有帮助。