Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Директивы #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 Объявляет набор ключевых слов. Компилятор включает все ключевые слова в сборку.

Вы можете использовать суффиксы, такие как _local, чтобы установить дополнительные параметры.

Дополнительную информацию и список поддерживаемых суффиксов см. в разделе Объявление и использование ключевых слов шейдера в HLSL.

#pragma shader_feature Объявляет набор ключевых слов. Компилятор исключает из сборки неиспользуемые ключевые слова.

Вы можете использовать суффиксы, такие как _local, чтобы установить дополнительные параметры.

Дополнительную информацию и список поддерживаемых суффиксов см. в разделе Объявление и использование ключевых слов шейдера в HLSL.

#pragma hardware_tier_variants Только для встроенного конвейера рендеринга: добавьте ключевые слова для графических уровней при компиляции для данного графического API. Дополнительные сведения см. в разделе Уровни графики..
#pragma skip_variants Удалить указанные ключевые слова.

Требования к графическому процессору и поддержка модели шейдеров

Используйте эти директивы, чтобы сообщить компилятору, что вашему шейдеру требуются определенные функции графического процессора.

Утверждение Функции
#pragma target Минимальная модель шейдера, с которой совместима эта шейдерная программа. Замените допустимым значением. Список допустимых значений см. в разделе Компиляция шейдеров: выбор моделей шейдеров и функций графического процессора в HLSL.
#pragma require Минимальные функции графического процессора, с которыми совместим этот шейдер. Замените допустимым значением или несколькими допустимыми значениями, разделенными пробелом. Список допустимых значений см. в разделе Компиляция шейдеров: выбор моделей шейдеров и функций графического процессора в HLSL.

Графические API

Используйте эти директивы, чтобы указать Unity включить или исключить код для данного графического API.

Утверждение Функции
#pragma only_renderers Скомпилируйте эту шейдерную программу только для заданных графических API. Замените списком допустимых значений, разделенных пробелами. Дополнительные сведения и список допустимых значений см. в разделе Нацеливание на графические API и платформы в HLSL.
#pragma exclude_renderers Не компилируйте эту шейдерную программу для заданных графических API. Замените списком допустимых значений, разделенных пробелами. Дополнительные сведения и список допустимых значений см. в разделе Нацеливание на графические API и платформы в HLSL.

Другие директивы прагмы

Утверждение Функции
#pragma instancing_options Включите создание экземпляров графического процессора в этом шейдере с заданными параметрами. Дополнительные сведения см. в разделе Инстансирование GPU.
#pragma once Поместите эту директиву в файл, чтобы гарантировать, что компилятор включит файл только один раз в шейдерную программу.

Примечание. Unity поддерживает эту директиву, только если включен препроцессор кэширования шейдеров.

#pragma enable_d3d11_debug_symbols Создает символы отладки шейдера для поддерживаемых графических API и отключает оптимизацию для всех графических API. Используйте это для отладки кода шейдера во внешнем инструменте.

Unity генерирует символы отладки для Vulkan, DirectX 11 и 12 и поддерживаемых консольных платформ.

Предупреждение. Это приводит к увеличению размера файла и снижению производительности шейдера. Когда вы закончите отладку шейдеров и будете готовы сделать окончательную сборку своего приложения, удалите эту строку из исходного кода шейдера и перекомпилируйте шейдеры.

#pragma skip_optimizations Принудительно отключает оптимизацию для заданных графических API. Замените списком допустимых значений, разделенных пробелами. Список допустимых значений см. в разделе Нацеливание на графические API и платформы в HLSL.
#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, даже если текущая платформа не поддерживает постоянные буферы.
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3