Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход

Пример использования UNITY_DOTS_INSTANCED_PROP макросов в DOTS Шейдере инстанции в URP

Макрос 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 Instanced, использующего все варианты макросов, описанные выше:

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_PROP идентичен UNITY_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, чтобы убедиться, что шейдеры правильно перекомпилированы.

На устройствах низкого уровня, инстанционированные свойства могут иметь значительную стоимость производительности. Загрузка из SSBO, например, может быть намного медленнее, чем обычная постоянная загрузка буфера. Это потому, что на многих устройствах низкого уровня, этот тип загрузки буфера проходит через семплер текстуры, в то время как постоянная загрузка буфера использует более быстрое оборудование, если только не используется динамический индекс для доступа к буферу. Инстанционированные свойства всегда загружаются с динамической индексацией, поскольку это зависит от метаданных свойства, это означает, что они всегда проходят через семплер текстуры на устройствах низкого уровня. Чтобы лучше оптимизировать свой проект для устройств низкого уровня, вы можете отключить инстанционирование свойств по умолчанию. Для этого включите define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT, это установит инстанционирование свойств по умолчанию отключенным. После этого вы можете включить инстанционирование свойств вручную только для свойств, которые требуют этого.