Введение в глобальное освещение

Что такое глобальное освещение?

Global illumination (Глобальное освещение) — это универсальный термин, используемый для описания системы освещения, которая использует как прямой свет (исходящий непосредственно от источника света), так и непрямой (отражающийся от поверхности). В 3д рендеринге глобальное освещение является одной из наиважнейших вещей для получения реалистичного света. Глобальное освещение призвано имитировать то, как ведет себя свет в реальной жизни, например отражение от поверхностей и излучение материалами с эмиссионными свойствами (со способностью излучать).

В примере ниже, вся сцена освещена эмиссионным материалом (белый квадрат на потолке). Белые стены и края потолка немного изменили свой цвет, ибо свет от зеленой и красной стен отразился на всю сцену.

../../../_images/global_illumination_example.webp

Глобальное освещение состоит из следующих основных концепций:

Непрямое рассеянное освещение

Это освещение, что не меняется от угла обзора камеры. Есть два главных источника непрямого рассеянного освещения:

  • Свет, отраженный от поверхностей. Он умножается на цвет альбедо материала, а так же может быть отражен другими поверхностями, потеряв часть мощности с каждым новым отражением. В реальной жизни свет отражается сколь угодно раз. Однако, по соображениям производительности, такое не получится провернуть в игровом движке, так, что, отражения обычно ограниченны 1 или 2 (иногда доходя до 16, если запекаются lightmaps). Чем больше отражений, тем реалистичней свет падает в затененных зонах, ценой худшей производительности или времени запекания.

  • Излучающие материалы также могут излучать свет, который отражается от поверхностей. Это служит своего рода "подсветкой помещения". Вместо того чтобы заставлять бесконечно малую точку излучать свет с помощью узла OmniLight3D или SpotLight3D, область определенного размера будет излучать свет, используя свою собственную поверхность.

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

Разные техники глобального освещения имеют разную степень точности. См. сравнительную таблицу внизу страницы, чтобы узнать больше.

Чтобы получить более точную окклюзию окружения для небольших обьектов, можно включить экранную окклюзию (SSAO) в environment настройках. SSAO значительно влияет на производительность, так что отключите его для бюджетного оборудования.

Примечание

Непрямое рассеянное освещение может быть источником цветных полос в сценах без детальных текстур. Это приводит к тому, что градиенты света не являются плавными, а имеют видимый эффект «ступеньки». Смотрите раздел Цветовая полоса в документации по ограничениям 3D-визуализации чтобы узнать о способах уменьшения этого эффекта.

Зеркальное освещение

Зеркальное освещение также называют отражениями. Это освещение, интенсивность которого меняется в зависимости от угла камеры. Оно может быть прямым или непрямым.

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

Для более точных отражений небольших объектов можно включить отражения в экранном пространстве (SSR) в настройках окружения. SSR значительно снижает производительность (даже больше, чем SSAO), поэтому обязательно отключайте эту функцию при работе с маломощным оборудованием.

Какую технику глобального освещения лучше использовать?

При выборе метода глобального освещения (GI) следует учитывать несколько критериев:

  • Производительность. Реалтайм-методы глобального освещения обычно требуют больше ресурсов, чем полуреалтайм или запечённые решения. Основная вычислительная нагрузка при рендеринге GI приходится на видеопроцессор (GPU), а не на центральный процессор (CPU).

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

  • Режим реального времени. Одни методы глобального освещения работают полностью в реальном времени, другие — частично, а некоторые вообще не поддерживают реальное время. Полуреальные методы имеют ограничения, которых нет у полностью реальновременных. Например, динамические объекты могут не влиять на эмиссионное освещение сцены. Нереальновременные методы не поддерживают никаких форм динамического GI, поэтому его приходится имитировать другими способами (например, размещением точечных источников света рядом с излучающими поверхностями). Возможность работы в реальном времени также определяет применимость метода GI для процедурно генерируемых уровней.

  • ** Требуется работа руками. ** Некоторые методы GI полностью автоматизированы, в то время как другие требуют тщательного планирования и ручной работы со стороны пользователя. В зависимости от вашего количества времени, некоторые методы GI могут быть предпочтительнее.

Вот сравнение всех глобальных методов освещения в Godot:

Производительность

