Version: 6000.3
语言: 中文
访问 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_DOTSInstanceDatabuffer,并且在访问属性时不会发出任何动态分支。

默认情况下,UNITY_DOTS_INSTANCED_PROPUNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED.可以通过取消注释定义来更改此默认行为UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT在“com.unity.render-pipelines.core\ShaderLibrary\UnityDOTSInstancing.hlsl”中。执行此作时,将启用定义,并且UNITY_DOTS_INSTANCED_PROP变成UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED.

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

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

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