每个 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章