В порядке относительно производительности - от самых быстрых к самым медленным:

  • RefletionProbe: (зонды отражения)

    • ReflectionProbes, для которых установлен режим обновления Always (Всегда), стоят намного дороже по производительности, чем датчики с режимом обновления Once (Один раз), который стоит по умолчанию. Подходит для интегрированной графики при использовании режима обновления Once. Доступно во всех средствах визуализации.

  • LightmapGI (Глобальное освещение на основе световых карт):

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

  • VoxelGI (Воксельное глобальное освещение):

    • Количество подразделений при запекании можно настроить для баланса между производительностью и качеством. Качество рендеринга VoxelGI можно изменить в настройках проекта. Для значительного повышения производительности можно включить рендеринг в половинном разрешении (с последующим линейным масштабированием). Недоступно при использовании рендереров Mobile или Compatibility.

  • Screen-space indirect lighting (SSIL, непрямое освещение в экранном пространстве):

    • Качество SSIL и количество проходов размытия можно настроить в параметрах проекта. По умолчанию рендеринг SSIL выполняется в половинном разрешении (с последующим линейным масштабированием) для обеспечения приемлемой производительности. Недоступно при использовании рендереров Mobile или Compatibility.

  • SDFGI (Signed Distance Field Global Illumination - Глобальное освещение на основе полей расстояний):

    • Количество каскадов можно настроить для баланса между производительностью и качеством. Количество лучей, обрабатываемых за кадр, регулируется в настройках проекта. Для значительного повышения производительности можно включить рендеринг в половинном разрешении (с последующим линейным масштабированием). Недоступно при использовании рендереров Mobile или Compatibility.

Визуал

Для сравнения, вот 3D сцена, где не используется глобальное освещение:

Трехмерная сцена без какого-либо глобального освещения (только постоянное освещение окружающей среды). Коробка и сфера рядом с камерой являются динамическими объектами.

Трехмерная сцена без какого-либо глобального освещения (только постоянное освещение окружающей среды). Коробка и сфера рядом с камерой являются динамическими объектами.

Вот сравнение методов глобального освещения, разработанных Godot:

  • VoxelGI: Хорошие отражения и непрямое освещение, но возможны утечки света.

    • Из-за воксельной природы VoxelGI могут возникать утечки света (light leaks), если стены и пол слишком тонкие. Рекомендуется делать все твердые поверхности толщиной как минимум в один воксел.

      На наклонных поверхностях также могут появляться артефакты в виде полос (streaking artifacts). В таком случае можно попробовать изменить параметры смещения (bias properties) или повернуть узел VoxelGI, чтобы уменьшить этот эффект.

      Пример VoxelGI.

      Пример VoxelGI.

  • SDFGI: хорошие отражения и непрямое освещение, но возможны утечки света и заметные переключения каскадов (cascade shifts).

    • Уровень детализации глобального освещения (GI level of detail) зависит от расстояния между камерой и поверхностью.

      Утечки света можно значительно уменьшить, включив свойство Use Occlusion. Это немного снижает производительность, но обычно приводит к меньшему количеству утечек по сравнению с VoxelGI.

      Переключения каскадов могут быть заметны при быстром движении камеры. Эффект можно смягчить, настроив размеры каскадов (cascade sizes) или используя туман (fog).

      SDFGI в действии.

      SDFGI в действии.

  • Screen-space indirect lighting (SSIL): хороший вторичный источник непрямого освещения, но без отражений.

    • SSIL предназначен для использования в сочетании с другими техниками глобального освещения, такими как VoxelGI, SDFGI или LightmapGI. Лучше всего он подходит для детализации в малых масштабах, так как не может самостоятельно обеспечивать точное непрямое освещение крупных объектов. SSIL позволяет получать непрямое освещение в реальном времени в тех случаях, когда другие методы GI не могут корректно обработать мелкие детали или динамические объекты. Однако из-за работы в экранном пространстве возможны артефакты, особенно при появлении или исчезновении объектов с экрана. SSIL использует цвет предыдущего кадра (до постобработки), а значит, учитывает эмиссионные декали (emissive decals) и пользовательские шейдеры (custom shaders) — при условии, что они видны на экране.

      SSIL в действии (без использования какой-либо другой техники GI). Обратите внимание на излучение вокруг желтого прямоугольника.

      SSIL в действии (без использования какой-либо другой техники GI). Обратите внимание на излучение вокруг желтого прямоугольника.

  • LightmapGI: отличное непрямое освещение, приемлемые отражения (опционально).

    • Это единственный метод, где количество отскоков света (light bounces) можно увеличить выше 2 (вплоть до 16). При включении направленной информации используются сферические гармоники (spherical harmonics, SH) для создания размытых отражений.

      LightmapGI в действии. Здесь запекается только непрямое освещение, но прямое освещение также можно запечь.

      LightmapGI в действии. Здесь запекается только непрямое освещение, но прямое освещение также можно запечь.

  • ReflectionProbe: хорошие отражения, но слабое непрямое освещение.

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

      ReflectionProbe в работе (без других технологий глобального освещения). Обратите внимание на отражающую сферу.

      ReflectionProbe в работе (без других технологий глобального освещения). Обратите внимание на отражающую сферу.

