Version: Unity 6.0 (6000.0)
语言 : 中文
为 BatchRendererGroup API 编写自定义着色器
在 URP 中的自定义着色器中支持 DOTS 实例化

URP 中的 DOTS 实例化着色器

为高效渲染大型实例技术,BRG 使用一种新的着色器实例化模式,称为 DOTS 实例化。BRG 使用的每个着色器都必须支持 DOTS 实例化。在传统实例化着色器中,常量或均匀缓冲区内用于每个实例化属性的数组将传递给着色器,因此每个数组中的每个元素都包含绘制中单个实例的属性值。在 DOTS 实例化着色器中,Unity 会将一个 32 位整数传递给着色器,用于 DOTS 实例化属性。这个 32 位整数称为元数据值。该整数可以表示所需的任何内容,但通常表示缓冲区中的偏移,着色器从该缓冲区加载属性数据,用于着色器正在渲染的实例。

与传统实例化相比,DOTS 实例化有许多优点,包括:

  • 实例数据存储在 GraphicsBuffer 中,并在 GPU 上持久存在,这表示 Unity 无需在每次渲染实例时再次设置该数据。仅在实例发生实际更改时设置数据,这样可以在实例数据更改很少或未更改的情况下显著提高性能。与传统实例化相比,此方法更为高效;传统实例化需要引擎在每一帧中为每个实例设置所有数据。
  • 设置实例数据与设置绘制调用的过程是彼此独立的。这样绘制调用设置会更加简便且高效。BRG 通过 SRP Batcher 的一条特殊快速路径实现了这一操作。对于每次绘制调用,该路径仅执行最低量工作。此工作的责任将转移给用户,让用户可以更好地控制在每个绘制调用中进行渲染的内容。
  • 绘制调用的大小不再受常量或均匀缓冲区中可以容纳的实例数据数量的限制。因此 BRG 可以通过一次绘制调用来渲染更多实例计数。
    注意:实例索引的数量仍然会限制绘制调用大小,因为每个索引仍然需要一些数据。但是,索引比一整套实例化属性消耗的内存要少得多,这表示可以在常量或均匀缓冲区中容纳更多实例。例如,每个索引需要 16 个字节,因此如果特定平台上的缓冲区内存限制为 64kb,则缓冲区中可容纳 4096 个索引。
  • 如果每个实例都为给定属性使用相同的值,则可以让所有实例从内存中的相同位置加载该值。这样可以节省内存以及复制每个实例的值所用的 GPU 周期。
为 BatchRendererGroup API 编写自定义着色器
在 URP 中的自定义着色器中支持 DOTS 实例化