组织VBO并优化调用glDrawArrays()函数

3
我正在尝试弄清楚OpenGL中不同技术的优缺点。我阅读的教程表明,在渲染大量VBO时会有性能问题,我推断可以采用将多个物体存储到一个单独的VBO中的方法。
是否有任何好的经验法则来组织和渲染数据?对于现代视频游戏(例如“现代战争”),如果我在观看具有天空背景、几个静态建筑、许多碎片和10个NPC的场景,他们创建了多少个VBO,以及您认为他们在执行多少次glDrawArrays()调用?
1个回答

3

绘制调用并不是最耗费性能的东西;我认为每帧100到1000个绘制调用是很常见的。

性能方面的重要事项是减少状态更改。我记得程序更改 > 纹理更改 > 缓冲区更改。按顺序排序您的绘制调用,以尽可能少地切换这些内容。

对于性能来说,使用一个大的VBO而不是几个较小的VBO可能会有益处,但这可能不是我尝试的第一件事情。


VAO在这些成本层次结构中的位置是哪里? 我想它就像切换缓冲区一样,因为这基本上就是它所做的。 - Niriel
我听说切换VAOs的速度比仅使用一个VAO并根据需要重新绑定缓冲区要慢一些。但这可能是旧闻了。 - Kos
你知道有哪些资源可以讨论关于VBO的数据组织吗?例如,如果我正在制作一个象棋游戏,我可能会创建7个VBO:一个用于棋盘网格,一个用于兵,一个用于象,一个用于车,一个用于马,一个用于后和一个用于王。或者我可能会创建33个VBO来容纳每个棋子以及整个棋盘。(或者只创建1个VBO来容纳所有内容。)除了一些指南大致说明“VBO优于客户端数据”之外,我没有找到任何关于这方面的资料。是否有任何关于此主题的教程或示例? - Literata
VBOs只是分配的内存块,可以将glBufferData视为malloc+memcpy。这里的问题是“如何在GPU内存中排列我的数据”,包括“是否交错属性”。请参考OpenGL wiki:顶点规范最佳实践获取更多详细信息。 - Kos

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