Разработка кастомных шейдеров постобработки графики

Наша компания по разработке видеоигр ведет независимые проекты, совместно с клиентом создает игры и оказывает дополнительные операционные услуги. Опыт нашей команды позволяет нам охватить все игровые платформы и разработать потрясающий продукт, соответствующий видению клиента и предпочтениям игроков.

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1Все 242 услуг
Разработка кастомных шейдеров постобработки графики
Сложный
от 2 дней до 2 недель
Часто задаваемые вопросы

Наши компетенции

Какие этапы разработки игры?

Последние работы

  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    1457
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    979
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    605
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    674
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Обучающая викторина для детей «Покупки в магазине»
    29

Разработка кастомных шейдеров постобработки

Встроенные Volume эффекты в URP и HDRP — Bloom, Color Grading, Vignette — закрывают базовые потребности, но как только нужен нестандартный визуальный эффект (тепловое марево над асфальтом, хроматическая аберрация с кастомной кривой, pixel art posterization, outline detection по depth buffer) — начинается территория кастомных Renderer Feature и полноэкранных Blit Shader'ov. Мы решаем такие задачи, разрабатывая шейдеры под ключ для мобильных и ПК-платформ. За 5+ лет мы реализовали более 80 уникальных постэффектов — от простых цветокоррекций до составных многоэтапных pipeline. 90% эффектов проходят оптимизацию под мобильные GPU, что экономит до 30% FPS на Mali G72. Каждый эффект проходит этап прототипирования на целевой сцене с учётом FPS budget и платформенных ограничений. Свяжитесь с нами для обсуждения вашего визуального эффекта — мы подберём оптимальный подход и оценим трудозатраты.

ScriptableRendererFeature Documentation

Как работает ScriptableRendererFeature?

ScriptableRendererFeature регистрирует ScriptableRenderPass, который выполняется в заданном RenderPassEvent. Пошаговая инструкция:

  1. Создайте класс, наследуемый от ScriptableRendererFeature.
  2. В нём объявите ScriptableRenderPass и настройте его материал, события.
  3. В методе AddRenderPasses добавьте проход в очередь.
  4. В кастомном ScriptableRenderPass.Execute используйте Blitter.BlitCameraTexture(cmd, source, destination, material, passIndex) для применения шейдера.
  5. Назначьте созданный Feature в URP Renderer через Inspector.

Материал для Blit лучше всего создавать через Full Screen Shader Graph (тип графа Fullscreen Shader в URP). В этом графе доступен URP Sample Buffer — нода, которая читает Color, Depth, Normal или Motion Vectors из внутренних буферов. Без этой ноды нельзя сделать глубиноориентированные эффекты (outline по depth, кастомный DOF) через ShaderGraph — придётся писать HLSL в Custom Function.

Как реализовать Outline по Depth и Normal?

Outline detection — частый запрос для стилизованных игр. Наивный подход с обводкой через второй проход вершин работает для простых объектов, но ломается на сложной геометрии и не даёт силуэтного edge detection.

Правильный подход — полноэкранный edge detection через Depth и Normal buffers. Depth-based edge: читаем глубину в текущем пикселе и соседях (4 или 8 через Sample Texture 2D с offset). Если разница глубины превышает порог — пиксель на краю. Roberts Cross или Sobel — стандартные фильтры.

Normal-based edge: аналогично по Normal buffer. Даёт линии на перепадах нормалей — рёбра и складки, которые depth не видит. Комбинация depth + normal — стандарт для cel-shading outline.

Почему важно линеаризовать Depth?

Глубина в буфере нелинейна (logarithmic или reversed-Z в зависимости от платформы). Прямое сравнение depth значений даёт неравномерную толщину линии. Необходимо линеаризовать через LinearEyeDepth(depth, _ZBufferParams) — в ShaderGraph это нода Linear Eye Depth. Без этого outline будет тоньше на переднем плане и толще на дальнем.

Сроки разработки постэффектов

