Запечённые карты освещения

Введение

Запечённые карты совещения - это альтернативный рабочий процесс для добавления непрямого (или полностью запечённого) освещения в сцену. В отличие от подхода Использование GIProbe (карты тайтлов), запечённые карты освещения отлично работают на низкопроизводительных ПК и мобильных устройствах, так как они почти не потребляют ресурсов во время выполнения. Также, в отличие от GIProbe, запечённые карты освещения можно использовать для хранения прямого освещения, что обеспечивает ещё больший прирост производительности.

В отличие от GIProbes, запечённые карты освещения полностью статичны. После запекания они не могут быть изменены вообще. Они также не обеспечивают сцену отражениями, поэтому использование Датчики отражения вместе с ними в интерьерах (или использование Sky (неба) в экстерьерах) является обязательным условием для получения хорошего качества.

Поскольку они запекаются, у них меньше проблем, чем у GIProbe в отношении обесцвечивания света, и непрямой свет часто выглядит лучше. Недостатком является то, что запекание карт освещения занимает гораздо больше времени, чем запекание GIProbe. В то время как создание GIProbe может быть выполнено за несколько секунд, создание карт освещения занимает несколько минут, если не больше. Это может значительно замедлить скорость итераций, поэтому рекомендуется запекать карты освещения только тогда, когда вам действительно нужно увидеть изменения в освещении.

Запекание карт освещения также зарезервирует UV2 слот запечённых материалов, что означает, что вы больше не сможете использовать его для других целей в материалах (как во встроенных Spatial Material, так и в пользовательских шейдерах).

В конечном итоге, решение о том, какой подход к непрямому освещению лучше, зависит от вашего сценария использования. В целом, GIProbe проще в настройке и лучше работает с динамическими объектами. Однако для совместимости с мобильными и бюджетными устройствами запечённые карты освещения - единственный выбор.

Визуальное сравнение

Вот несколько сравнений того, как выглядят BakedLightmap и GIProbe. Обратите внимание, что карты освещения более точны, но также страдают от того, что освещение происходит на развернутой текстуре, поэтому переходы и разрешение могут быть не очень хорошими. GIProbe выглядит менее точным (поскольку это приближение), но в целом более гладким.

../../_images/baked_light_comparison.png

Настройка

Прежде всего, прежде чем лайтмаппер сможет что-либо сделать, запекаемые объекты должны иметь UV2-слой и размер текстуры. Слой UV2 - это набор координат вторичной текстуры, который обеспечивает каждой грани объекта своё собственное место на UV-карте. Поверхности не должны иметь общих пикселей в текстуре.

Есть несколько способов убедиться, что ваш объект имеет уникальный слой UV2 и размер текстуры:

Развёртка при импорте сцены

Это, вероятно, лучший подход в целом. Единственным недостатком является то, что на больших моделях разворачивание может занять некоторое время при импорте. Тем не менее, Godot будет кэшировать UV2 при всех повторных импортах, поэтому он будет регенерироваться только тогда, когда это необходимо.

Выберите импортированную сцену в панели файловой системы, затем перейдите в панель Import. Там можно изменить следующий параметр:

../../_images/baked_light_import.png

Режим Light Baking должен быть установлен на Gen Lightmaps. Также необходимо указать размер текселя в мировых единицах, так как он будет определять окончательный размер текстуры карты освещения (и, как следствие, UV-подложки в карте).

Эффект от установки этой опции заключается в том, что все сетки в сцене будут иметь правильно сгенерированные UV2 карты.

Предупреждение

При повторном использовании сетки в сцене имейте в виду, что UVs будут генерироваться для первого найденного экземпляра. Если сетка повторно используется с разными масштабами (а масштабы сильно отличаются, более чем в два раза), это приведет к неэффективным картам освещения. Не используйте повторно исходную сетку с существенно разными масштабами, если вы планируете использовать карты освещения.

Кроме того, файлы *.unwrap_cache должны не игнорироваться при контроле версий, так как эти файлы гарантируют, что реимпорты UV2 будут согласованы на разных платформах и версиях движка.

Развёртка изнутри Годо

У Godot есть возможность разворачивать сетки и визуализировать ультрафиолетовые каналы. Его можно найти в пункте меню «Mesh»:

../../_images/baked_light_mesh_menu.png

Это создаст второй набор координат UV2, которые можно использовать для выпечки, а также автоматически установит размер текстуры.

