版本:Unity 6 (6000.0)
语言:英语
访问 URP 中常量数据的 DOTS 实例化着色器的示例
URP 中的 DOTS 实例化着色器宏引用

在 URP 中的 DOTS 实例化着色器中使用 UNITY_DOTS_INSTANCED_PROP 宏的示例

UNITY_DOTS_INSTANCED_PROP 宏有 3 种变体

  • UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(PropertyType, PropertyName)
  • UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(PropertyType, PropertyName)
  • UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(PropertyType, PropertyName)

借助这些宏,你可以在编译时指定属性是否可实例化。它允许访问宏(如 UNITY_ACCESS_DOTS_INSTANCED_PROP)扩展为更优化的代码,并且可以在低端平台上产生重大影响。

下面是使用上述所有宏变体的 DOTS 实例化属性块的一个示例

UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
    UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(float4, Color)
    UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(float4, SpecColor)
    UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(float4, EmissionColor)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
  • Color 属性可实例化,也可不实例化。将根据属性元数据高位动态选择正确的加载路径。
  • SpecColor 属性不可实例化。此声明不会在常量缓冲区中添加 uint32 字段。这等同于根本未声明任何内容。在不需要修改代码其他部分的情况下,它可用于快速禁用属性上的实例化。
  • EmissionColor 属性必须实例化。此属性始终从 unity_DOTSInstanceData 缓冲区加载,并且在访问该属性时不会发出任何动态分支。

默认情况下,UNITY_DOTS_INSTANCED_PROPUNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED 相同。可以在“com.unity.render-pipelines.core\ShaderLibrary\UnityDOTSInstancing.hlsl”中取消注释定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT 来更改此默认行为。当你执行此操作时,该定义将启用,UNITY_DOTS_INSTANCED_PROP 将变为与 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED 相同。

注意:取消注释定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT 时,你可能需要清除库文件夹以确保 着色器一种在 GPU 上运行的程序。 更多信息
请参阅 词汇表
正确重新编译。

在低端设备上,实例化属性会产生显著的性能成本。例如,从 SSBO 加载可能比正常常量缓冲区加载慢很多。这是因为在许多低端设备上,这种类型的缓冲区加载经过纹理采样器,而常量缓冲区加载除非使用动态索引访问缓冲区,否则使用更快的硬件。实例化属性始终使用动态索引加载,因为它依赖于属性元数据,这意味着它们在低端设备上始终通过纹理采样器。要更好地针对低端设备优化项目,您可以在默认情况下禁用属性实例化。要执行此操作,启用定义 UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT,这将设置属性实例化为默认禁用。完成此操作后,您随后可以仅针对需要它的属性手动启用属性实例化。

访问 URP 中常量数据的 DOTS 实例化着色器的示例
URP 中的 DOTS 实例化着色器宏引用