版本:Unity 6 (6000.0)
语言:英语
在 URP 中的自定义着色器中支持 DOTS 实例化
在自定义着色器中访问 DOTS 实例化属性

在 URP 中,在自定义着色器中声明 DOTS 实例化属性

为加载实例数据(如转换矩阵),着色器运行在 GPU 上的程序。 更多信息
词汇表 中查看
需要定义 DOTS 实例化属性。以下是简单 DOTS 实例化属性块的一个示例

UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
    UNITY_DOTS_INSTANCED_PROP(float4, Color)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)

为标记属性块的起始位置和结束位置,使用 UNITY_DOTS_INSTANCING_STARTUNITY_DOTS_INSTANCING_END 宏,后跟该块的名称。该示例使用 MaterialPropertyMetadata 名称。共有三个允许的块名称

  • BuiltinPropertyMetadata
  • MaterialPropertyMetadata
  • UserPropertyMetadata

着色器可以为每种名称声明一个,所以一个 DOTS 实例化着色器可以有零到三个此类块。Unity 定义的着色器代码不使用 UserPropertyMetadata,所以你可以自由使用这个名称。URP 和 HDRP 会为它们提供的每个着色器定义 BuiltinPropertyMetadata,同时也会为它们中的大多数着色器定义 MaterialPropertyMetadata,所以最佳做法是使用 UserPropertyMetadata。你的自定义着色器可以使用所有三种可能的名称,甚至可以同时使用。

该块可包含格式为 PropertyType PropertyName 的任意数量的 DOTS 实例化属性定义

UNITY_DOTS_INSTANCED_PROP(PropertyType, PropertyName)

PropertyType 可以是任何 HLSL 内置类型(如 uint、float4、float4x4 或 int2x4),除了布尔矢量之外,而 PropertyName 是 DOTS 实例化属性的名称。DOTS 实例化属性与 常规材质属性 完全分开,你可以为它们指定与另一个常规材质属性相同的名称。这是可能的,因为 UNITY_DOTS_INSTANCED_PROP 宏生成 Unity 识别的特殊常量名称,并且这些名称不会与其他属性名称冲突。Unity 提供的着色器会为 DOTS 实例化属性指定与常规材质属性相同的名称,但是你不必遵循此约定。

在内部,Unity 为着色器提供一个 32 位整数元数据值,用于着色器声明的每一个 DOTS 实例化属性。当你的代码执行 BatchRendererGroup.AddBatch 调用以创建与绘制关联的批处理时,Unity 会设置元数据值。如果 Unity 未设置元数据值,则其默认值为 0。着色器还可以访问 ByteAddressBuffer unity_DOTSInstanceData,Unity 会将其设置为作为参数传递给 BatchRendererGroup.AddBatch 的 GraphicsBuffer。该缓冲区通常是着色器加载实例数据的地方。多个批处理可以共享一个 GraphicsBuffer,但也可以让每个批处理使用自己独立的 GraphicsBuffer 来处理 unity_DOTSInstanceData

注意:Unity 不会自动提供任何 DOTS 实例化数据。你有责任确保每个批处理的 unity_DOTSInstanceData 缓冲区包含正确的数据。实例数据必须包括 Unity 通常为 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、镜头、路径点等。游戏对象的功能由其附带的组件定义。 更多信息
请参见 术语表
提供的诸多属性,例如变换矩阵、光照探针光照探针存储有关光线如何在场景中通过空间的信息。在给定的空间内排列的一系列光照探针可以改善移动对象和该空间中的静态 LOD 场景中的光照。 更多信息
请参见 术语表
系数以及 光照贴图包含场景中静态对象的光源效果的预渲染纹理。将光照贴图叠加到场景几何体之上,以创建光照效果。 更多信息
请参见 术语表
纹理坐标。

在 URP 中的自定义着色器中支持 DOTS 实例化
在自定义着色器中访问 DOTS 实例化属性