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

Розробка кастомних шейдерів постобробки Вбудовані Volume ефекти в URP та HDRP — Bloom, Color Grading, Vignette — закривають базові потреби, але як тільки потрібен нестандартний візуальний ефект (теплове марево над асфальтом, хроматична аберація з кастомною кривою, pixel art posterization, outline

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1526
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1030
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    657
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    738
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    142

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

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