如果我需要更改VBO,是否需要重建我的VAO?

5
我正在构建或修改一个缓冲区,然后将其提供给glBufferData来渲染场景。我的理解是顶点数组对象允许我跳过手动绑定所有使用的VBO。即使我一直更新缓冲区,这仍然适用吗?
我能够绑定我的VAO,调用glBufferData 来更新顶点和索引(目前只有这两个VBO),然后进行渲染吗?
我可以在VBO上使用内存映射吗?那么我就可以绑定VAO,修改缓冲区,然后进行渲染了?
VAO到底是做什么的?它的功能只是存储和自动绑定顶点属性到我的VBO吗?它接管数据或绑定吗?
1个回答

3
您可能需要测试一下,但据我了解,在生成VBO时会给它们分配ID,而VAO只引用每个顶点属性以及它使用的VBO ID。您应该能够调用glBufferDataglBufferSubData。我不确定在绘制调用之前刚好进行内存映射是否有效,但您可以在绑定VAO和绘制之间执行某些操作。VAO不锁定VBO或限制对其的访问。
通常情况下,VAO仅存储属性及其所有设置(绑定的VBO、步幅、偏移量等),并在绑定时自动绑定属性。在调用glBindVertexArray(0);之前,所有顶点属性都与绑定的VAO相关联。

那么VAO不会影响我绑定的VBO吗?我需要先绑定它们并调用glBufferData - Steven Lu
考虑到大多数绘制的顶点布局都是相同的,我认为你必须为每个VBO存储不同的顶点属性集合非常荒谬。我花了一段时间试图避免这种情况,但没有任何进展。 - Zebrafish
@TitoneMaurice 占用的空间应该尽可能地小(大约是字节级别),绑定不同属性的额外GL调用不应该成为瓶颈。你需要的最接近的东西是实例化,我认为其他任何东西都是不必要/过早的优化。 - Robert Rouhani
1
@Robert Rouhani 嗯,我只是想说,你是对的。只是很难相信,因为它们几乎从不改变,顶点布局不是一些全局状态或者它们可以绑定到VBO。我做错了什么吗?因为每次绑定另一个VBO时,我都需要调用glVertexAttribPointer和glEnableVertexAttribArray。我认为这是因为顶点布局绑定到VAO上,当绑定VBO时会发生变化。在这种情况下,我不知道是否最好为每个VBO拥有一个VAO。 - Zebrafish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接