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

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

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

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

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

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

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

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

  • 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 Framework. Например, нужен кастомный bloom с управляемым threshold или стилизованное виньетирование. На одном мобильном проекте мы сократили затраты на рендеринг на 25% за счёт оптимизации шейдера с 4ms до 1.1ms — экономия бюджета составила около 30% по сравнению с типовым решением. Мы гарантируем, что каждый шейдер проходит профилирование на целевых устройствах и не ломает существующие эффекты вроде TAA. Свяжитесь с нами для консультации — мы подберём оптимальный подход.

Когда стандартных эффектов недостаточно?

Unity URP/HDRP и Unreal Engine предоставляют Volume Framework для постобработки, но у каждого есть зоны, где стандартные эффекты не покрывают потребности конкретного визуального стиля. В URP самая частая боль — отсутствие нативного поддержания кастомных пассов в Renderer Feature без глубокого понимания ScriptableRenderPass и порядка выполнения в RenderPassEvent. Разработчики вставляют кастомный Blit в AfterRenderingPostProcessing и получают эффект, который накладывается поверх URP-овского стека вместо интеграции внутрь него — в результате TAA и FXAA либо не работают с кастомным материалом, либо двоят артефакты. В HDRP ситуация другая: Custom Pass работает через CustomPassVolume, и если шейдер использует _CameraDepthTexture без явного объявления в TEXTURE2D + SAMPLER под HDRP-макросами, он просто рендерит чёрный экран на некоторых платформах — без предупреждений в консоли. Unreal-специфика — другая: постобработка через Material с доменом Post Process работает быстро до первого столкновения с r.PostProcessAAQuality и тем, как TAA взаимодействует с кастомными SceneTexture нодами. Если шейдер читает PostProcessInput0 без учёта jitter offset, на движущейся камере появляются ghosting, который выглядит как баг рендерера, хотя причина в шейдере.

Как избежать ghosting при кастомных эффектах?

Ghosting возникает из-за неучёта jitter offset в TAA-совместимых шейдерах. При вставке кастомного пасса в конвейер необходимо явно передавать разницу между предыдущим и текущим кадром. В Unity для этого используется _ScreenParams и _Jitter в случае URP, в Unreal — параметры из PostProcessSceneView. На этапе интеграции мы всегда проверяем, корректно ли шейдер обрабатывает субпиксельное смещение, и при необходимости добавляем компенсацию. Профилирование с помощью RenderDoc и сравнение с референсным кадром позволяют выявить такие артефакты до передачи в продакшн.

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

Пошаговая инструкция:

  1. Анализ референса и постановка задачи — определяем, какой эффект нужен и на каких платформах.
  2. Прототипирование в ShaderGraph или Material Editor — быстрая проверка гипотезы за 1–2 дня.
  3. Написание HLSL/GLSL с учётом платформенных ограничений: для мобильных — mediump float, минимум сэмплов; для PC/консоли — multi-pass Blit и compute-шейдеры.
  4. Интеграция в пайплайн: ScriptableRenderPass для URP, CustomPassVolume для HDRP, Post Process Material для Unreal. Обязательно выставляем правильный RenderPassEvent и проверяем совместимость с TAA.
  5. Профилирование: RenderDoc, GPU Profiler, мобильные профайлеры. Оптимизируем до целевого FPS.

На одном из проектов — мобильная RPG в URP — заказчик хотел кастомный эффект «чернильного контура» поверх геометрии. Первый прототип через ScriptableRenderPass с Roberts Cross на depth давал 4ms на Adreno 650 при 1080p. После переписки на single-pass с упрощённым ядром и использованием _CameraDepthNormalsTexture вместо двух отдельных текстур — 1.1ms. Разница не в алгоритме, а в количестве текстурных фетчей. Получите консультацию нашего инженера — мы проанализируем ваш проект и предложим оптимальное решение.

Что входит в работу

Каждый шейдер поставляется с полным пакетом:

  • Исходный код шейдера (HLSL/GLSL) с комментариями
  • Интеграционный скрипт (ScriptableRenderPass / CustomPassVolume / Post Process Material)
  • Инструкция по настройке параметров в Volume Framework
  • Рекомендации по производительности для целевых платформ
  • Поддержка на этапе внедрения (до 2 консультаций)

Этапы работы над шейдером

Этап Что делается Примерные сроки
Разбор референса и ТЗ Анализ визуального стиля, определение алгоритма 1–2 дня
Прототип в ShaderGraph / Material Graph Быстрая проверка гипотезы, согласование 1–3 дня
HLSL-реализация Написание шейдера под целевую платформу 2–7 дней
Интеграция в рендер-пайплайн ScriptableRenderPass / CustomPassVolume / PP Material 1–3 дня
Профилирование и оптимизация Frame capture, GPU timing, оптимизация под таргет 1–4 дня
Документация и передача Комментарии в коде, инструкция по настройке 0.5–1 день

Сложные эффекты с несколькими пассами (например, volumetric fog через ray marching в постпроцессе или screen-space subsurface scattering) могут занимать 3–4 недели с учётом итераций.

Типичные ошибки при самостоятельной разработке

Большинство проблем — не в алгоритме, а в интеграции.

  • Неправильный RenderPassEvent. Вставка кастомного пасса в BeforeRenderingPostProcessing без понимания того, что URP на этом этапе ещё не применил Color Grading — в результате LUT накладывается поверх кастомного эффекта, а не под ним.
  • Игнорирование camera stacking. В URP при Overlay Camera кастомный ScriptableRenderPass, подключённый к Base Camera, не выполняется для Overlay — нужно регистрировать пасс в обоих Renderer Asset или использовать Universal Renderer с правильным флагом renderingLayerMask.
  • Хардкод разрешения. float2(1.0/1920.0, 1.0/1080.0) в шейдере вместо _ScreenParams.zw - 1 — на устройствах с нестандартным разрешением или при dynamic resolution эффект ломается.
  • Потеря HDR. Если эффект применяется после tonemap, а рассчитан для линейного HDR-буфера — цвета будут некорректные. Важно явно определить точку применения в пайплайне.
Сравнение типов шейдеров по платформам
Тип шейдера Mobile (Adreno 650) PC (RTX 3070)
Single-pass Blit <1ms <0.2ms
Multi-pass (3 Blit) 2-3ms <0.5ms
Compute shader 1.5-2ms <0.3ms

Проконсультируйтесь с нашим инженером — мы проанализируем ваш проект и предложим оптимальное решение. Закажите предварительную оценку — мы рассчитаем сроки и стоимость с учётом ваших требований.

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

Программист добавляет в сцену воду — получает синий прямоугольник. 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 рабочих дней в зависимости от сложности. Стоимость рассчитывается индивидуально — пишите, оценим ваш проект. Закажите разработку шейдеров — получите готовый результат с гарантией производительности.