我有一个模拟程序,我想在动画中(比如说 500 个时间步长)或交互方式(改变一个对象意味着在最坏的情况下重新计算所有其他对象)渲染大约 500 - 1000 个对象(相当小,最多 50 个三角形)。
这种渲染任务的最佳方法是什么?
我在考虑 VBO 并使用glBufferSubData
它来更新每个时间步的对象。还是有其他方法?
另外,由于大约有 20 种类型的对象,我应该使用 20 种不同的 VBO,以便我可以相应地设置属性吗?
我有一个模拟程序,我想在动画中(比如说 500 个时间步长)或交互方式(改变一个对象意味着在最坏的情况下重新计算所有其他对象)渲染大约 500 - 1000 个对象(相当小,最多 50 个三角形)。
这种渲染任务的最佳方法是什么?
我在考虑 VBO 并使用glBufferSubData
它来更新每个时间步的对象。还是有其他方法?
另外,由于大约有 20 种类型的对象,我应该使用 20 种不同的 VBO,以便我可以相应地设置属性吗?
如果您正在制作关键帧动画(每帧一组顶点),则要么将它们全部上传为单独的 VBO 并更改您绑定的那个,要么将它们全部上传到单个 VBO 并更改属性。我怀疑这两种解决方案之间会有很大的性能差异。
我会避免glBufferSubData
,因为 OpenGL 应该能够为您管理所有内存。如果这是一组大得多的数据,我建议您使用这种方法,因为您可以从磁盘流式传输所需的顶点,以避免一次将其全部存储在内存中,但是对于少量数据,这不是问题。
如果您正在制作基于骨骼的动画,则该glBufferSubData
方法基本上是在 CPU 上进行蒙皮的唯一方法。进行蒙皮(在 GPU 上)的顶点着色器将比 CPU 蒙皮执行得更好,只需将帧存储在mat3x4
统一中即可。
对于如此少量的对象,您可能应该选择最简单的方法来执行此操作,并且仅在您确实需要时才进行优化...
简单,我的意思是概念上对你来说最简单。
如果您愿意,您可以使用具有不同偏移量的单个 VBO 对象,无需使用多个。