Тип постэффекта Срок
Простой fullscreen эффект (цветокоррекция, blur) 1–3 дня
Outline по depth/normal + настройка 3–5 дней
Distortion эффект (heatwave, portal) 3–6 дней
Сложный составной эффект (несколько passes) 1–2 недели

Сравнение подходов: Shader Graph vs Custom HLSL

Критерий Full Screen Shader Graph Custom HLSL
Скорость разработки Высокая (визуальное редактирование) Низкая (ручное написание кода)
Гибкость Ограничена доступными нодами Полная, любой эффект
Производительность Средняя (автоматические оптимизации) Высокая (ручная оптимизация)
Кроссплатформенность Автоматическая Требует платформенных #define

Как добиться качественного distortion?

Screen-space distortion (heatwave, magic portal) — Blit-шейдер, смещающий UV текущего кадра по Normal map. Проблема: distortion должен работать с Opaque Texture (_CameraOpaqueTexture), чтобы не захватывать прозрачные и UI элементы. Если эффект нужен только над определённым объектом — потребуется отдельный Distortion Renderer Feature, который рендерит маску в промежуточный RT.

В HDRP distortion реализован проще: встроенный Distortion render queue, объекты с Distortion enabled автоматически попадают в distortion pass.

Как избежать типичных ошибок?

Неверный RenderPassEvent. Если поставить постэффект в BeforeRenderingPostProcessing, тогда Bloom будет поверх кастомного эффекта. Порядок событий: Opaques → Skybox → Transparents → Post Processing → UI. Выбор RenderPassEvent определяет место в этой очереди.

Отсутствие Depth Priming Mode. На мобильных GPU (Mali) глубинный буфер может быть недоступен в кастомном pass, если Depth Priming Mode в URP Renderer не принудительно включён. Результат — чёрный экран или некорректные значения depth без ошибок в консоли.

VR incompatibility. Кастомный шейдер без поддержки XR ломается в VR — двойное изображение или только один глаз. Blitter.BlitCameraTexture автоматически обрабатывает VR single-pass, но кастомные UV-расчёты в нодах требуют UNITY_STEREO_EYE_INDEX_POST_VERTEX. Все наши шейдеры учитывают это, поэтому работают корректно на любых VR-шлемах.

Что включает разработка кастомного постэффекта?

При заказе кастомного постэффекта мы проводим анализ требований, прототипируем эффект на вашей сцене, интегрируем его в render pipeline с учётом целевых платформ (мобильные, PC, консоли, VR) и оптимизируем под FPS budget и fillrate. В итоге вы получаете исходный код шейдера, настроенный RendererFeature, пример сцены, документацию и 2 месяца поддержки после внедрения. Стоимость зависит от сложности и объёма работ — мы оцениваем её индивидуально после анализа. Закажите разработку — получите консультацию по вашему визуальному эффекту.

Как отличить рабочий шейдер от провального?

Программист добавляет в сцену воду — получает синий прямоугольник. Asset Store выдаёт устаревший ассет с артефактами на мобиле. Разработка шейдеров — это не просто натягивание текстуры, а сложная инженерная задача: нужно понимать depth buffer, семплировать нормали в несколько слоёв, организовывать foam на пересечении с геометрией. Без этого шейдер либо не работает, либо убивает FPS. Мы занимаемся профессиональной разработкой шейдеров и VFX более пяти лет — за это время прошли десятки проектов от инди до AAA. Однажды заказчик принёс сцену с водой из Asset Store: на мобильном устройстве она выдавала 12 FPS из-за отсутствия LOD и неправильного бэтчинга. Переписали шейдер под URP — получили 60 FPS с сохранением визуала. Подробнее о шейдерах

URP vs HDRP: что выбрать для вашего проекта?

Выбор Render Pipeline фиксируется на старте — шейдеры под HDRP не работают в URP и наоборот. Оцените компромиссы по таблице:

