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

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

Від імерсивних застосунків до ігрових світів і 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'ів. Ми вирішуємо такі задачі, розробляючи шейдери під ключ для мобільних та ПК-платформ. За 5+ років ми реалізували понад 80 унікальних пост-ефектів — від простих кольорокорекцій до складних багатоетапних pipeline. 90% ефектів проходять оптимізацію під мобільні GPU, що економить до 30% FPS на Mali G72. Кожен ефект проходить етап прототипування на цільовій сцені з урахуванням FPS budget та платформених обмежень. Зв'яжіться з нами для обговорення вашого візуального ефекту — ми підберемо оптимальний підхід та оцінимо трудозатрати.

Документація ScriptableRendererFeature

Як працює 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 та неправильного batching. Переписали шейдер під URP — отримали 60 FPS зі збереженням візуалу.

URP vs HDRP: що обрати для вашого проекту?

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

Параметр URP HDRP
Цільові платформи Mobile, PC, консолі PC, консолі (High-end)
Продуктивність Низький overhead, до 40% швидше на мобайлі Високе навантаження, фотореалізм
Screen Space Reflections Обмежено (з версії URP 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.

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. Як зазначено в Unity Graphics Programming, налаштування пост-обробки під конкретний профіль GPU дає стабільний FPS без артефактів.

Що входить у роботу: від шейдера до підтримки

  • Розробка кастомних шейдерів у 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 робочий день — зв'яжіться з нами. Отримайте консультацію щодо вашого проекту — ми підберемо оптимальне рішення та назвемо терміни.

Наш досвід та гарантії

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