Version: Unity 6.0 (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 的注释时,可能需要清除库 (Library) 文件夹,确保着色器已正确重新编译。

在低端设备上,实例化属性可能会占用大量性能。例如,从 SSBO 加载可能会比从常规的常量缓冲区加载要慢得多。这是因为在许多低端设备上,此类缓冲区加载会通过纹理采样器,而常量缓冲区加载会使用更快的硬件,除非使用动态索引来访问缓冲区。实例化属性始终通过动态索引进行加载,因为它依赖属性元数据,这表示实例化属性在低端设备上始终会通过纹理采样器。为更好地优化低端设备项目,可以默认禁用属性实例化。要实现此操作,请启用 define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT,这会将属性实例化设置为默认禁用。完成此操作后,可以手动仅对所需属性启用属性实例化。

访问 URP 中常量数据的 DOTS 实例化着色器示例
URP 的 DOTS 实例化着色器宏的参考
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961