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

Установить для шейдера требование функций 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:

Используйте следующий синтаксис:

#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.

Дополнительные ресурсы