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

Заявление DOTS Свойства экземпляра в пользовательском шейдере в URP

Для загрузки данных экземпляра, таких как матрицы преобразований, шейдер должен определить свойства DOTS Instanced. Ниже приведен пример простого блока свойств DOTS Instanced:

UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
    UNITY_DOTS_INSTANCED_PROP(float4, Color)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)

Чтобы обозначить начало и конец блока свойств, используйте макросы UNITY_DOTS_INSTANCING_START и UNITY_DOTS_INSTANCING_END, за которыми следует имя блока. В примере используется имя MaterialPropertyMetadata. Допускаются три имена блоков:

  • BuiltinPropertyMetadata
  • MaterialPropertyMetadata
  • UserPropertyMetadata

Шейдер может объявить по одному из каждого, так что DOTS Инстанционный шейдер может иметь от нуля до трех таких блоков. 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 предоставляет шейдеру 32-битное целочисленное значение метаданных для каждого DOTS Instanced свойства, объявляемого шейдером. Unity устанавливает значение метаданных, когда ваш код вызывает BatchRendererGroup.AddBatch для создания батча, связанной с рисованием. Значение метаданных по умолчанию 0, если Unity его не устанавливает. Шейдер также имеет доступ к ByteAddressBuffer unity_DOTSInstanceData, которое Unity устанавливает для GraphicsBuffer, передаваемого в качестве аргумента BatchRendererGroup.AddBatch. Этот буфер обычно является местом, где шейдер загружает данные экземпляра. Несколько батчей могут совместно использовать один GraphicsBuffer, но также возможно для каждой батча использовать свой собственный отдельный GraphicsBuffer для unity_DOTSInstanceData.

Примечание: Unity автоматически не предоставляет никаких DOTS данных экземпляра. Вы обязаны убедиться, что буфер unity_DOTSInstanceData каждой пакета содержит правильные данные. Данные экземпляра должны включать многие свойства, которые Unity обычно предоставляет для GameObjects, такие как матрицы преобразования, коэффициенты светового зонда и координаты текстуры lightmap.