Шейдеры и визуальные эффекты
Программист добавляет в сцену воду — и получает синий плоский прямоугольник. Asset Store даёт что-то из 2018 года с артефактами на мобиле. Написать нормальный водный шейдер своими руками — задача нетривиальная: нужно понимать, как работает depth buffer, как семплировать нормали в несколько слоёв, как организовать foam на пересечении с геометрией. Без этого понимания шейдер либо не работает, либо убивает производительность.
Шейдеры и VFX — область, где визуальное качество напрямую зависит от технических знаний рендер-пайплайна.
URP vs HDRP: выбор определяет инструментарий
URP (Universal Render Pipeline) — оптимизирован под широкий диапазон платформ, включая мобайл. ShaderGraph в URP поддерживает большинство нод, но некоторые возможности ограничены (например, объёмное освещение — только через кастомные решения, Screen Space Reflections — в ограниченном виде с версии 14+).
HDRP (High Definition Render Pipeline) — PC и консоли, фотореалистичный рендеринг. Полный набор: Screen Space Reflections, Contact Shadows, Volumetric Fog, Decal Projectors, Water System (с Unity 2022.2). ShaderGraph в HDRP имеет дополнительные ноды, специфичные для пайплайна (Diffusion Profile для SSS, Eye шейдер).
Это принципиальный момент: шейдер, написанный под HDRP, не будет работать в URP и наоборот. Выбор пайплайна фиксируется на старте проекта.
ShaderGraph: разработка кастомных шейдеров
ShaderGraph — нодовый редактор шейдеров в Unity. Позволяет создавать шейдеры без написания HLSL-кода. Но понимание того, что происходит «под капотом», необходимо — иначе граф будет работать непредсказуемо.
Водный шейдер в деталях
Вода — хороший пример для разбора, потому что включает несколько независимых техник:
1. Нормали с движением Два слоя normal map текстур, семплированных с разными скоростями и направлениями движения UV:
Time → Multiply (speed1) → Add → Sample Texture 2D (normalMap)
Time → Multiply (speed2) → Add → Sample Texture 2D (normalMap)
→ Normal Blend (оба слоя) → Normal (фрагментный шейдер)
Два разнонаправленных слоя создают эффект бегущих волн без тайловой периодичности.
2. Глубина и foam
Через нод Scene Depth (только URP/HDRP, Opaque texture должна быть включена) получаем глубину под водой. Разница между глубиной сцены и позицией фрагмента воды даёт water depth:
- Малая глубина (пересечение с берегом, камнями) → пена (foam). Через
StepилиSmoothstepпо этому значению создаётся маска пены. - Большая глубина → более насыщенный синий, непрозрачнее.
3. Рефракция (искажение дна)
Scene Color нод + смещение UV по normal map. Дно через воду «плывёт». Важно: Scene Color захватывает opaque-объекты, поэтому вода должна рендериться в Transparent очереди, после всей непрозрачной геометрии.
4. Fresnel и отражения
Fresnel Effect нод — вблизи нормали к камере поверхность прозрачнее, под острым углом — отражает. Это физически корректно для диэлектриков. Поверх Fresnel-маски добавляется кубмап-отражение или Reflection Probe.
Шейдер растительности
Анимация кустов и травы без физической симуляции — через вертексный шейдер. В ShaderGraph:
- Нод
Position(Object Space) → берём XZ-координаты вершины как фазовый сдвиг. -
Time→Sineс фазовым сдвигом — получаем разную фазу для каждой вершины. - Умножаем на
Vertex Colorканал R (белый = качается, чёрный = закреплён к земле) — основание куста не двигается. -
Addк позиции вершины по XZ.
Результат: трава качается волнами, основание зафиксировано. Для «ветра при беге игрока» — добавляем CPU-параметр _PlayerPosition, вычисляем направление и силу воздействия в шейдере.
VFX Graph: система частиц на GPU
VFX Graph — система частиц, исполняемая полностью на GPU через Compute Shaders. Принципиальное отличие от Particle System (Shuriken): Shuriken работает на CPU, VFX Graph — на GPU. Это означает возможность управлять миллионами частиц без нагрузки на CPU.
Архитектура VFX Graph
Граф делится на контексты:
- Spawn Context — условия спауна: burst (залп), constant rate (поток), событийный триггер.
- Initialize Context — начальные значения атрибутов частицы: позиция, скорость, размер, цвет, lifetime.
- Update Context — логика на каждом кадре: гравитация, турбулентность, коллизии, аттракторы.
- Output Context — как рисовать частицу: Quad, Mesh, Lit/Unlit, Distortion.
Пример: взрыв с шрапнелью
Spawn: Single Burst (count: 200)
↓
Initialize:
Position: Sphere Volume (radius: 0.1) // точка взрыва
Velocity: Spherical направление * Random(5, 15) // разброс скоростей
Size: Random(0.05, 0.3)
Lifetime: Random(0.5, 2.0)
Color: Gradient по lifetime (белый → оранжевый → серый)
↓
Update:
Gravity (force: -9.8)
Drag (coefficient: 0.2) // торможение воздухом
Turbulence (intensity: 2.0) // хаотичность
Collision (SDF сцены или Depth Buffer) // искры от пола
↓
Output Quad (Unlit):
Texture: искра/горящая точка
Blend Mode: Additive
Turbulence через VFX Graph использует Noise Field — текстуру трёхмерного шума в пространстве. Частицы отклоняются по этому полю, создавая органичное движение дыма, огня, магии.
Flipbook анимации в Output контексте — анимация спрайта для каждой частицы (огонь, взрыв, дым в виде последовательности кадров). Параметр Flipbook Size задаёт сетку, Flipbook Index Blend — плавное смешение между кадрами.
Post-Processing
Post-processing — эффекты на финальном изображении после основного рендера. В Unity — через Volume система (Local/Global Volume).
Стек для типичного action-проекта:
| Эффект | Назначение |
|---|---|
| Bloom | Свечение ярких источников. Threshold и intensity — важно не переусердствовать. |
| Tonemapping | ACES filmic — стандарт для реалистичных проектов. Нейтральный — для стилизации. |
| Color Adjustments | Коррекция контраста, насыщенности, Color Filter для биома. |
| Vignette | Затемнение краёв — усиливает фокус на центре. |
| Motion Blur | Размытие по вектору движения. На мобайле — отключить. |
| Depth of Field | Боке. В VR — осторожно: DOF ломает восприятие глубины. |
| Screen Space Ambient Occlusion | SSAO / HBAO — затемнение в углах геометрии в рантайме. |
Amplify Shader Editor — альтернатива ShaderGraph для Unity, популярная до того, как ShaderGraph стал стабильным. Ряд проектов всё ещё использует ASE из-за большего количества готовых примеров и совместимости со старыми версиями Unity. По функциональности сопоставим с ShaderGraph.
Что мы делаем в рамках услуги
- Разработка кастомных шейдеров в ShaderGraph (URP / HDRP): вода, растительность, персонажные эффекты, голограммы, dissolve.
- VFX Graph эффекты: взрывы, огонь, дым, магия, окружение.
- Настройка и оптимизация Particle System (Shuriken) для мобильных платформ.
- Построение Post-Processing стека под визуальный стиль проекта.
- Портирование шейдеров между URP и HDRP при смене пайплайна.
- Оптимизация VFX для целевой платформы: GPU instancing, LOD частиц, culling.





