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