В Unity шейдер (shader) — это программа, которая управляет тем, как объект будет выглядеть при рендеринге. Он запускается на GPU и обрабатывает каждый пиксель, вершину или треугольник.
Шейдер пишется на одном из специальном языке программирования. В Unity язык называется ShaderLab
Например, Шейдер могут переписать (дописать), чтобы гладкие поверхности отражали свет (в отражении был виден город).
Если я использую Universal Render Pipeline, то нужно использовать совместимые с ним шейдеры, иначе ничего работать не будут, модельки будут розовыми.
Если моделька розовая, то это значит, что возникла ошибка шейдера. Шейдер не скомпилировал.
В интернете можно скачать любой желаемый шейдер.
Весь код, который написан для фрагментного этапа, выполняется для каждого пикселя на экране (при условии, что разрешение игры равно разрешению экрана). Например, если на весь экран будет отображаться объект, и если разрешение экрана 1920 х 1080 (Full HD), то 1920 умножаем на 1080 и получаем 2 073 600 пикселей, то есть ~2 млн раз выполнится код для фрагментного этапа.
Для примера, вот шейдер, написанный в Shader Graph. все, что тянется в блок Fragment, будет выполнено для каждого пикселя.
![[Снимок экрана 2025-06-01 в 11.43.42.png]]
Если Вы не назначили, например, Normal Map (нормальную текстуру) в материале, который использует `URP › Simple Lit`, Unity компилирует и выбирает вариант шейдера без кода обработки нормалей:
- Переключатель `_NORMALMAP`
В инспекторе материал автоматически включает/выключает глобальный ключ-слово (shader keyword) `_NORMALMAP`. Когда текстуры нет – ключ не активен.
### Основные задачи, которые берёт на себя шейдер
**1. Вершинный этап (Vertex Shader)**
— Обрабатывает каждую вершину:
- преобразует позицию в экранные координаты,
- передаёт данные дальше (нормали, UV, цвета и т.п.).
**2. Фрагментный этап (Fragment/Pixel Shader)**
— Обрабатывает каждый пиксель:
- рассчитывает финальный цвет,
- учитывает освещение, текстуры, прозрачность и т.д.
##### Дополнительно (но вторично):
- Geometry Shader (редко используется) — может создавать новые треугольники.
- Tessellation (в HDRP) — для деления мешей на GPU.
- Compute Shader — не связан напрямую с рендером, но тоже работает на GPU.
### Где реализуются конкретные эффекты
##### Модели освещения (Lighting Models)
- **Где:** фрагментный шейдер (чаще всего).
- **Примеры:** Lambert, Blinn-Phong, кастомные BRDF.
- **Почему:** освещение влияет на финальный цвет каждого пикселя.
##### Текстуры и карты (Albedo, Normal, Metallic, Roughness и т.п.)
- **Где:** фрагментный шейдер.
- **Почему:** пиксельный шейдер читает текстуры и определяет визуальные свойства материала в каждой точке поверхности.
##### Визуальные эффекты (Dissolve, Rim Light, Fresnel, и т.п.)
- **Где:** фрагментный шейдер.
- **Почему:** эффекты зависят от положения пикселя, угла обзора и часто — от текстур или градиентов.
##### Прозрачность, альфа-тест, альфа-блендинг
- **Где:** фрагментный шейдер + настройки материала (Blend, ZWrite и т.п.).
- **Почему:** влияет на то, как итоговый цвет пикселя сочетается с фоном.
##### Тени (ShadowCaster и освещённость)
- **Где:**
- генерация теней: отдельный pass (`ShadowCaster`), вершины + фрагменты.
- получение теней: фрагментный шейдер (`UNITY_LIGHT_ATTENUATION()` и подобные макросы).
- **Почему:** вычисляется по положению пикселя относительно источников света и shadow maps.
##### 📌 А что делается в вершинном шейдере?
Вершинный этап нужен, чтобы:
- трансформировать вершины из локального пространства в экранное (MVP-матрицы),
- передать во фрагментный этап интерполируемые данные: UV, нормали, позиции, tangents и т.д.,
- иногда: сделать волны, анимацию или сжатие/растяжение объектов.
Как выглядит код некого шейдера в Unity.
https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/Mobile/Mobile-Diffuse.shader