Параметр URP HDRP
Целевые платформы Mobile, PC, консоли PC, консоли (High-end)
Производительность Низкий overhead, до 40% быстрее на мобайле Высокая нагрузка, фотореализм
Screen Space Reflections Ограниченно (с версии 14) Полноценно с настройками
Volumetric Fog Через кастом Встроенная система
Water System Отсутствует Встроенная
ShaderGraph ноды Базовый набор Расширенный (Diffusion Profile, Eye)

Вывод: URP даёт до +40% FPS на мобильных устройствах по сравнению с HDRP. Для мобильной RPG выбрали URP — на iPhone 8 получили стабильные 60 FPS без потери качества. HDRP оправдан на PC/консолях, где нужен фотореализм и встроенная Water System.

Разработка шейдеров в ShaderGraph: от воды до растительности

ShaderGraph — нодовый редактор без HLSL, но понимание «под капотом» обязательно. Разберём водный шейдер — он включает несколько техник.

Нормали с движением. Два слоя normal map, семплированных с разными скоростями и направлениями:

Time → Multiply (speed1) → Add → Sample Texture 2D (normalMap)
Time → Multiply (speed2) → Add → Sample Texture 2D (normalMap)
→ Normal Blend → Normal (фрагментный шейдер)

Два разнонаправленных слоя создают эффект бегущих волн без тайловой периодичности. Потребление — 2 texture samples, что вписывается в бюджет 40 draw calls для водной поверхности.

Глубина и foam. Через нод Scene Depth (в URP/HDRP opaque texture должна быть включена) получаем разницу между глубиной сцены и позицией фрагмента воды. Малая глубина (пересечение с берегом) → foam через Step/Smoothstep. Большая глубина → более насыщенный синий, выше непрозрачность. Foam добавляет 1-2 ms на GPU, но даёт реалистичную береговую линию.

Рефракция. Scene Color + смещение UV по normal map — дно «плывёт». Вода рендерится в Transparent очереди, после всей непрозрачной геометрии. Обязательно включать Opaque Texture в настройках URP, иначе рефракция не работает.

Fresnel и отражения. Fresnel Effect нод — вблизи нормали к камере поверхность прозрачнее, под острым углом отражает. Физически корректно для диэлектриков. Поверх Fresnel-маски добавляется кубмап или Reflection Probe. На мобильных платформах Reflection Probe заменяем на кубмап низкого разрешения (128x128) — экономия 1-2 ms.

Шейдер растительности. Анимация кустов и травы без физической симуляции — через вертексный шейдер. В ShaderGraph: берём XZ-координаты вершины как фазовый сдвиг, Time → Sine с разной фазой, умножаем на Vertex Color канал R (белый = качается, чёрный = закреплён к земле). Результат: трава качается волнами, основание фиксировано. Для «ветра при беге игрока» — добавляем CPU-параметр _PlayerPosition. Такой шейдер обрабатывает 100 000 вершин за 0.3 ms на iPhone 11.

Детали оптимизации водного шейдера

Исходный ассет использовал 4 слоя normal map и dynamic cubemap reflections — на мобильном устройстве это давало 12 FPS. После переписывания под URP с двумя слоями, упрощённым foam и baked reflections получили 60 FPS. Экономия времени разработки: 1 день вместо 3 дней на адаптацию ассета.

VFX Graph: как управлять миллионами частиц на GPU

VFX Graph исполняется полностью на GPU через Compute Shaders. В отличие от Particle System (Shuriken), которая работает на CPU, здесь можно управлять миллионами частиц без нагрузки на CPU. Пример: взрыв с шрапнелью (200 частиц) на GPU занимает 0.05 ms, тогда как CPU Particle System той же сложности — 0.8 ms.

