SDFGI: настройка каскадов и освещения
Ограничения геометрии, размер ячейки, обратная связь и диагностика.
SDFGI
SDFGI строит представление статической геометрии вокруг камеры и обновляет непрямое освещение во время работы. Не нужен отдельный VoxelGI-объём или файл запекания, но результат накапливается по кадрам. Метод работает в Forward+; Mobile и Compatibility не дают этот путь SDFGI.
Большой мир не означает бесконечное расстояние GI: вокруг камеры существует конечный набор каскадов. Движущаяся дверь может получать непрямой свет, но не становится корректным динамическим препятствием для SDFGI. Для динамической геометрии оцените VoxelGI.
Включить на уровне
- Проверьте, что фактически запущен Forward+, а не резервный рендерер.
- Установите для неподвижной участвующей геометрии
MeshInstance3D.GIMode = Static.DynamicиDisabledне добавляют её в статическое представление SDFGI. - Создайте WorldEnvironment с Environment. Проверьте, не переопределяет ли активная Camera3D этот Environment собственным ресурсом.
- В используемом Environment включите
SdfgiEnabled. Для закрытого помещения начните без вклада неба и обратной связи; добавляйте их после проверки базового результата. - Дайте освещению накопиться после загрузки или перемещения камеры. Сравнивайте установившийся кадр, сохраняя экспозицию и остальные эффекты.
Пример настройки существующего Environment для помещения; подключение WorldEnvironment и геометрия уже должны быть подготовлены:
using Reckfell;
public static class GiSettingsExample
{
// Apply to the Environment actually used by the active camera.
public static void ConfigureIndoorSdfgi(Environment environment)
{
environment.SdfgiEnabled = true;
environment.SdfgiCascades = 4;
environment.SdfgiMinCellSize = 0.2f;
environment.SdfgiReadSkyLight = false;
environment.SdfgiUseOcclusion = true;
environment.SdfgiBounceFeedback = 0f;
environment.SdfgiEnergy = 1f;
}
}Это исходная конфигурация для диагностики, не максимальный пресет для любой игры. SdfgiUseOcclusion повышает стоимость и может уменьшать утечки; результат проверьте на собственной геометрии. SdfgiReadSkyLight = false не отключает прямое освещение и другие источники окружающего света.
Настроить охват и детализацию
В текущем API связаны три свойства:
| Свойство | Значение |
|---|---|
SdfgiMinCellSize | Размер ячейки ближайшего каскада; меньше — выше пространственная детализация. |
SdfgiCascade0Distance | Вычисляется как 64 * SdfgiMinCellSize. Запись меняет размер ячейки. |
SdfgiMaxDistance | Вычисляется как 64 * SdfgiMinCellSize * 2^SdfgiCascades. Запись также меняет размер ячейки. |
Например, при 4 каскадах и ячейке 0,2 получаются 12,8 и 204,8 единицы. Не присваивайте все три свойства подряд, считая их независимыми: последнее присваивание расстояния изменит ранее выбранный размер ячейки. Каскадов допустимо 1…8; больше каскадов означает дополнительные данные и работу, а не гарантированно лучший кадр.
Выбирайте охват по реально видимой области и деталям уровня. Не используйте настройку размера ячейки как обещание поддержки любого масштаба мира без затрат.
Изменяющиеся объекты и источники
Статическая геометрия попадает в представление каскада при его обновлении. После перемещения такой геометрии рядом с камерой старое представление может сохраняться. Для изменения планировки проверьте пересоздание SDFGI либо обновление каскадов; это не подход к постоянной анимации дверей и стен.
Динамические источники света и динамические препятствия — разные возможности. У движущегося источника используйте соответствующий динамический BakeMode; не считайте, что это включает динамическую геометрию. Непрямой вклад источника зависит также от его IndirectEnergy. Статическая эмиссия участвует; движущуюся эмиссивную поверхность не рассчитывайте использовать как корректный динамический источник SDFGI.
Убрать засвет и нестабильность
- Комната всё ярче через несколько секунд: начните с
SdfgiBounceFeedback = 0, проверьте энергию и эмиссию. Затем добавляйте обратную связь небольшими шагами. Не компенсируйте разгон только уменьшением экспозиции. - Свет проходит через тонкую стену: проверьте толщину и замкнутость геометрии относительно размера ячейки. Сравните UseOcclusion, затем небольшие изменения NormalBias/ProbeBias. Избыточный bias способен усилить утечки.
- Неверный свет после перемещения объекта: убедитесь, что не требуете от SDFGI динамического препятствия. Изменение GIMode на Dynamic не исправляет это ограничение.
- Пятна после загрузки: дождитесь накопления и проверьте число лучей/кадры сходимости. Больше кадров означает более медленную реакцию, не мгновенное улучшение.
- Скачок при быстром движении камеры: проверьте границы каскадов, охват и бюджет GPU. Туман или затемнение перехода могут скрыть эффект, но не исправляют неверное освещение.
- Настройки меняются, кадр нет: проверьте реально используемый Environment, рендерер, статические меши и отсутствие другого эффекта, перекрывающего результат.
Настройки проекта: rendering/global_illumination/sdfgi/probe_ray_count, frames_to_converge, frames_to_update_lights; общий буфер GI управляется rendering/global_illumination/gi/use_half_resolution. У параметров число лучей и число кадров представлены вариантами настройки: не подставляйте произвольное количество как индекс enum. Измеряйте качество и время кадра на целевом GPU, особенно при движении камеры.
Что проверено
В установленном Forward+/Vulkan проверены настройки примера, связь размеров каскадов и реальный непрямой свет от статической эмиссии с сравнением SDFGI вкл./выкл. Функциональный GPU-прогон использовал один каскад и выключенную окклюзию для изоляции эффекта; он не является проверкой качества всей четырёхкаскадной конфигурации, большого мира или динамических источников.
Сравнение методов — в обзоре GI.