Доступность в реальном времени

  • VoxelGI: Полностью в реальном времени.

    • Непрямое освещение и отражения работают полностью в реальном времени. Динамические объекты могут получать глобальное освещение (GI) и вносить свой вклад через эмиссивные поверхности. Пользовательские шейдеры также могут излучать собственный свет, который будет корректно учитываться.

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

  • SDFGI: Полу-реальное время работы.

    • Каскады генерируются в реальном времени, что делает SDFGI пригодным для процедурно генерируемых уровней (включая генерацию структур непосредственно во время игры).

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

  • Screen-space indirect lighting (SSIL): Полностью в реальном времени.

    • SSIL работает со статическими и динамическими источниками света, а также со статическими и динамическими объектами, включая эмиссивные материалы.

  • LightmapGI: Запекаемое освещение (не в реальном времени).

    • Непрямое освещение и SH-отражения запекаются и не могут изменяться во время выполнения. Для реализации динамического глобального освещения необходимо использовать simulated via other means, например, позиционные источники света в реальном времени. Динамические объекты получают непрямое освещение через light probes, которые могут размещаться автоматически или вручную (узел LightmapProbe). Не подходит для процедурно генерируемых уровней, так как запекание карт освещения возможно только из редактора.

  • ReflectionProbe: Опционально в реальном времени.

    • По умолчанию отражения обновляются при перемещении probe. При выборе режима Always они обновляются максимально часто (что ресурсозатратно).

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

Необходимые действия пользователя

  • VoxelGI: Требуется создать и запечь один или несколько узлов VoxelGI.

    • Для хорошего результата необходимо правильно настроить границы. В некоторых случаях помогает поворот узлов и повторное запекание для устранения утечек света и артефактов. Процесс запекания быстрый - обычно менее 10 секунд для сцены средней сложности.

  • SDFGI: Минимальная настройка.

    • Полностью автоматическая работа - достаточно активировать в ресурсе Environment. Единственная ручная настройка - правильное указание свойства bake mode для MeshInstances. Не требует создания узлов или запекания.

  • Screen-space indirect lighting (SSIL): Минимальная настройка.

    • Минимальная настройка. Полностью автоматическая работа - достаточно активировать в ресурсе Environment. Не требует создания узлов или запекания.

  • LightmapGI: Требуется настройка UV2 и запекание.

    • Статические меши должны быть переимпортированы с включенной генерацией UV2 и lightmap. Благодаря GPU-ускоренному запеканию процесс относительно быстрый (обычно менее 1 минуты для сцены средней сложности).

  • ReflectionProbe: Размещаются пользователем вручную.

Подведение итогов

Если вы не уверены, какую технику глобального освещения использовать:

  • Для настольных игр рекомендуется начать с SDFGI, так как она требует минимальной настройки. При необходимости можно перейти к другим методам. Для повышения производительности на слабых GPU и интегрированной графике добавьте в настройки игры возможность отключения SDFGI или VoxelGI. SDFGI можно отключить в ресурсе Environment, а VoxelGI - скрыв соответствующие узлы. Для улучшения графики на мощных системах добавьте опцию включения SSIL.

  • Для мобильных игр поддерживаются только LightmapGI и ReflectionProbes. Дополнительную информацию см. в Альтернативы технологиям глобального освещения.

См. также

В дополнение к этой документации Вы также можете посмотреть на различные демонстрационные проекты Godot.

Какой режим глобального освещения использовать для мешей и источников света?

Независимо от выбранной техники глобального освещения, универсального "лучшего" режима не существует. Однако вот рекомендации для мешей:

  • Для статической геометрии уровня используйте режим Static (по умолчанию).

  • Для небольших динамических объектов (персонажи, враги) используйте режим Disabled. Мелкие динамические объекты не могут значительно влиять на непрямое освещение, так как их размер меньше вокселя. Если необходимо непрямое освещение для таких объектов, можно имитировать его с помощью узлов OmniLight3D или SpotLight3D, прикрепленных к объекту.

  • Для крупной динамической геометрии (например, движущийся поезд) используйте режим Dynamic. Учтите, что этот режим работает только с VoxelGI, так как SDFGI и LightmapGI не поддерживают глобальное освещение для динамических объектов.

Рекомендации по режимам запекания света:

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

  • Для кратковременных динамических эффектов (например, оружие) используйте режим Disabled для повышения производительности.

  • Для продолжительных динамических эффектов (например, вращающаяся сигнальная лампа) используйте режим Dynamic для улучшения качества (режим по умолчанию). Обратите внимание, что этот режим работает только с VoxelGI и SDFGI, так как LightmapGI не поддерживает глобальное освещение с динамическими источниками света.

Альтернативы технологиям глобального освещения

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

При работе с маломощным оборудованием, когда использование LightmapGI невозможно (например, для процедурно генерируемых уровней), можно ограничиться только окружением (environment lighting) или постоянным коэффициентом окружающего света (ambient light). Это может сделать изображение более плоским, но правильная настройка цвета окружающего света и вклада неба (sky contribution) в большинстве случаев позволяет достичь приемлемого результата.