Налаштування глобального освітлення (Global Illumination) у іграх
Сцена виглядає правдоподібно, коли світло не тільки падає прямо від джерела, а й відбивається від стін, перетікає через дверні отвори та забарвлює затінені зони теплими чи холодними відтінками. Без GI все це доводиться імітувати вручну через додаткові Fill Lights—і зображення все одно виглядає пласким. Правильно налаштоване Global Illumination усуває цей компроміс.
Чому GI-конвеєр ламається частіше, ніж здається
Найчастіша скарга: «запекли лайтмапи, а стики між плитками світять білою смугою». Це розбіжність розгортки UV у Lightmap UV (UV Channel 1)—острови або надто щільно запаковані, або Texels Per Unit встановлено однаково для об'єктів різного масштабу. У результаті Progressive Lightmapper не встигає корректно семплювати граничні пікселі, і замість плавного переходу отримуємо артефакт.
Друга типова ситуація: Realtime GI через Enlighten працює в Editor, але у білді освітлення «стрибає» при завантаженні сцени. Причина зазвичай у тому, що Lighting Data Asset не був включений у білд—його потрібно явно прописати в Scene settings або генерувати через Lighting.BakeAsync() та зберігати в Addressables.
Окрема історія з HDRP та Lumen-подібними рішеннями. У HDRP Screen Space GI (SSGI) дає гарний результат, але вимагає коректного налаштування Ray Tracing Acceleration Structure—якщо у сцені є skinned meshes з увімкненим Raytracing, кожен кадр перераховує BVH і Frame Time різко зростає. Для персонажів зі скелетом краще вимкнути Raytracing на компоненті Mesh Renderer та виключити їх із Ray Tracing Acceleration Structure.
Як будується GI-конвеєр на реальних проектах
Перший крок—визначити, який режим потрібен: повністю запечений (Baked Indirect), змішаний (Mixed) чи повністю реалтаймовий. Це не справа смаку—це архітектурне рішення, яке впливає на весь конвеєр.
Baked Indirect підходить для статичних сцен—казуальні ігри, RPG з фіксованими рівнями. У Unity налаштовуємо через Window → Rendering → Lighting, вибираємо Progressive GPU Lightmapper (швидше на більшості сцен, ніж CPU-варіант), встановлюємо Lightmap Resolution окремо для кожного типу поверхні через Lightmap Parameters Asset. Для зовнішніх сцен з великими відкритими простори розумно знизити роздільність для віддалених об'єктів через LOD Groups.
Mixed Mode з Subtractive або Shadowmask—компроміс для мобільних проектів з динамічними персонажами. Shadowmask зберігає запечені тені в окремому каналі текстури і дозволяє динамічним об'єктам відкидати тені в реалтаймі поверх запечених. Subtractive простіший і дешевший, але некоректно працює з кольоровими тенями.
Для повністю динамічних сцен—Light Probes та Reflection Probes. Light Probe Group розміщуємо вручну в ключових точках переходу світла (дверні отвори, кути кімнат, переходи вулиця/приміщення). Автоматичне розміщення через Probe Volume (HDRP/URP Adaptive Probe Volume) з'явилось у Unity 2022.2 і значно прискорює роботу на великих рівнях—зони з частими змінами освітлення отримують більше зондів, відкриті однорідні простори—менше.
Reflection Probes вимагають окремої уваги. Box Projection для внутрішніх просторів обов'язковий—без нього відбиття на підлозі виглядають як знято з вулиці. Тип Realtime з Refresh Mode Every Frame убиває продуктивність, тому для більшості сцен використовуємо Baked або Realtime з Refresh Mode On Awake + ручний виклик RenderProbe() при змінах сцени.
Кейс: налаштування GI для ізометричної RPG
На одному проекті—ізометричній RPG з тайловими рівнями—початковий час запікання становив 4 години для сцени середнього розміру. Після аудиту виявилось: у 60% об'єктів Contribute GI був увімкнений за замовчуванням, включаючи декоративні дрібні пропси (камені, трава) з площею UV-острова у 2–4 пікселя. Progressive Lightmapper витрачав величезний час на семплювання об'єктів, які не давали візуального внеску в підсумковий лайтмап.
Рішення: винесли дрібні пропси в окремий Lightmap Parameters Asset з параметром Indirect Resolution 0.5 (проти 2.0 у основних поверхонь), а декоративні об'єкти менші за 0.5 м² повністю перевели в Receive GI: Light Probes. Час запікання впав до 35 хвилин, візуальна якість не змінилась—дрібні об'єкти коректно отримують освітлення від найближчого Light Probe.
Етапи роботи над налаштуванням GI
Робота починається з аудиту поточного стану: дивимось Scene Lighting Stats, аналізуємо кількість та розмір лайтмап-текстур, перевіряємо UV1-розгортку через Lightmap UV Preview. На цьому етапі видно вже 80% проблем.
Далі—узгодження архітектурного рішення (Baked/Mixed/Realtime) залежно від платформи та художнього стилю. Якщо проект уже у продакшені, зміна режиму може потребувати переробки шейдерів та художнього переосмислення освітлення.
Після вибору стратегії—налаштування параметрів запікання, розстановка Light Probe Group і Reflection Probe, тестові запікання з аналізом артефактів. Фінальний етап—валідація на цільовому залізі через GPU Profiler та перевірка коректності LOD-переходів освітлення.
| Масштаб сцени | Орієнтовні строки |
|---|---|
| Одна невелика локація (indoor, до 50 об'єктів) | 2–5 днів |
| Середній рівень (mixed indoor/outdoor, до 300 об'єктів) | 1–2 тижні |
| Відкритий світ або комплекс з кількох сцен | 3–6 тижнів |
Типові помилки при налаштуванні GI
Включати Contribute GI на всіх об'єктах без розбору—перша й найчастіша помилка. Особливо болісно це на рівнях з рослинністю: кожен екземпляр трави або листя з увімкненим Contribute GI багатократно збільшує час запікання та плодить артефакти в лайтмапах.
Використовувати однаковий Lightmap Resolution для всієї сцени. Далекі гори та близький інтер'єр не можуть мати одинакове texels-per-unit—різниця повинна бути 4–8x на користь близьких поверхонь.
Забувати про Lighting Seam Stitching. У Progressive Lightmapper він включається в Mesh Renderer → Stitch Lightmap Seams і виправляє більшість стиків між сусідніми плитками рівня без ручних правок.
Пренебрігати перевіркою через Rendering Debugger (Window → Analysis → Rendering Debugger). Режим перегляду Lighting → Indirect Diffuse одразу показує зони з нульовим внеском GI—саме там часто приховуються неправильно налаштовані об'єкти або прогалини в покритті Light Probe.





