В Unity шейдер (shader) — это программа, которая управляет тем, как объект будет выглядеть при рендеринге. Он запускается на GPU и обрабатывает каждый пиксель, вершину или треугольник.
Шейдер пишется на одном из специальном языке программирования. В Unity язык называется ShaderLab
Например, Шейдер могут переписать (дописать), чтобы гладкие поверхности отражали свет (в отражении был виден город).
Если я использую Universal Render Pipeline, то нужно использовать совместимые с ним шейдеры, иначе ничего работать не будут, модельки будут розовыми.
Если моделька розовая, то это значит, что возникла ошибка шейдера. Шейдер не скомпилировал.
В интернете можно скачать любой желаемый шейдер.
### Основные задачи, которые берёт на себя шейдер
**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