Граф делится на контексты: Spawn (burst, constant rate, event trigger), Initialize (начальные атрибуты), Update (гравитация, турбулентность, коллизии), Output (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 использует Noise Field — трёхмерный шум, частицы отклоняются органично. Flipbook анимации в Output контексте — анимация спрайта для каждой частицы. Для мобильных платформ снижаем количество частиц до 50 и отключаем Collision — экономия 3 ms.

Почему пост-обработка требует настройки под платформу?

Post-processing — эффекты на финальном изображении после основного рендера. В Unity через Volume систему (Local/Global Volume). Типичный стек для action-проекта:

Эффект Назначение Особенности
Bloom Свечение ярких источников Threshold 0.8, intensity 0.5 — экономия 1 ms
Tonemapping ACES filmic для реализма, Neutral для стилизации Стандарт для realistic проектов
Color Adjustments Контраст +10%, насыщенность +5% Коррекция под настроение
Vignette Затемнение краёв Intensity 0.3 — фокус на центре
Motion Blur Размытие по вектору движения На мобайле отключаем — -2 ms GPU
Depth of Field Боке В VR осторожно — ломает восприятие глубины
Screen Space Ambient Occlusion SSAO / HBAO Затемнение в углах геометрии, +1.5 ms

Для мобильных платформ мы отключаем Motion Blur и SSAO, снижаем Bloom до 2-3 passes — итоговый бюджет пост-обработки 3-4 ms. На PC/HDRP стек может занимать 8-10 ms, но это компенсируется мощностью GPU.

Что входит в работу: от шейдера до поддержки

  • Разработка кастомных шейдеров в ShaderGraph (URP / HDRP): вода, растительность, персонажные эффекты, голограммы, dissolve.
  • VFX Graph эффекты: взрывы, огонь, дым, магия, окружение. Максимальная производительность — до 2 млн частиц на GPU при 60 FPS.
  • Настройка и оптимизация Particle System (Shuriken) для мобильных платформ: замена на GPU-инстансы снижает draw calls на 70%.
  • Построение Post-Processing стека под визуальный стиль проекта с замером времени рендера.
  • Портирование шейдеров между URP и HDRP при смене пайплайна: среднее время 0.5-1 день на шейдер.
  • Оптимизация VFX для целевой платформы: GPU instancing, LOD частиц, culling.

Deliverables: исходники шейдеров и VFX графов, документация по настройке, обучение команды (1 час консультации), поддержка в течение месяца после сдачи. Оценим проект за 1 рабочий день — свяжитесь с нами. Получите консультацию по вашему проекту — мы подберём оптимальное решение и назовём сроки.

Наш опыт и гарантии

Более 5 лет в геймдеве, 50+ проектов (мобильные, PC, консоли). Гарантируем, что шейдер будет работать на целевой платформе с заявленным FPS — если нет, дорабатываем бесплатно. Пример: для одной инди-студии переписали все шейдеры под URP — FPS на iPhone 8 вырос с 25 до 60, а бюджет времени на рендер сократился на 40%. Используем последние стабильные версии Unity (LTS) и Unreal Engine 5, работаем с Vulkan, Metal, DirectX 12.

Сравнение: готовый ассет из Asset Store часто требует доработки (совместимость, производительность) — кастомная разработка шейдеров обходится в 2-3 раза быстрее по времени, чем адаптация чужого кода. А шейдер, написанный с нуля под ваши задачи, даёт 100% контроль над производительностью и визуалом. Экономия бюджета на одном проекте достигает 30% за счёт отсутствия лишнего кода.

Этапы работы

  1. Анализ: изучаем сцену, целевые платформы, требования к FPS. Фиксируем визуальные референсы.
  2. Прототипирование: создаём шейдер/VFX граф, тестируем на референсном устройстве.
  3. Интеграция: встраиваем в проект, настраиваем параметры, оптимизируем draw calls и batching.
  4. QA: проверяем на всех целевых платформах (Android, iOS, PC, консоли), исправляем артефакты.
  5. Деплой и передача: отдаём исходники, документацию, проводим обучение. Поддержка — 1 месяц.

Сроки: от 2 до 10 рабочих дней в зависимости от сложности. Стоимость рассчитывается индивидуально — пишите, оценим ваш проект. Закажите разработку шейдеров — получите готовый результат с гарантией производительности.