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

GPU ссылка на шейдер instancing для встроенного Render Pipeline

В этом разделе содержится информация о добавлениях шейдеров, связанных с экземплярованием GPU.

Сложение Описание
#pragma multi_compile_instancing Создает варианты экземпляров. Это требуется для шейдеров фрагментов и вершин. Это необязательно для шейдеров поверхностей.
#pragma instancing_options Задает параметры, которые Unity использует для экземпляров. Информацию о доступных переключателях параметров см. в #pragma instancing_options.
UNITY_VERTEX_INPUT_INSTANCE_ID Определяет экземпляр ID в структуре ввода/вывода вершинного шейдера. Чтобы использовать этот макрос, включите ключевое слово шейдера INSTANCING_ON. В противном случае Unity не настроит экземпляр ID.
Для доступа к экземпляру ID, используйте vertexInput.instanceID внутри блока #ifdef INSTANCING_ON. Если вы не используете этот блок, варианты не компилируются.
UNITY_INSTANCING_BUFFER_START(bufferName) Объявляет начало буфера констант для каждого экземпляра, именуемого bufferName. Используйте этот макрос с UNITY_INSTANCING_BUFFER_END, чтобы обвязать объявления свойств, которые вы хотите сделать уникальными для каждого экземпляра. Объявите свойства внутри буфера с помощьюUNITY_DEFINE_INSTANCED_PROP.
UNITY_INSTANCING_BUFFER_END(bufferName) Объявляет конец буфера константы для каждого экземпляра, именуемого bufferName. Используйте этот макрос с UNITY_INSTANCING_BUFFER_START для обвода объявлений свойств, которые вы хотите сделать уникальными для каждого экземпляра. Объявляйте свойства внутри буфера с помощьюUNITY_DEFINE_INSTANCED_PROP.
UNITY_DEFINE_INSTANCED_PROP(type, propertyName) Определяет свойство шейдера для каждого экземпляра с указанным типом и именем. В приведенных ниже примерах свойство _Color является уникальным.
UNITY_SETUP_INSTANCE_ID(v); Позволяет функциям шейдера получать доступ к экземпляру ID. Для вершинных шейдеров этот макрос требуется в начале. Для фрагментных шейдеров это добавление необязательно. Пример см. в Shader вершин и фрагментов.
UNITY_TRANSFER_INSTANCE_ID(v, o); Копирует экземпляр ID из входной структуры в выходную структуру вершинного шейдера. Используйте этот макрос, если вам нужно получить доступ к данным по экземплярам в шейдере фрагментов.
UNITY_ACCESS_INSTANCED_PROP(bufferName, propertyName) Доступ к свойству шейдера для каждого экземпляра в буфере константы экземплярования. Unity использует экземпляр ID для индексирования в массив данных экземпляра.bufferName должно соответствовать имени постоянного буфера, который содержит указанный property.This макрос компилирует по-разному для INSTANCING_ON и неинстансирующие варианты.

Переключатели instance_options

Директива [#pragma instancing_options](#pragma-instancing_options) может использовать следующие параметры:

Коммутатор Описание
forcemaxcount:batchSize и maxcount:batchSize На большинстве платформ, Unity автоматически рассчитывает размер массива данных экземпляра. Он делит максимальный постоянный размер буфера на конечном устройстве на размер структуры, которая содержит все свойства экземпляра. В целом, вам не нужно беспокоиться о размере батча. Однако, некоторые платформы требуют фиксированный размер массива. Чтобы указать размер батча для этих платформ, используйте параметр maxcount. Другие платформы игнорируют этот параметр. Если вы хотите принудительно установить размер батча для всех платформ, используйте параметр forcemaxcount. Это удобно, например, если ваш проект использует RenderMeshInstanced, чтобы выполнять вызовы отрисовки с 256 инстансированными спрайтами. Значение по умолчанию для этих двух параметров — 500.
assumeuniformscaling Инструктирует Unity предположить, что все экземпляры имеют единообразное масштабирование (одинаковый масштаб для всех осей X, Y и Z).
nolodfade Не позволяет Unity применять GPU-инстансинг к значениям затухания LOD.
nolightprobe Предотвращает применение Unity экземпляров GPU к Световой зонд и их данные окклюзии. Установка этой опции на ON может повысить производительность, если ваш проект не содержит GameObjects, которые используют как GPU instancing, так и Light Probes.
nolightmap Предотвращает применение Unity экземпляров GPU к значениям информации атласа карт освещения. Установка этой опции на ON может повысить производительность, если ваш проект не содержит GameObjects, которые используют и экземпляры GPU, и карты освещения.
procedural:FunctionName Создает дополнительный вариант для использования с Graphics.RenderMeshIndirect. В начале стадии вершинного шейдера Unity вызывает функцию, указанную после двоеточия. Чтобы настроить данные экземпляра вручную, добавьте данные для каждого экземпляра к этой функции так же, как вы обычно добавляете данные для каждого экземпляра к шейдеру. Unity также вызывает эту функцию в начале шейдера фрагмента, если любое из полученных свойств экземпляра включено в шейдер фрагмента.