为 BatchRendererGroup API 编写自定义着色器
在 URP 的自定义着色器中支持 DOTS 实例化
URP 中的 DOTS 实例化着色器
为了高效地渲染大量实例计数,BRG 使用了一种名为 DOTS 实例化的新的着色器在 GPU 上运行的程序。 更多信息
参见 术语表实例化模式。BRG 使用的每个着色器都必须支持 DOTS 实例化。在传统的实例化着色器中,着色器为常量或统一缓冲区中的每个实例化属性传递一个数组,使得每个数组中的每个元素都包含绘制中单个实例的属性值。在 DOTS 实例化着色器中,Unity 为每个 DOTS 实例化属性向着色器传递一个 32 位整数。这个 32 位整数称为元数据值。这个整数可以表示任何你想要的东西,但通常它表示缓冲区中的一个偏移量,从该偏移量开始,着色器加载着色器正在渲染的实例的属性数据。
与传统的实例化相比,DOTS 实例化具有许多优势,包括以下几点
- 实例数据存储在 GraphicsBuffer 中,并在 GPU 上保持持久,这意味着 Unity 不需要在每次渲染实例时都重新设置它。仅在实例实际更改时设置数据可以在实例数据很少或根本不更改的情况下显着提高性能。这比传统的实例化效率更高,传统的实例化需要引擎在每一帧为每个实例设置所有数据。
- 设置实例数据的过程与设置绘制调用是分开的。这使得绘制调用的设置变得轻量级且高效。BRG 通过 SRP Batcher 的特殊快速路径实现了这一点,该路径仅对每个绘制调用执行最少的工作量。这项工作由您负责,并让您更好地控制每个绘制调用中要渲染的内容。
- 绘制调用的大小不再受常量或统一缓冲区中可以容纳多少实例数据限制。这使得 BRG 可以使用单个绘制调用渲染更大的实例计数。
注意:实例索引的数量仍然限制了绘制调用的大小,因为每个索引仍然需要一些数据。但是,索引消耗的内存远少于完整的一组实例化属性,这意味着更多实例可以放入常量或统一缓冲区中。例如,每个索引需要 16 个字节,因此如果特定平台上缓冲区的内存限制为 64kb,则 4096 个索引可以放入缓冲区中。
- 如果每个实例对给定属性使用相同的值,则可以使所有实例从内存中的相同位置加载该值。这节省了内存和复制每个实例值的 GPU 周期数。
为 BatchRendererGroup API 编写自定义着色器
在 URP 的自定义着色器中支持 DOTS 实例化