在GPU限制的应用程序中渲染实例化几何体时是否存在任何性能增益?或者是关于绘制电话的全部?
将所有对象烘焙到单个VBO并使用单个绘制调用渲染它们会更好吗?假设所有对象都是静态的,顶点内存就足够了。
答案 0 :(得分:5)
如果实例模型足够小,完全适合GPU的T& L前缓存,那么它可以提升GPU的性能。但除非是这种情况,否则GPU将不得不为每个实例读取相同的网格数据。因此,重复200次的1个实例将具有与200个单独网格相同的带宽成本。
将所有对象烘焙到单个VBO并使用单个绘制调用渲染它们不是更好吗?
没有。仅仅因为它不一定能让你获得GPU性能,这并不意味着你应该放弃整个事情。如果实例化适合你,那么你必须渲染相同的网格物体。因此,“烘焙所有对象”将重复相同的网格数据。适用于您打算绘制的每个实例。即使你不保存任何读取时间带宽,它仍然在内存中浪费很多。
不要忽视记忆的重要性。浪费内存可能会导致运行时性能问题,因为它会强制纹理退出GPU内存并导致颠簸。
另外,它的灵活性较低。在一帧上,您可能只渲染128个实例。另一方面,您可能需要156.另一方面,您可能只需要5.按照自己的方式,您必须保留足够的缓冲存储空间以呈现最大数量的实例。实际的实例......你不在乎。
这甚至不涉及如何获取每个实例的数据。通过实例化,您可以use gl_InstanceID
从某些UBO / SSBO /纹理数组中读取,或者使用instanced arrays,以便在每个实例的基础上填充顶点属性。
您可以在“烘焙所有对象”中使用额外的整数属性模拟gl_InstanceID
,但现在您已经使每个顶点变大了4个字节。模拟实例化数组是一个非首发,因为这会在内存中浪费很多。