**Shader keywords** в Unity — это флаги (или макросы-компиляторы), которые позволяют включать или отключать определённые **варианты шейдера** (shader variants) во время компиляции или выполнения. Они нужны для управления функциональностью материала без создания отдельных шейдеров для каждого случая.
Очень похоже на `#define` в C#, но с [[#Cхожесть с ` define` в C|важными отличиями]].
Вы можете задавать **свои кастомные keywords** в шейдере с помощью `#pragma multi_compile` или `#pragma shader_feature`.
Примеры:
- `_NORMALMAP` — включает код в шейдере, обрабатывающий нормал-карту.
- `_ALPHATEST_ON` — активирует альфа-тест (отсечение по прозрачности).
- [[#Часто встречающихся shader keywords в Unity|Другие ключи]]
---
##### Как работают:
- Внутри шейдера используются условные блоки:
```hlsl
#ifdef _NORMALMAP
// код для обработки нормал-карты
#endif
```
- Unity **собирает отдельные варианты (shader variants)** под каждую комбинацию включённых keywords. Это увеличивает число скомпилированных шейдеров.
---
##### Типы:
- **Global shader keywords** — задаются через `Shader.EnableKeyword()`, действуют глобально.
- **Local shader keywords** — задаются на конкретном `Material` через `material.EnableKeyword()` и предпочтительнее, начиная с Unity 2020.1 (поддержка `material.shaderKeywords` устарела).
---
##### Производительность:
- **Каждая уникальная комбинация keywords = новый вариант шейдера** → может привести к **shader variant explosion** (взрыв числа вариантов).
- Рекомендуется использовать **не больше 256 keywords одновременно**, иначе часть не будет работать (ограничение Unity на compile-time keywords).
---
Если кратко:
> Shader keywords — это переключатели, которые включают/отключают фичи внутри одного шейдера, создавая нужный вариант.
### Cхожесть с `#define` в C\#
Да, очень похоже на `#define` в C#, но с важными отличиями.
---
##### 🔗 Общие черты:
- И `#define` в C#, и `shader keywords` в Unity-шейдерах позволяют **условно компилировать код**:
```csharp
#define USE_FEATURE
#if USE_FEATURE
// Выполнится, если USE_FEATURE определён
#endif
```
```hlsl
#ifdef _NORMALMAP
// Код выполнится, если ключ _NORMALMAP активен
#endif
```
---
##### ❗ Ключевые отличия:
|Особенность|`#define` в C#|Shader Keyword в Unity|
|---|---|---|
|**Где используется**|В C#-скриптах|В HLSL-шейдерах (ShaderLab)|
|**Когда задаётся**|Во время компиляции C#|В Unity — во время компиляции шейдера **и** во время исполнения|
|**Можно изменить во время игры**|❌ Нет|✅ Да (`material.EnableKeyword(...)`)|
|**Управляет шейдерными фичами**|❌ Нет|✅ Да|
|**Влияет на производительность**|⚠ Условно|✅ Да (варианты шейдера, память, GPU)|
---
##### 💡 Итого:
> Shader keyword — это как `#define` в C#, но специфичный для GPU и управляемый из C# кода на лету.
### Часто встречающихся shader keywords в Unity
Вот список часто встречающихся **shader keywords** в Unity, особенно для стандартных шейдеров (например, URP, HDRP, Built-in):
---
##### 🔹 **Общие ключи (Built-in / URP / HDRP):**
|Ключ|Описание|
|---|---|
|`_NORMALMAP`|Используется нормал-карта|
|`_ALPHATEST_ON`|Включен альфа-тест (Alpha Clipping)|
|`_ALPHABLEND_ON`|Включено альфа-смешивание (Alpha Blending)|
|`_ALPHAPREMULTIPLY_ON`|Альфа-предумноженное смешивание|
|`_EMISSION`|Включено самосвечение (Emission)|
|`_METALLICGLOSSMAP`|Используется Metallic Gloss Map|
|`_SPECGLOSSMAP`|Используется Specular Gloss Map|
|`_PARALLAXMAP`|Используется Parallax карта (высотная карта)|
|`_DETAIL_MULX2`|Используется detail map (детализирующая текстура)|
|`_OCCLUSIONMAP`|Включена ambient occlusion карта|
|`_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A`|Smoothness считывается из альфа-канала Albedo|
|`_CLEARCOAT`|Включён Clear Coat слой (URP/HDRP)|
|`_CLEARCOATMAP`|Clear Coat map|
|`_REFLECTION_PROBE_BLENDING`|Используется смешивание reflection probes|
|`_REFLECTION_PROBE_BOX_PROJECTION`|Включена box проекция для reflection probes|
---
##### 🔹 **В URP (Universal Render Pipeline):**
|Ключ|Описание|
|---|---|
|`_SURFACE_TYPE_TRANSPARENT`|Поверхность прозрачная|
|`_ENVIRONMENTREFLECTIONS_OFF`|Выключены отражения окружения|
|`_SPECULARHIGHLIGHTS_OFF`|Выключены бликовые отражения|
|`_RECEIVE_SHADOWS_OFF`|Объект не принимает тени|
|`_ADDITIONAL_LIGHTS_VERTEX`|Дополнительные источники света рассчитываются на вершинах|
|`_ADDITIONAL_LIGHTS`|Включены дополнительные источники света|
|`_SHADOWS_SOFT`|Используются мягкие тени|
|`_MAIN_LIGHT_SHADOWS`|Основной источник света отбрасывает тень|
|`_MAIN_LIGHT_SHADOWS_CASCADE`|Включён каскад теней|
|`_SCREEN_SPACE_OCCLUSION`|Используется screen-space ambient occlusion (URP 12+)|
---
##### 🔹 **HDRP (High Definition RP):**
|Ключ|Описание|
|---|---|
|`_ENABLEDECALS`|Включены декали|
|`_ENABLEDBUFFER`|Используется DBuffer|
|`_MATERIAL_FEATURE_SUBSURFACE_SCATTERING`|Включён SSS|
|`_MATERIAL_FEATURE_TRANSMISSION`|Включена передача света (Transmission)|
|`_MATERIAL_FEATURE_ANISOTROPY`|Включён анизотропный BRDF|
|`_MATERIAL_FEATURE_IRIDESCENCE`|Включена радужность|
|`_MATERIAL_FEATURE_CLEAR_COAT`|Включён Clear Coat|
|`_DISABLE_SSR_TRANSPARENT`|Выключен screen-space reflection на прозрачных материалах|