Эта страница содержит информацию о работе с шейдеромпрограммой, работающей на графическом процессоре. Подробнее
Просмотреть в Словарь ключевые слова в коде HLSL. Общие сведения о ключевых словах шейдеров см. в разделе Ключевые слова шейдеров. Для получения информации об объявлении и использовании ключевых слов шейдера в Shader Graph см. Ключевые слова.
В коде HLSL используйте директивы #pragma для объявления ключевых слов шейдера и директивы #if, чтобы указать, что раздел кода шейдера зависит от состояния ключевого слова шейдера. Ключевые слова шейдера можно использовать в обычных графических шейдерах (включая поверхностные шейдерыупрощенный способ написания шейдеров для встроенного конвейера рендеринга. Подробнее
См. в Словарь) и compute шейдеры.
Объявление ключевых слов шейдера
Чтобы объявить ключевые слова шейдера, используйте одну из следующих директив #pragma в коде HLSL:
| Утверждение | Описание |
|---|---|
#pragma multi_compile |
Объявляет набор ключевых слов.
По умолчанию эти ключевые слова имеют глобальную область действия и влияют на все этапы шейдера. Процесс сборки включает все ключевые слова из этого набора. |
#pragma shader_feature |
Объявляет набор ключевых слов, а также указывает компилятору компилировать варианты, в которых ни одно из этих ключевых слов не включено.
По умолчанию эти ключевые слова имеют глобальную область действия и влияют на все этапы шейдера. В процессе сборки используются ключевые слова из этого набора, которые используются во время сборки. |
Информацию о разнице между #pragma multi_compile и #pragma Shader_feature, а также рекомендации о том, когда какую из них использовать, см. см. ключевые слова шейдера.
Примечание. Если вы добавите шейдер в список Всегда включаемые шейдеры в графике окна настроек, Unity включает все ключевые слова из всех наборов в сборке, даже если они были объявлены с помощью #pragma Shader_feature.
Вы также можете добавить суффиксы к этим директивам, чтобы изменить их поведение:
- Добавьте
_local, чтобы указать, что набор ключевых слов имеет локальную область действия и не может быть переопределен глобальными ключевыми словами; в противном случае ключевые слова имеют глобальную область действия и могут быть переопределены глобальными ключевыми словами. Дополнительные сведения см. в разделе Ключевые слова шейдера: глобальная и локальная область действия.Этот суффикс можно добавить к директивам
#pragma multi_compileили#pragma Shader_feature; например, допустимы#pragma multi_compile_localи#pragma Shader_feature_local. - Добавить
_vertex,_fragment,_hull,_domain,_geometryили_raytracing, чтобы указать, что набор ключевых слов влияет только на данный шейдер. stage, что может уменьшить количество ненужных вариантов шейдера. Дополнительные сведения см. в разделе Ключевые слова шейдера: ключевые слова для этапа.Эти суффиксы можно добавить в директивы
#pragma multi_compileили#pragma Shader_feature, либо отдельно, либо после_local; например, допустимы#pragma multi_compile_vertexи#pragma shaper_feature_local_fragment.
Кроме того, есть несколько «быстрых» вариантов #pragma multi_compile, которые добавляют предопределенные наборы ключевых слов. Дополнительную информацию об этом см. в разделе быстрые команды multi_compile.
Объявление набора ключевых слов
Вы объявляете ключевые слова наборами. Набор содержит взаимоисключающие ключевые слова.
Чтобы объявить набор ключевых слов, используйте директиву #pragma multi_compile или #pragma_shader_feature, за которой следует разделенный пробелом список ключевых слов.
В этом примере показано, как объявить набор из четырех ключевых слов:
#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA
Внутренне это работает с помощью директив #define. Когда Unity компилирует шейдер, он генерирует четыре варианта: один с определением QUALITY_LOW, один с определением QUALITY_MEDIUM, один с определением QUALITY_HIGH и один с определением QUALITY_ULTRA. Во время выполнения Unity использует соответствующий вариант в зависимости от того, какое из этих ключевых слов включено.
Когда вы используете #pragma shader_feature для объявления набора ключевых слов, Unity также компилирует вариант, в котором ни одно из ключевых слов в этом наборе не определено. Это позволяет вам определять поведение без использования дополнительного ключевого слова. Сокращение количества ключевых слов полезно по нескольким причинам: оно может уменьшить общее количество вариантов, компилируемых Unity, что улучшает как время сборки, так и производительность во время выполнения; он уменьшает общее количество ключевых слов, используемых шейдером, что предотвращает превышение пределов ключевых слов шейдера; а также упрощает управление состоянием ключевых слов из сценариев C#, поскольку количество ключевых слов для включения и отключения меньше.
В этом примере показано, как объявить набор, содержащий только одно ключевое слово:
#pragma shader_feature EXAMPLE_ON
Вы также можете указать Unity сделать это при использовании #pragma multi_compile. Для этого добавьте в набор «пустое» ключевое слово с именем, состоящим из одного или нескольких символов подчеркивания (_), например так:
#pragma multi_compile __ EXAMPLE_ON
Объявление нескольких наборов ключевых слов
Вы можете объявить несколько наборов ключевых слов для представления различных функций. Для этого используйте несколько директив #pragma multi_compile или #pragma_shader_feature.
В этом примере показано, как объявить один набор из четырех ключевых слов и другой набор из трех ключевых слов:
#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA
#pragma multi_compile COLOR_RED COLOR_GREEN COLOR_BLUE
Ограничения
Существуют некоторые ограничения на объявление наборов ключевых слов:
- Вы не можете включать одно и то же ключевое слово более одного раза в один и тот же набор; однако вы можете объявить одно и то же ключевое слово в разных наборах.
- Вы не можете объявить один и тот же набор ключевых слов в шейдерной программе более одного раза.
- Существует ограничение на количество ключевых слов, которые может использовать шейдер. Каждое ключевое слово, объявленное в исходном файле шейдера, и его зависимости
См. в Словарь учитываются в этом пределе. Дополнительную информацию см. в разделе ограничения ключевых слов шейдера.
Использование ключевых слов шейдера
Чтобы скомпилировать код, который используется только тогда, когда заданное ключевое слово шейдера включено, вы используете директиву #if, например:
// Declare a set of keywords
#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA
#if QUALITY_ULTRA
// Code here is compiled for variants that are used when the keyword QUALITY_ULTRA is enabled
#endif
В Unity директивы #if работают так же, как и в стандартном HLSL. Дополнительные сведения о директивах #if см. в документации по HLSL: директивы if, elif, else и endif.
Кроме того, директивы #pragma require и #pragma target могут принимать ключевые слова в качестве параметров, чтобы они применялись только к варианты, в которых заданные ключевые слова включены. Дополнительную информацию см. в разделе Нацеливание моделей шейдеров и функций GPU в HLSL.
быстрые команды для нескольких компиляций
Unity предоставляет несколько сокращенных обозначений для объявления ключевых слов шейдера.
Следующие сочетания клавиш относятся к свету, теням и картам освещения во встроенном конвейере рендеринга:
-
multi_compile_fwdbaseдобавляет следующий набор ключевых слов: DIRECTIONAL LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON SHADOWS_SCREEN SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH. Эти варианты необходимы для PassType.ForwardBase. -
multi_compile_fwdbasealphaдобавляет следующий набор ключевых слов: DIRECTIONAL LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_SHADOW_MIXING VERTEXLIGHT_ON LIGHTPROBE_SH. Эти варианты необходимы для PassType.ForwardBase. -
multi_compile_fwdaddдобавляет следующий набор ключевых слов: POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE. Эти варианты необходимы для PassType.ForwardAdd. -
multi_compile_fwdadd_fullshadowsдобавляет следующий набор ключевых слов: POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE SHADOWS_DEPTH SHADOWS_SCREEN SHADOWS_CUBE SHADOWS_SOFT SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING. Это то же самое, что иmulti_compile_fwdadd, но добавляет возможность создавать тени в реальном времени для источников света. -
multi_compile_lightpassдобавляет следующий набор ключевых слов: POINT DIRECTIONAL SPOT POINT_COOKIE DIRECTIONAL_COOKIE SHADOWS_DEPTH SHADOWS_SCREEN SHADOWS_CUBE SHADOWS_SOFT SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING. По сути, это универсальный ярлык для всех функций, связанных со светом и тенями в реальном времени, кроме световых зондовхранилища световых зондов. информацию о том, как свет проходит через пространство в вашей сцене. Набор световых зондов, расположенных в заданном пространстве, может улучшить освещение движущихся объектов и статических пейзажей LOD в этом пространстве. Подробнее
См. в Словарь. -
multi_compile_shadowcasterдобавляет следующий набор ключевых слов: SHADOWS_DEPTH SHADOWS_CUBE. Эти варианты необходимы PassType.ShadowCaster. -
multi_compile_shadowcollectorдобавляет следующий набор ключевых слов: SHADOWS_SPLIT_SPHERES SHADOWS_SINGLE_CASCADE. Он также компилирует варианты без каких-либо из этих ключевых слов. Эти варианты необходимы для теней на экране. -
multi_compile_prepassfinalдобавляет следующий набор ключевых слов: LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON UNITY_HDR_ON SHADOWS_SHADOWMASK LIGHTPROBE_SH. Он также компилирует варианты без каких-либо из этих ключевых слов. Эти варианты необходимы для PassType.LightPrePassFinal и PassType.Deferred .
Следующие сочетания клавиш относятся к другим настройкам:
-
multi_compile_particlesдобавляет это ключевое слово, относящееся к встроенной системе частицкомпоненту, который моделирует текучие объекты, такие как жидкости, облака и пламя, создавая и анимируя большое количество небольших 2D-изображений в сцене. Подробнее
См. в Словарь: SOFTPARTICLES_ON. Он также компилирует варианты без этого ключевого слова. Дополнительную информацию см. в разделе Встроенная система частиц. -
multi_compile_fogдобавляет этот набор ключевых слов, относящихся к туману: FOG_LINEAR, FOG_EXP, FOG_EXP2. Он также компилирует варианты без каких-либо из этих ключевых слов. Вы можете управлять этим поведением в окне Настройки графики. -
multi_compile_instancingдобавляет ключевые слова, относящиеся к созданию экземпляров. Если шейдер использует процедурное создание экземпляров, он добавляет следующий набор ключевых слов: INSTANCING_ON PROCEDURAL_ON. В противном случае добавляется это ключевое слово: INSTACING_ON. Он также компилирует варианты без каких-либо из этих ключевых слов. Вы можете управлять этим поведением в окне Настройки графики.
Большинство этих ярлыков содержат несколько ключевых слов. если вы знаете, что они не нужны проекту, вы можете использовать #pragma skip_variants, чтобы удалить некоторые из них. Например:
#pragma multi_compile_fwdadd
#pragma skip_variants POINT POINT_COOKIE
Это говорит компилятору удалить ключевые слова POINT или POINT_COOKIE из других директив.

