每个 VBO 都需要一个 VAO 吗?

Posted

技术标签:

【中文标题】每个 VBO 都需要一个 VAO 吗?【英文标题】:Do you need a VAO for each VBO? 【发布时间】:2013-07-11 15:12:52 【问题描述】:

目前,我有一个 RenderObject 类的集合,其中包含一个纹理、一个 VAO 和一个 VBO。由于所有状态切换和使用少量三角形调用glDrawArrays,绘制数千个此类对象会导致性能损失。

所以现在我要更改我的实现,以便创建一系列 1MiB VBO(从一个开始,一旦它满了,创建第二个 1MiB VBO 并继续填充它)。每个 VBO 是否需要单独的 VAO? VBO 已经使用交错的顶点数据,所以我不是在谈论对顶点、法线、纹理坐标等使用多个 VBO。

【问题讨论】:

【参考方案1】:

我认为可能有些混乱。顶点属性是指您可以通过单个顶点传入的每个顶点元素的数量(法线是一个,UV 是另一个,等等)。在您的实施中,这仅限于 16 个,您很可能不会超过。

VAO 存储发出单个绘图调用所需的状态信息。这包括存储需要为该呼叫绑定哪些 VBO。鉴于每个 VBO 必须在其自己的单独绘制调用中绘制,我还认为您需要一个 VAO 来存储每个 VBO 的设置信息。

这里有一个很好的解释:

http://ogldev.atspace.co.uk/www/tutorial32/tutorial32.html

【讨论】:

@MarkIngram 为了其他读者,我会将其保留在问题中。 我几乎 100% 认为 VAO 不绑定 VBO 绑定点 (ARRAY_BUFFER_BINDING),如果您查看 3.3 核心规范 pdf 中的 VAO 状态表页面,它在下一个 pp“不属于 VAO 状态”。另外,twitter.com/id_aa_carmack/status/409495250646753280 检查opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf,检查第 281 和 282 页。我认为您链接的教程之所以有效,是因为它提供了一直重复使用的元素数组缓冲区,或者因为元素数组缓冲区保留了哪个 VBO使用,不确定。

以上是关于每个 VBO 都需要一个 VAO 吗?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 大项目、VAO-s 等

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

glUseProgram 会改变 VAO 和/或 VBO 状态吗?

OpenGL:一个 VBO 的多个 VAO

在绑定到一个 vao 的 vbo 之间切换

渲染一个包含两个 VBO 的 VAO