不同的 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);
假设vbo1
和vbo2
在这些代码之前定义并且他们已经得到glBufferData
。 vao1
和 vao2
可以有相同的顶点属性索引号 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 可以使用之前使用的顶点属性索引号吗的主要内容,如果未能解决你的问题,请参考以下文章