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

URP 中的 DOTS 实例化着色器

为了有效地渲染大型实例计数,BRG 使用新的着色器在 GPU 上运行的程序。更多信息
请参阅术语表
实例化模式,称为 DOTS 实例化。BRG使用的每个着色器都必须支持DOTS实例化。在传统的实例化着色器中,着色器会为常量或统一缓冲区中的每个实例化属性传递一个数组,以便每个数组中的每个元素都包含绘制中单个实例的属性值。在 DOTS 实例化着色器中,Unity 会为每个 DOTS 实例化属性向着色器传递一个 32 位整数。这个 32 位整数称为元数据值。此整数可以表示所需的任何内容,但通常它表示着色器从缓冲区加载着色器正在呈现的实例的属性数据的偏移量。

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

  • 实例数据存储在 GraphicsBuffer 中,并在 GPU 上保持持久,这意味着 Unity 无需在每次渲染实例时重新设置它。仅在实例实际更改时设置数据可以在实例数据很少更改或根本不更改的情况下显着提高性能。这比传统的实例化要高效得多,传统的实例化需要引擎在每一帧中为每个实例设置所有数据。
  • 设置实例数据的过程与设置绘制调用的过程是分开的。这使得绘制调用设置变得轻量级且高效。BRG 通过 SRP Batcher 的特殊快速路径使这成为可能,该路径仅为每次绘制调用执行最少的工作量。这项工作的责任转移到你身上,让你更好地控制在每个绘制调用中渲染的内容。
  • 绘制调用的大小不再受常量或统一缓冲区中可以容纳多少实例数据的限制。这使得 BRG 可以通过单个绘制调用呈现更大的实例计数。
    注意:实例索引的数量仍然限制了绘制调用的大小,因为每个索引仍然需要一些数据。但是,索引消耗的内存远少于一整套实例化属性,这意味着更多的实例可以容纳在常量或统一缓冲区中。例如,每个索引需要 16 个再见,因此,如果特定平台上缓冲区的内存限制为 64kb,则缓冲区中可以容纳 4096 个索引。
  • 如果每个实例对给定属性使用相同的值,则可以让所有实例从内存中的同一位置加载该值。这可以节省内存和复制每个实例值所花费的 GPU 周期数。
为 BatchRendererGroup API 编写自定义着色器
在URP的自定义着色器中支持DOTS实例化