Развёртка из вашего 3D DCC

Последний вариант - сделать это из вашего любимого 3D-приложения. Этот подход обычно не рекомендуется, но он объясняется вначале, чтобы вы знали о его существовании. Основное преимущество заключается в том, что для сложных объектов, которые, возможно, придётся часто импортировать повторно, процесс генерации текстуры в Godot может быть довольно затратным, поэтому разворачивание текстуры перед импортом может быть быстрее.

Просто разверните второй слой UV2.

../../_images/baked_light_blender.png

Затем импортируйте 3D-сцену в обычном режиме. Помните, что вам нужно будет установить размер текстуры на сетке после импорта.

../../_images/baked_light_lmsize.png

Если при импорте вы используете внешние сетки, размер будет сохранен. Будьте осторожны, большинство разверток в 3D DCC не ориентированы на качество, так как они предназначены для быстрой работы. В основном вам нужно будет использовать швы или другие методы, чтобы лучше развернуть.

Проверка UV2

В меню сетки, упомянутом ранее, можно визуализировать координаты UV2 текстуры. Если что-то не получается, проверьте, что сетки имеют эти UV2-координаты:

../../_images/baked_light_uvchannel.png

Настраиваем сцену

Прежде чем что-либо делать, в сцену необходимо добавить узел BakedLightmap. Это позволит запекать свет на всех узлах (и подузлах) в этой сцене, даже на экземплярах сцен.

../../_images/baked_light_scene.png

Субсцена может быть наследована несколько раз, поскольку это поддерживается запечкой, и каждой из них будет назначена своя карта света (только убедитесь, что соблюдено правило о масштабировании, упомянутое ранее):

Настройка границ

Карта освещения нуждается в приблизительном объеме затронутой области, поскольку она использует ее для передачи света динамическим объектам внутри нее (подробнее об этом позже). Просто установите значения для сцены, как вы делаете с GIProbe.:

../../_images/baked_light_bounds.png

Настройка мешей

Чтобы узел MeshInstance участвовал в процессе запекания, у него должно быть включено свойство Use in Baked Light.

../../_images/baked_light_use.png

При автоматической генерации карт освещения при импорте сцены этот параметр включается автоматически.

Настройка освещения

По умолчанию свет запекается с непрямым освещением. Это означает, что наложение теней и освещение по-прежнему динамичны и влияют на движущиеся объекты, но свет, отражённый от них, будет запечен.

Свет может быть отключен (без запекания) или полностью запечён (прямой и не прямой). Этим можно управлять из меню Bake Mode в источниках освещения:

../../_images/baked_light_bake_mode.png

Основные режимы:

Отключённый

Свет игнорируется при запекании карт освещения. Имейте в виду, что скрытие света не будет иметь никакого эффекта для запекания, поэтому его необходимо использовать вместо того, чтобы скрывать узел Light.

Этот режим следует использовать для динамических световых эффектов, таких как взрывы и эффекты оружия.

Indirect (Непрямой)

Это режим по умолчанию, который является компромиссом между производительностью и удобством работы в реальном времени. Запекается только непрямое освещение. Прямой свет и тени остаются в реальном времени, как и без BakedLightmap.

Этот режим позволяет выполнять тонкие изменения цвета, энергии и положения света, сохраняя при этом достаточно корректный вид. Например, его можно использовать для создания мерцающих статичных факелов, у которых запекается непрямой свет.

Все

Как косвенное, так и прямое освещение будет запекаться. Поскольку статические поверхности могут полностью пропустить вычисления освещения и теней, этот режим обеспечивает наилучшую производительность наряду с плавными тенями, которые никогда не исчезают в зависимости от расстояния. Свет в реальном времени больше не будет влиять на запеченные поверхности, но он все еще будет влиять на динамические объекты. При использовании режима запекания All для света динамические объекты не будут отбрасывать тени в реальном времени на запеченные поверхности, поэтому вместо этого необходимо использовать другой подход, например, сгустковые тени. Сгустковые тени можно реализовать с помощью установки Sprite3D + RayCast или отрицательного SpotLight, направленного вниз, с режимом запекания, установленным на Disabled.

Свет не будет регулироваться во время игры. Перемещение света и изменение его цвета или энергии не будет иметь никакого эффекта на статичных поверхностях.

