Вы можете использовать директивы #pragma
, чтобы указать, что шейдерПрограмма, работающая на графическом процессоре. Подробнее
See in Словарь требуются определенные функции графического процессора. Во время выполнения Unity использует эту информацию, чтобы определить, совместима ли шейдерная программа с текущим оборудованием.
Вы можете указать отдельные функции графического процессора с помощью директивы #pragma require
или указать модель шейдера с помощью Директива #pragma target
. Шейдерная модель — это сокращение для группы функций графического процессора; внутренне это то же самое, что и директива #pragma require
с тем же списком функций.
Важно правильно описать функции графического процессора, которые требуются вашему шейдеру. Если ваш шейдер использует функции, не включенные в список требований, это может привести либо к ошибкам времени компиляции, либо к тому, что устройства не смогут поддерживать шейдеры во время выполнения.
Поведение по умолчанию
По умолчанию Unity компилирует шейдеры с производными #pragma require
, что соответствует #pragma target 2.5
.
Особые требования к этапам шейдера
Если ваш шейдер определяет определенные этапы шейдера, Unity автоматически добавляет элементы в список требований.
- Если шейдер определяет этап геометрии (с помощью
#pragma геометрии
), Unity автоматически добавляетгеометрию
в список требований. . - Если шейдер определяет этап тесселяции (с
#pragma hull
или#pragma domain
), Unity автоматически добавляеттесселяция
в список требований.
Если список требований (или эквивалентное целевое значение) еще не включает эти значения, Unity отображает предупреждающее сообщение при компиляции шейдера, чтобы указать, что эти требования были добавлены. Чтобы избежать появления этого предупреждающего сообщения, явно добавьте требования или используйте соответствующее целевое значение в своем коде.
Указание функций графического процессора или модели шейдера
Чтобы указать необходимые функции, используйте директиву #pragma require
, за которой следует список значений, разделенных пробелами. Например:
#pragma require integers mrt8
Вы также можете использовать директиву #pragma require
, за которой следует двоеточие и список разделенных пробелами ключевых слов шейдера. Это означает, что требование применяется только к вариантам, которые используются при включении любого из заданных ключевых слов.
Например:
#pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
Вы можете использовать несколько строк #pragma require
. В этом примере шейдер требует целые числа
во всех случаях и mrt8
, если EXAMPLE_KEYWORD включен.
#pragma require integers
#pragma require integers mrt8 : EXAMPLE_KEYWORD
Чтобы указать модель шейдера, используйте директиву #pragma target
. Например:
#pragma target 4.0
Вы также можете использовать директиву #pragma target
, за которой следует список разделенных пробелами ключевых слов шейдера. Это означает, что требование применяется только к вариантам, которые используются при включении любого из заданных ключевых слов.
Например:
#pragma target 4.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
Примечание. Синтаксис для указания ключевых слов для #pragma require
и #pragma target
: немного отличается. Когда вы указываете ключевые слова для #pragma require
, вы используете двоеточие. Когда вы указываете ключевые слова для #pragma target
, вы не используете двоеточие.
Список значений ‘#pragma target’
Вот список моделей шейдеров, которые использует Unity, и комбинации значений #pragma require
, которым соответствует каждая из них.
Примечание. Модели шейдеров Unity аналогичны моделям шейдеров DirectX и требованиям к версии OpenGL, но не полностью соответствуют друг другу. Внимательно прочитайте описания, чтобы убедиться, что вы понимаете различия.
Значение | Описание | Поддержка | Эквивалент #pragma require |
---|---|---|---|
2.0 |
Эквивалентно модели шейдеров DirectX 2.0.
Ограниченное количество арифметических и текстурных инструкций; 8 интерполяторов; нет выборки вершинной текстуры; нет производных во фрагментных шейдерах; нет явной выборки текстуры LOD. |
Работает на всех платформах, поддерживаемых Unity. | N/A |
2.5 |
Почти то же, что и 3.0, но только с 8 интерполяторами и без явной выборки текстур LOD. | Уровень функций DirectX 11 9+ OpenGL 3.2+ OpenGL ES 2.0 Vulkan Metal |
derivatives |
3.0 |
Эквивалентно модели шейдеров DirectX 3.0. | DirectX 11 feature level 10 + OpenGL 3.2+ OpenGL ES 3.0+ Vulkan Metal Может работать на некоторых устройствах OpenGL ES 2.0, в зависимости от расширений и функций драйвера. |
Эквивалентно 2.5 , plus:interpolators10 samplelod fragcoord
|
3.5 |
Эквивалентно OpenGL ES 3.0.
|
DirectX 11 feature level 10+ OpenGL 3.2+ OpenGL ES 3+ Vulkan Metal |
Эквивалентно 3.0 , plus:interpolators15 mrt4 integers 2darray instancing
|
4.0 |
Эквивалентно DirectX shader model 4.0, но без требования поддерживать 8 МРЦ. | DirectX 11 feature level 10+ OpenGL 3.2+ OpenGL ES 3.1+AEP Vulkan Metal (if no geometry stage is defined) |
Эквивалентно 3.5 , plus:geometry
|
4.5 |
Эквивалентно OpenGL ES 3.1. | DirectX 11 feature level 11+ OpenGL 4.3+ OpenGL ES 3.1 Vulkan Metal |
Эквивалентно 3.5 , plus:compute randomwrite msaatex
|
4.6 |
Эквивалентно OpenGL 4.1.
Это самый высокий уровень OpenGL, поддерживаемый на Mac. |
DirectX 11 feature level 11+ OpenGL 4.1+ OpenGL ES 3.1+AEP Vulkan Metal (if no geometry stage is defined, and no hull or domain stage is defined) |
Эквивалентно 4.0 , plus:cubearray tesshw tessellation msaatex
|
5.0 |
Эквивалентно DirectX shader model 5.0, but without the requirement to support 32 interpolators or cubemap arrays. | DirectX 11 feature level 11+ OpenGL 4.3+ OpenGL ES 3.1+AEP Vulkan Metal (if no geometry stage is defined, and no hull or domain stage is defined) |
Эквивалентно 4.0 , plus:compute randomwrite msaatex tesshw tessellation
|
Информацию о поддержке модели шейдеров для консольных платформ см. в документации по конкретной платформе.
Примечания:
- В определениях DirectX модель шейдеров 4.0 включает
mrt8
, а модель шейдеров 5.0 включаетinterpolators32
икубический массив
. Unity не включает их для более широкой совместимости. Чтобы потребовать эти функции, используйте явную директиву#pragma require
. - Если вы используете цель, для которой требуется
геометрия
, но ваш шейдер не определяет этап геометрии, Unity удаляетгеометрию
из список требований во время компиляции. - Если вы используете цель, для которой требуется
тесселяция
, но ваш шейдер не определяет этап оболочки или домена, Unity удаляеттесселяцию
из списка требований во время компиляции.
Список значений ‘#pragma require’
Вот все допустимые значения директивы #pragma require
.
Значение | Описание |
---|---|
interpolators10 |
Доступно не менее 10 интерполяторов вершины-фрагмента («вариации»). |
interpolators15 |
Доступно не менее 15 интерполяторов вершин-фрагментов («вариантов»).
Примечание. Внутри это также автоматически добавляет |
interpolators32 |
Доступно как минимум 32 интерполятора вершины-фрагмента («вариации»). |
integers |
Целые числа являются поддерживаемым типом данных, включая операции с битами/сдвигом.
Примечание. Внутри это также автоматически добавляет |
mrt4 |
Поддерживается не менее 4 целей рендеринга. |
mrt8 |
Поддерживается не менее 8 целей рендеринга. |
derivatives |
PixelНаименьшая единица компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. More info See in Словарь Поддерживаются производные инструкции шейдера (ddx/ddy). |
samplelod |
Явная текстура LODМетод Level Of Detail (LOD) – это оптимизация, уменьшающая количество треугольников. который Unity должен отображать для GameObject, когда его расстояние от камеры увеличивается. Подробнее See in Словарь (tex2Dlod / SampleLevel). |
fragcoord |
Поддерживается ввод местоположения пикселя (XY на экране, глубина ZW в пространстве клипа) в пиксельных шейдерах.. |
2darray |
Массивы 2D-текстур являются поддерживаемым типом данных. |
cubearray |
CubemapКоллекция из шести квадратных текстур, которые могут представлять отражения в окружающей среде или скайбокс, нарисованный позади вашей геометрии. Шесть квадратов образуют грани воображаемого куба, окружающего объект; каждая грань представляет вид по направлениям мировых осей (вверх, вниз, влево, вправо, вперед и назад). Подробнее См. в Словарь Массивы являются поддерживаемым типом данных. |
instancing |
Поддерживается входное системное значение SV_InstanceID. |
geometry |
Поддерживаются этапы шейдера геометрии. |
compute |
Поддерживаются вычислительные шейдеры, структурированные буферы и атомарные операции. |
randomwrite or uav
|
Поддерживаются текстуры «Случайная запись» (UAV). |
tesshw |
Поддерживается аппаратная тесселяция, но не обязательно этапы шейдера тесселяции (корпус/домен). Например, Metal поддерживает тесселяцию, но не этапы корпуса или домена.. |
tessellation |
Поддерживаются этапы шейдера тесселяции (корпус/домен). |
msaatex |
Поддерживается возможность доступа к мультисэмплированным текстурам (Texture2DMS в HLSL). |
sparsetex |
Разреженные текстуры с информацией о проживании (поддержка «Tier2» в терминах DirectX; функция CheckAccessFullyMapped HLSL). |
framebufferfetch or fbfetch
|
Поддерживается выборка кадрового буфера (возможность считывать цвет входного пикселя в пиксельном шейдере). |
setrtarrayindexfromanyshader |
Поддерживается установка индекса массива цели рендеринга на любом этапе шейдера (а не только на этапе шейдера геометрии). |