我需要渲染非常密集的网格。顶点数据是完全静态的。显然大的VBO对性能不是很好(来源:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices#Size_of_a_VBO.2FIBO,虽然不幸的是它无法链接到它自己的源。)即使大缓冲区的性能良好,我的顶点数据的总大小有时会超过我的可以使用glBufferData()成功分配。
因此,假设我需要将我的网格划分为每个几MB的较小的VBO,建议使用以下哪种方法:
1)在启动时分配足够的缓冲区以保存所有网格数据。然后渲染就像一次绑定每个缓冲区并调用glDrawArrays()。
一样简单2)在启动时分配一小块固定缓冲池。渲染需要用一块三角形填充缓冲区,调用glDrawArrays(),用下一个块填充另一个缓冲区,再次调用glDrawArrays(),依此类推。因此可能会有更多的CPU工作。
3)我没想到的其他一些方法。
我的部分问题归结为如何使用VBO进行内存分配 - 如果我在启动时分配足够的小缓冲区来保存所有网格数据,我是否会遇到阻止我分配的相同内存限制单个缓冲区大到足以容纳所有数据?或者VBO是否与虚拟内存集成,以便OpenGL在超出可用图形内存时处理VBO?
最后,这实际上有多少依赖于实现?是否有来自AMD / Intel / NVidia的有用参考资料解释缓冲管理的最佳实践?
答案 0 :(得分:0)
我建议你继续分配尽可能少的静态缓冲区和尽可能多的顶点。如果性能开始受损,则需要缩小模型的质量级别(即顶点数量)。
实际上,使用太多的SMALL缓冲区对性能不利,因为每个渲染都涉及一定量的固定开销。单个缓冲区中的顶点越多(在合理范围内),初始设置需要的次数就越少。
大型(如非常大)VBO可能不太好的原因是因为视频卡具有有限的性能功率/内存容量,并且在系统RAM之间来回交换大量内存和视频RAM可能是密集的...不是因为另一种机制更适合渲染非常大的模型。我无法想象为什么你在glBufferData()
失败,除非你的要求非常巨大(远大于256 MB),或者你可能使用USHORT数据类型作为索引,但分配的数量超过65000。
1MB - 4MB的建议与优化模型的方式有关,并且在某种程度上取决于您正在使用的视频卡的生成。大多数视频卡都支持巨大的VBO。我打赌你的问题在其他地方。