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

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

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

【问题讨论】:

    标签: opengl opengl-es


    【解决方案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使用,不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2013-08-05
    • 2019-11-13
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多