Поскольку режимы запекания можно настраивать для каждого света отдельно, можно создавать гибридные установки запечённого света. Одним из популярных вариантов является использование направленного света реального времени с режимом запекания Indirect, и использование режима запекания All для OmniLights и SpotLights. Это обеспечивает хорошую производительность и при этом позволяет динамическим объектам отбрасывать тени в реальном времени на открытых пространствах.

После выбора режима запекания All для света можно дополнительно указать Size больше 0 для света в инспекторе. Этот размер используется для создания более мягких теней в зависимости от расстояния между создателем тени и объектом, получающим тень. Это имитирует реальный вид теней:

../../_images/baked_light_omnilight_size.png

Свойство Size источника освещения игнорируется для теней в реальном времени; это повлияет только на запечённые тени. При изменении свойства Size карты освещения необходимо снова запечь, чтобы изменения стали видимыми.

Запекание

Чтобы начать процесс запекания, просто нажмите кнопку Запекать карты освещения вверху при выборе узла BakedLightmap:

../../_images/baked_light_bake.png

Это может занять от нескольких секунд до нескольких минут (или часов) в зависимости от размера сцены, выбранного метода запекания и качества.

Баланс между временем выпечки и качеством

Поскольку высококачественное запекание может занять очень много времени (до нескольких часов для больших сложных сцен), рекомендуется сначала использовать более низкие настройки качества. Затем, когда вы будете уверены в настройке освещения сцены, повысьте настройки качества и выполните "окончательное" запекание перед экспортом проекта.

Примечание

По умолчанию, для ускорения процесса выпечки карт освещения, используются все логические ядра процессора системы. Это может снизить отзывчивость системы. Чтобы сохранить отзывчивость системы во время запекания, вы можете уменьшить количество потоков ЦП, используемых для запекания. Если держать 1-2 потока ЦП свободными, это поможет улучшить отзывчивость системы, что полезно при выполнении многозадачной работы во время запекания за счёт небольшого замедления запекания карт освещения.

Для этого откройте Editor > Editor Settings и настройте Editors > 3d > Lightmap Baking Number Of Cpu Threads. Значение по умолчанию (0) использует все логические ядра CPU системы. Положительные значения указывают количество потоков, которые необходимо использовать, а отрицательные значения вычитаются из общего количества логических ядер CPU в системе. Например, в системе с 8 логическими ядрами CPU, если установить значение -1, то для запекания лайтмапа будет использоваться 7 потоков CPU.

Настройка запекания

Для запекания имеется еще несколько вариантов:

  • Bake Extents: Размер области воздействия. Этот параметр можно редактировать во вьюпорте 3D-редактора с помощью ручек. Любой объект, для которого могут быть запечены карты освещения и который касается границ запекания, будет запечён для него, но динамический захват объекта будет работать только в пределах этих границ.

Tweaks (надстройки)

  • Quality: Предусмотрено четыре режима качества запекания: Low (Низкое), Medium (Среднее), High (Высокое) и Ultra (Ультра). Более высокое качество требует больше времени, но в результате получается более красивая карта освещения с меньшим уровнем шума. Разница особенно заметна при работе с излучающими материалами или областями, которые практически не получают прямого освещения.

  • Bounces: Количество отскоков, используемых для непрямого освещения. Значение по умолчанию (3) является хорошим компромиссом между временем запекания и качеством. Более высокие значения заставят свет отскакивать большее количество раз, прежде чем он остановится, что сделает непрямое освещение более плавным (но и более ярким). Во время начальных итераций освещения рекомендуется уменьшить количество отскоков до 1, чтобы ускорить запекание. Помните, что при уменьшении числа отскоков ваша сцена будет темнее.

  • Use Denoiser: Если включено, используется OpenImageDenoise (алгоритм уменьшения шума), чтобы сделать световую карту значительно менее шумной. Это увеличивает время запекания и иногда может привести к появлению артефактов, но результат часто того стоит.

  • Use Hdr: Если отключить эту опцию, карты освещения будут меньше занимать места на диске, но они не смогут захватывать свет, превышающий белый (1.0). Это приведет к видимой обтравке, если в сцене присутствует яркий свет. Когда HDR отключен, на карте освещения также может быть заметна полосатость.

  • Use Color: Если отключить эту функцию, карты освещения будут занимать меньше места на диске, но карта освещения не сможет хранить цветное освещение. При запекании только непрямого освещения разница может быть едва заметна, так как непрямое освещение обычно не очень насыщенное. Однако при запекании прямого и непрямого освещения с использованием режима запекания All для света, цветное освещение превращается в полутоновое. Это можно отключить вместе с HDR, чтобы получить минимально возможный файл карты освещения при заданном разрешении.

  • Bias: Значение смещения, используемое для теней в 3D-единицах. Обычно это значение не нужно менять, за исключением случаев, когда после запекания возникают проблемы с утечкой света или тёмными пятнами на карте освещения. Эта настройка не влияет на тени, отбрасываемые в реальном времени на запечённые поверхности.

  • Default Texels Per Unit: Для сеток, в которых не указана собственная плотность текселей карты освещения, это значение будет использоваться в качестве значения. Более высокие значения приводят к более низкому разрешению карт освещения, что позволяет ускорить время запекания и уменьшить размер файлов за счет более размытого непрямого освещения и теней.

