LightmapGI: UV2, запекание и проверка результата
Подготовка статической геометрии, режимы света, данные .lmbake и диагностика ошибок.
LightmapGI
LightmapGI заранее рассчитывает освещение статической геометрии и сохраняет его в текстурных атласах. Во время игры атласы читаются вместо повторного вычисления того же непрямого света. Это экономит вычисления, но занимает память и не делает освещение движущейся геометрии полностью динамическим.
Запекание требует сборки с lightmapper_rd и GPU, поддерживающего RenderingDevice. В этом проходе использован установленный редактор Forward+/Vulkan. Отрисовка уже подготовленных карт и их запекание — разные возможности: готовые карты могут использоваться и там, где GPU-запекание недоступно.
Подготовить меши
- Сохраните уровень
.rscene. Разместите LightmapGI под общим корнем с запекаемой геометрией. Штатная команда обходит родителя LightmapGI и потомков; если сам LightmapGI — корень уровня, обходит его потомков. - Для запекаемых MeshInstance3D установите
GIMode = Static. Нужны видимый меш с треугольными поверхностями, нормалями и вторым набором UV. - Подготовьте UV2 без перекрытия островов, с достаточными промежутками. Обычные UV для повторяющейся текстуры не заменяют UV2: разным граням нужны отдельные места в атласе освещения.
- Проверьте масштаб объектов, нормали и толщину стен до запекания. Увеличение числа лучей не исправит ошибочную развёртку или дырку в потолке.
| Источник меша | Подготовка |
|---|---|
| Импортированная 3D-модель | В импорте выберите подготовку Static Lightmaps и выполните переимпорт. Проверьте UV2 и размер карты на результирующем меше. |
| Собственные UV2 из 3D-редактора | Проверьте отсутствие перекрытий и достаточный Lightmap Size Hint; наличие второго канала само по себе не гарантирует пригодность. |
| BoxMesh и другие PrimitiveMesh | Включите AddUV2 на ресурсе меша. При необходимости настройте UV2Padding. |
| Программно созданная геометрия | Подготовьте UV2, нормали, размер карты и принадлежность уровню. Непринадлежащие сохранённому уровню служебные Entity могут быть пропущены обходом. |
Ручная правка импортированного меша может быть потеряна при следующем импорте. Постоянную подготовку делайте в настройках импорта или исходной модели.
Не перепутать плотность и размер атласа
- Lightmap Texel Size при импорте: меньшее расстояние на тексель означает большую плотность.
- LightmapGI.TexelScale: масштабирует размеры карт мешей; большее значение увеличивает требуемую текстурную площадь.
- GILightmapTexelScale у GeometryInstance3D: меняет плотность для отдельного экземпляра.
- MaxTextureSize: ограничивает размер одной текстуры атласа, а не задаёт детализацию всех объектов. Текущий сеттер принимает 2048…16384. Атлас может быть меньше заданного предела.
Сначала добейтесь пригодных UV2 и разумной плотности на нужных поверхностях. Затем подбирайте предел атласа и качество.
Выбрать режимы источников
| BakeMode источника | Что попадает в карты |
|---|---|
Disabled | Источник исключён из запекания. Подходит для света, который должен работать только во время игры. |
Dynamic | Запекается непрямой вклад; прямой свет и его тени остаются динамическими. Изменение источника во время игры не пересчитает сохранённый непрямой вклад. |
Static | Запекаются прямой и непрямой вклад для статических получателей. Изменение источника не обновляет уже сохранённые карты. |
Скрытие Light3D не заменяет BakeMode = Disabled: текущий сборщик выбирает источники по BakeMode без проверки их Visible. Для исключения света меняйте именно режим и повторяйте запекание.
Если источник будет перемещаться или выключаться, заранее решите, допустим ли оставшийся в картах старый вклад. Название Dynamic не означает динамическую перезапись lightmap.
Запечь и сохранить
- Выделите LightmapGI и вызовите
Bake Lightmaps— команду запекания карт освещения в 3D-редакторе. В текущем C# SDK методLightmapGI.Bake()не опубликован; не заменяйте команду редактора выдуманным вызовом. - При первом запекании выберите путь данных
.lmbake. Это не тот же формат назначения, что.rbinв руководстве VoxelGI. - Дождитесь завершения. Проверьте назначенный
LightData, записи мешей и созданные атласы. Само сообщение о завершении или наличие пустого файла ещё не доказывает, что свет рассчитан. - Сохраните уровень. Сохраняйте вместе
.lmbake, сгенерированные исходные атласы и настройки их импорта; один файл данных не заменяет все зависимости. - Повторно откройте сохранённый уровень и запустите его. Для итоговой проверки также запустите экспортированную игру на целевой платформе.
При переименовании или переносе запечённых мешей пути привязки могут перестать совпадать. Перезапеките и проверьте предупреждения о ненайденных получателях.
Настроить качество
| Параметр | Что проверять |
|---|---|
| Quality, число отражений | Шум и достаточность света. Больше работы не исправляет UV2 и неверную геометрию. |
| UseDenoiser | Уменьшение шума и сохранение мелких теней. Проверяйте артефакты сглаживания, не только общий вид. |
| Directional | Дополнительная направленная информация для материалов с normal map. Меняет данные, стоимость и размер результата. |
| Supersampling | Дополнительное разрешение во время расчёта с последующим уменьшением. Повышает требования к памяти и времени. |
| EnvironmentMode | Нужен ли вклад окружения при запекании. Для закрытого контрольного помещения можно начать с Disabled. |
| Bias | Ошибки самозатенения и утечки. Увеличение bias не заменяет толщину стены и правильные нормали. |
Параметры, влияющие на расчёт, проверяйте после нового запекания. Изменение настройки без пересчёта не обновляет сохранённые текстуры.
Движущиеся объекты не получают новую UV2-карту от старого запекания. Для них отдельно настраивают lightmap-пробы и прямое освещение; это не позволяет им произвольно менять сохранённые тени и непрямой свет статического уровня. Отражения и отражённый свет в текстуре также не являются одним и тем же: проверьте небо, reflection-пробы и материалы.
Если результат неверный
- No meshes with lightmapping support: проверьте Static, видимость, треугольные поверхности, нормали, UV2 и область обхода.
- Нет пути сохранения: сохраните уровень и выберите
.lmbakeдля данных. Сохранение нового Resource через ResourceSaver само по себе не обязано назначать ему ResourcePath. - Карта слишком мала: проверьте Lightmap Size Hint и TexelScale. Нулевой итоговый размер не исправляется большим пределом атласа.
- Швы, светлые края, пятна: проверьте UV2, padding, плотность, нормали и компрессию; затем число лучей и denoiser.
- Свет остался после выключения лампы: проверьте, не запечён ли её прямой или непрямой вклад. Требуется смена схемы освещения или новое запекание.
- Изменение геометрии оставило старые тени: данные статические; пересчитайте их и сохраните обновлённый уровень.
Для этой статьи в отдельном проекте выполнены штатное GPU-запекание через плагин текущего редактора, проверка ненулевого света в атласе, сохранение, независимая загрузка .lmbake и отрисовка сохранённого уровня с выключенным прямым источником. При закрытии редактора сохранено предупреждение Scan thread aborted: прогон не отмечен как полностью чистый. Экспорт, динамические пробы, directional/shadowmask и качество всех материалов здесь не проверены.
Сравните подход с VoxelGI, SDFGI и обзором GI.