Настройка глобального освещения (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 хранит запечённые тени в отдельном каналe текстуры и позволяет динамическим объектам отбрасывать тени в реалтайме поверх запечённых. Subtractive проще и дешевле, но некорректно работает с цветными тенями.
Для полностью динамических сцен — Light Probes и Reflection Probes. Light Probe Group размещаем вручную в ключевых точках перехода света (дверные проёмы, углы комнат, переходы улица/помещение). Автоматическое размещение через Probe Volume (HDRP/URP Adaptive Probe Volume) появилось в Unity 2022.2 и значительно ускоряет работу на больших уровнях — зоны с частыми изменениями освещения получают больше зондов, открытые однородные пространства — меньше.
Reflection Probes требуют отдельного внимания. Box Projection для interior spaces обязателен — без него отражения на полу выглядят как снятые с улицы. Тип 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.





