Установить для шейдера требование функций GPU
Вы можете использовать #pragma руководящие принципы чтобы указать, что проход шейдера требует определенного GPU во время выполнения, Unity компилирует шейдер только в том случае, если платформа поддерживает эти возможности.
Используйте одно из следующих в блоке HLSLPROGRAM шейдера:
#pragma requireдля указания индивидуальных GPU особенностей, которые требуются для шейдера, например#pragma require integers mrt8.#pragma targetдля указания модели шейдера, которая требуется для шейдера, например#pragma target 4.0. Модель шейдера представляет собой определенную группу GPU особенностей.
Полный перечень значений см. в HLSL ссылка на команду pragma require и HLSL ссылка на команду pragma target.
Например:
SubShader
{
Pass
{
HLSLPROGRAM
// Require multiple GPU features
#pragma require integers mrt8
...
ENDHLSL
}
}
Можно добавить несколько инструкций #pragma. Также можно добавить несколько GPU функций или моделей шейдеров к одной инструкции #pragma, используя пробел между ними.
По умолчанию Unity использует:
#pragma require geometry, если ваш шейдер использует#pragma geometryдля определения стадии геометрии.#pragma require tessellation, если ваш шейдер использует#pragma hullили#pragma domainдля определения стадии тесселяции.
Unity отображает предупреждение при добавлении geometry или tessellation. Чтобы избежать этого предупреждения, добавьте требования явно или используйте соответствующее значение #pragma target в вашем коде.
Ограничить требование к конкретным вариантам шейдера
Чтобы компилировать варианты шейдеров только тогда, когда платформа времени выполнения поддерживает функцию GPU или модель шейдера, используйте следующий синтаксис:
- В
#pragma targetдобавьте ключевые слова вариантов шейдеров, разделенные пробелами. Например,#pragma target 4.0 EXAMPLE_KEYWORD. - В
#pragma requireдобавьте двоеточие (:), за которым следуют ключевые слова вариантов шейдера, разделенные пробелами. Например,#pragma require mrt8 : EXAMPLE_KEYWORD.
В этих примерах во время сборки Unity компилирует варианты шейдеров, которые используют EXAMPLE_KEYWORD, только если целевая платформа поддерживает функцию GPU или модель шейдера.
Если вы используете два или более ключевых слов в #pragma target или #pragma require, Unity компилирует варианты шейдеров, которые используют любое из ключевых слов.
DirectX12 (DX12), Vulkan и Metal графики APIs особенности
Примечание: Если вы используете следующие ключевые слова для шейдеров, Unity компилирует шейдеры с помощью компилятора DXC. Поддержка DXC в Unity является экспериментальной, не поддерживается на всех платформах и не готова к производственному использованию.
Если вы используете графики DirectX12 (DX12), Vulkan или Metal APIs, вы можете использовать ключевое слово shader для нацеливания на следующие особенности GPU:
- Поддержка 16-битных типов данных.
- Поддержка волновых операций в вычислительных шейдерах.
Используйте следующий синтаксис:
#pragma multi_compile _ <keyword>
Вам не нужно добавлять директиву pragma require.
Затем Unity выполняет следующие действия:
- Использует совместимый компилятор шейдеров и включает флаги компилятора, связанные с функцией.
- Автоматически компилирует вариант шейдера с включённым ключевым словом и вариант шейдера с отключённым ключевым словом.
- Во время выполнения автоматически проверяет, поддерживает ли оборудование данную функцию, и выбирает правильный вариант.
Вы можете использовать инструкцию #if, чтобы сделать части кода шейдера зависимыми от того, поддерживает ли GPU данную функцию.
Ключевые слова
| multi-compile ключевое слово | Особенности GPU | Ключевое слово для условного кода шейдера |
|---|---|---|
UNITY_DEVICE_SUPPORTS_NATIVE_16BIT |
Поддержка 16-битных типов данных. Если использовать это ключевое слово, расположение буферов шейдеров может измениться, так как типы данных, такие как half и min16float, преобразуются в 16-битные. |
UNITY_DEVICE_SUPPORTS_NATIVE_16BIT |
UNITY_DEVICE_SUPPORTS_WAVE_ANY |
Поддерживает волновые операции любого размера. Используйте это ключевое слово, только если вы используете волновые операции, где размер волн не имеет значения. | UNITY_HW_SUPPORTS_WAVE |
UNITY_DEVICE_SUPPORTS_WAVE_8 |
Поддерживает волновые операции с размером волны 8. | UNITY_HW_SUPPORTS_WAVE |
UNITY_DEVICE_SUPPORTS_WAVE_16 |
Поддерживает волновые операции с размером волны 16. | UNITY_HW_SUPPORTS_WAVE |
UNITY_DEVICE_SUPPORTS_WAVE_32 |
Поддерживает волновые операции с размером волны 32. | UNITY_HW_SUPPORTS_WAVE |
UNITY_DEVICE_SUPPORTS_WAVE_64 |
Поддерживает волновые операции с размером волны 64. | UNITY_HW_SUPPORTS_WAVE |
UNITY_DEVICE_SUPPORTS_WAVE_128 |
Поддерживает волновые операции с размером волны 128. | UNITY_HW_SUPPORTS_WAVE |
Если вы используете ключевое слово, которое нацелено на определенный размер волны, Unity устанавливает определение UNITY_HW_WAVE_SIZE на тот же размер волны, чтобы вы могли использовать его в коде шейдера.
Подробнее см. Заявление и использование ключевых слов шейдера в HLSL.