Version: 6000.3
语言: 中文
在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. 允许使用三个块名称:

  • 内置属性元数据
  • 材质属性元数据
  • 用户属性元数据

着色器可以声明每个着色器中的一个,因此 DOTS 实例化着色器可以有 0 到 3 个此类块。Unity 定义的着色器代码不使用 UserPropertyMetadata,因此保证此名称可供您免费使用。URP 和 HDRP 为它们提供的每个着色器定义 BuiltinPropertyMetadata,并为其中大多数着色器定义 MaterialPropertyMetadata,因此最佳实践是使用 UserPropertyMetadata。您的自定义着色器可以同时使用所有三个可能的名称。

该块可以包含任意数量的 DOTS 实例化属性定义,格式如下:

UNITY_DOTS_INSTANCED_PROP(PropertyType, PropertyName)

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

在内部,Unity 为着色器声明的每个 DOTS 实例属性为着色器提供 32 位整数元数据值。当您的代码调用 BatchRendererGroup.AddBatch 以创建与绘制关联的批处理时,Unity 会设置元数据值。元数据值默认为0如果 Unity 未设置它。着色器还可以访问ByteAddressBuffer unity_DOTSInstanceDataUnity 设置为您作为参数传递给的 GraphicsBufferBatchRendererGroup.AddBatch. 此缓冲区通常是着色器从中加载实例数据的位置。多个批处理可以共享单个 GraphicsBuffer,但每个批处理也可以使用自己单独的 GraphicsBufferunity_DOTSInstanceData.

注意:Unity 不会自动提供任何 DOTS 实例化数据。您有责任确保unity_DOTSInstanceDatabuffer 包含正确的数据。实例数据必须包含 Unity 通常提供的许多属性游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
,例如变换矩阵,光源探针光源探针存储有关光线如何穿过场景中的空间的信息。排列在给定空间中的光源探针集合可以改善移动对象的光照和该空间内的静态LOD场景。更多信息
请参阅术语表
系数,以及光照贴图一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表
纹理坐标。

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