Атлас

  • Generate: Если эта опция включена, для карты освещения будет сгенерирован атлас текстур. Это приводит к более эффективному рендерингу, но совместимо только с бэкендом рендеринга GLES3. Отключите этот параметр, если ваш проект может вернуться к GLES2. (По умолчанию это не так и должно быть включено в настройках проекта). Эта настройка игнорируется, если проект настроен на использование GLES2 по умолчанию.

  • Max Size: Максимальный размер атласа в пикселях. Большие значения приводят к более эффективному атласу, но менее совместимы со старым/низкокачественным оборудованием. Если вы сомневаетесь, оставьте значение по умолчанию (4096).

Захват

  • Enabled: Включает захват пробника, чтобы динамические объекты могли получать непрямое освещение. Независимо от значения этого параметра динамические объекты не смогут вносить косвенное освещение в сцену. Это ограничение карт освещения.

  • Cell Size: Расстояние между зондами карты освещения в 3D единицах. Большие значения приводят к более разреженному размещению зондов, что уменьшает время запекания и размер файла ценой снижения точности освещения динамических объектов.

  • Quality: Качество генерации пробника карты освещения. Более высокие значения приводят к более точному освещению, но требуют больше времени для запекания. Эта настройка не влияет на плотность зондов карты освещения, только на их качество.

  • Propagation: Аналогично свойству Propagation у GIProbe. Более высокие значения приводят к более яркому и рассеянному непрямому освещению динамических объектов. Отрегулируйте это значение в зависимости от вашей сцены, чтобы динамические объекты лучше сочетались со статическим освещением.

Данные

  • Light Data: Содержит данные об освещении после запекания. Текстуры сохраняются на диск, но здесь также содержатся данные захвата для динамических объектов, которые могут быть тяжёлыми. Если вы используете сцену в формате .tscn, вам следует сохранить этот ресурс во внешний двоичный файл .lmbake, чтобы избежать раздувания сцены .tscn двоичными данными, закодированными в Base64.

Ресурс Light Data можно отредактировать, чтобы настроить два дополнительных свойства:

  • Энергия: Регулирует яркость карты освещения. Более высокие значения приводят к более ярким картам освещения. Это можно отрегулировать во время работы для кратковременных динамических эффектов, таких как грозы. Однако имейте в виду, что это повлияет на все запеченные источники света.

  • Interior: Если этот параметр включен, динамические объекты не будут использовать освещение окружающей среды, а для освещения будут использоваться исключительно световые пробники. Если отключено, для освещения динамических объектов используется как освещение окружения, так и световые пробники.

Совет

Созданный EXR-файл можно просмотреть и даже отредактировать с помощью редактора изображений, чтобы при необходимости выполнить постобработку. Однако следует помнить, что изменения в EXR-файле будут потеряны при повторном запекании карт освещения.

Динамические объекты

В других движках или реализациях карт освещения, как правило, требуется вручную размещать небольшие объекты, называемые "lightprobes", по всему уровню, чтобы генерировать захват данных. Затем эти данные используются для передачи света на динамические объекты, которые перемещаются по сцене.

Однако в данной реализации карт освещения используется другой метод. Процесс происходит автоматически, поэтому вам не нужно ничего делать. Просто перемещайте объекты, и они будут освещены соответствующим образом. Конечно, вы должны убедиться, что установили границы сцены соответствующим образом, иначе это не сработает.

../../_images/baked_light_indirect.gif