Директивы #pragma
в HLSL представляют собой тип директивы препроцессора. Они предоставляют дополнительную информацию шейдерупрограмме, работающей на графическом процессоре. Подробнее
См. в Словарь, на который не распространяются другие типы директив препроцессора.
Использование директив прагмы
Директивы #pragma
можно размещать в любом месте кода HLSL, но обычно их помещают в начало, например так:
#pragma target 3.0
#pragma exclude_renderers vulkan
#pragma vertex vert
#pragma fragment frag
// The rest of your HLSL code goes here
Ограничения
Существуют некоторые ограничения на использование директив #pragma
. Ограничения различаются в зависимости от того, включен или отключен препроцессор кэширования шейдеров.
Когда препроцессор кэширования шейдеров включен:
- Вы можете использовать директивы
#pragma
внутри условных директив (#if
), если выражение зависит только от:- Любые пользовательские директивы
#define
в вашем собственном коде - Следующие ключевые слова платформы:
SHADER_API_MOBILE
,SHADER_API_DESKTOP
,UNITY_NO_RGBM
,UNITY_USE_NATIVE_HDR
,UNITY_FRAMEBUFFER_FETCH_AVAILABLE
,UNITY_NO_CUBEMAP_ARRAY
- Макрос
UNITY_VERSION
- Любые пользовательские директивы
- Вы можете использовать специфичные для Unity директивы
#pragma
только в файлах.shader
и в файлах, которые вы включаете в Директива#include_with_pragmas
. Unity не поддерживает их в файлах, которые вы включаете с помощью директивы#include
; компилятор их игнорирует. - Вы можете использовать только стандартные директивы HLSL
#pragma
в файлах, которые вы включаете с помощью директивы#include
. Unity не поддерживает их в файлах.shader
или в файлах, которые вы включаете с помощью директивы#include_with_pragmas
; компилятор их игнорирует.
Если препроцессор кэширования шейдеров отключен:
- Unity не поддерживает директивы
#pragma
внутри условных директив (#if
); компилятор их игнорирует. - Директивы
#pragma
, относящиеся к Unity, можно использовать только в файлах.shader
. Unity не поддерживает их в файлах, которые вы включаете с помощью директивы#include
; компилятор их игнорирует. - Вы можете использовать только стандартные директивы HLSL
#pragma
в файлах, которые вы включаете с помощью директивы#include
. Unity не поддерживает их в файлах.shader
; компилятор их игнорирует.
Список поддерживаемых директив прагмы
Unity поддерживает все директивы #pragma
, являющиеся частью стандартного HLSL, если эти директивы находятся в обычных включаемых файлах. Дополнительные сведения об этих директивах см. в документации HLSL: директива прагмы.
Кроме того, Unity поддерживает следующие специфичные для Unity директивы #pragma
:
Поверхностные шейдеры
Если вы пишете шейдер поверхностиупрощенный способ написания шейдеры для встроенного конвейера рендеринга. Подробнее
См. в Словарь, используйте эту директиву, чтобы сообщить компилятору, какую функцию использовать в качестве функция поверхности и передать данные этой функции.
Утверждение | Функции |
---|---|
#pragma surface |
Скомпилируйте функцию с данным именем в качестве поверхностного шейдера, чтобы она работала с заданной моделью освещения. Дополнительные сведения см. в разделе Шейдеры поверхности. |
Этапы шейдера
Если вы пишете обычный графический шейдер, используйте эти директивы, чтобы сообщить компилятору, какие функции использовать для разных этапов шейдера. Директивы #pragma vertex
и #pragma fragment
обязательны, но другие этапы необязательны.
Утверждение | Функции |
---|---|
#pragma vertex |
Скомпилируйте функцию с заданным именем в качестве вершинного шейдера. Замените <имя> именем функции. Эта директива требуется в обычных графических шейдерах. |
#pragma fragment |
Скомпилируйте функцию с заданным именем в качестве фрагментного шейдера. Замените <имя> именем функции. Эта директива требуется в обычных графических шейдерах. |
#pragma geometry |
Скомпилируйте функцию с заданным именем в качестве шейдера геометрии. Замените <имя> именем функции. Этот параметр автоматически включает #pragma require геометрия ; дополнительную информацию см. в разделе Нацеливание моделей шейдеров и функций графического процессора в HLSL.
Примечание. Metal не поддерживает геометрические шейдеры. |
#pragma hull |
Скомпилируйте функцию с заданным именем в качестве шейдера корпуса DirectX 11. Замените <имя> именем функции. Это автоматически добавляет #pragma require tessellation ; дополнительную информацию см. в разделе Нацеливание моделей шейдеров и функций графического процессора в HLSL. |
#pragma domain |
Скомпилируйте функцию с заданным именем в качестве шейдера домена DirectX 11. Замените <имя> именем функции. Этот параметр автоматически включает #pragma require tessellation ; дополнительную информацию см. в разделе Нацеливание моделей шейдеров и функций графического процессора в HLSL. |
Варианты шейдера и ключевые слова
Используйте эти директивы, чтобы указать компилятору шейдера, как обрабатывать варианты шейдера и ключевые слова. Дополнительные сведения см. в разделе Объявление и использование ключевых слов шейдера в HLSL.
Утверждение | Описание |
---|---|
#pragma multi_compile |
Объявляет набор ключевых слов. Компилятор включает все ключевые слова в сборку.
Вы можете использовать суффиксы, такие как Дополнительную информацию и список поддерживаемых суффиксов см. в разделе Объявление и использование ключевых слов шейдера в HLSL. |
#pragma shader_feature |
Объявляет набор ключевых слов. Компилятор исключает из сборки неиспользуемые ключевые слова.
Вы можете использовать суффиксы, такие как Дополнительную информацию и список поддерживаемых суффиксов см. в разделе Объявление и использование ключевых слов шейдера в HLSL. |
#pragma hardware_tier_variants |
Только для встроенного конвейера рендеринга: добавьте ключевые слова для графических уровней при компиляции для данного графического API. Дополнительные сведения см. в разделе Уровни графики.. |
#pragma skip_variants |
Удалить указанные ключевые слова. |
Требования к графическому процессору и поддержка модели шейдеров
Используйте эти директивы, чтобы сообщить компилятору, что вашему шейдеру требуются определенные функции графического процессора.
Утверждение | Функции |
---|---|
#pragma target |
Минимальная модель шейдера, с которой совместима эта шейдерная программа. Замените |
#pragma require |
Минимальные функции графического процессора, с которыми совместим этот шейдер. Замените |
Графические API
Используйте эти директивы, чтобы указать Unity включить или исключить код для данного графического API.
Утверждение | Функции |
---|---|
#pragma only_renderers |
Скомпилируйте эту шейдерную программу только для заданных графических API. Замените |
#pragma exclude_renderers |
Не компилируйте эту шейдерную программу для заданных графических API. Замените |
Другие директивы прагмы
Утверждение | Функции |
---|---|
#pragma instancing_options |
Включите создание экземпляров графического процессора в этом шейдере с заданными параметрами. Дополнительные сведения см. в разделе Инстансирование GPU. |
#pragma once |
Поместите эту директиву в файл, чтобы гарантировать, что компилятор включит файл только один раз в шейдерную программу.
Примечание. Unity поддерживает эту директиву, только если включен препроцессор кэширования шейдеров. |
#pragma enable_d3d11_debug_symbols |
Создает символы отладки шейдера для поддерживаемых графических API и отключает оптимизацию для всех графических API. Используйте это для отладки кода шейдера во внешнем инструменте.
Unity генерирует символы отладки для Vulkan, DirectX 11 и 12 и поддерживаемых консольных платформ. Предупреждение. Это приводит к увеличению размера файла и снижению производительности шейдера. Когда вы закончите отладку шейдеров и будете готовы сделать окончательную сборку своего приложения, удалите эту строку из исходного кода шейдера и перекомпилируйте шейдеры. |
#pragma skip_optimizations |
Принудительно отключает оптимизацию для заданных графических API. Замените |
#pragma hlslcc_bytecode_disassembly |
Встроить дизассемблированный байт-код HLSLcc в переведенный шейдер. |
#pragma disable_fastmath |
Включите точные правила IEEE 754, включающие обработку NaN. В настоящее время это влияет только на платформу Metal. |
#pragma editor_sync_compilation |
Принудительная синхронная компиляция. Это влияет только на редактор Unity. Дополнительные сведения см. в разделе Компиляция асинхронного шейдера. |
#pragma enable_cbuffer |
Выдавать cbuffer(name) при использовании макросов CBUFFER_START(name) и CBUFFER_END из HLSLSupport, даже если текущая платформа не поддерживает постоянные буферы. |