**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 на прозрачных материалах|