Имитация глобального освещения

Зачем имитировать глобальное освещение (global illumination)?

Godot предоставляет несколько техник глобального освещения (GI), у каждой из которых есть свои преимущества и недостатки. Тем не менее, можно избежать использования какой-либо техники GI и вместо этого использовать ручной подход. Есть несколько причин использовать "ручной" подход к глобальному освещению вместо VoxelGI, SDFGI или запечённых световых карт:

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

  • Вам нужен подход к GI, который полностью в реальном времени и работает в процедурно генерируемых уровнях.

  • Вам нужен подход к GI, который полностью в реальном времени и не страдает от значительных утечек света.

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

См. также

Не уверены, подходит ли имитация глобального освещения с источниками света для ваших нужд? Смотрите Какую технику глобального освещения лучше использовать? для сравнения техник GI, доступных в Godot 4.

Имитация глобального освещения для DirectionalLight3D

Хотя небо обеспечивает своё собственное направленное освещение, основной узел DirectionalLight3D сцены обычно испускает большое количество света. При использовании техники GI этот свет отражался бы на твёрдых поверхностях и отскакивал бы на большинстве затенённых поверхностей на открытом воздухе.

Имитацию можно создать добавлением второго узла DirectionalLight3D с параметрами:

  • Поверните свет на 180 градусов. Это позволит ему имитировать отражённый свет от основного узла DirectionalLight3D.

  • Установите Shadows в Off. Это снижает нагрузку на производительность от вторичного света, а также позволяет затенённым областям получать некоторое освещение (что нам и нужно).

  • Установите Energy на 10-40% от исходного значения. Нет "идеального" значения, поэтому экспериментируйте с различными значениями энергии в зависимости от света и ваших типичных цветов материалов.

  • Установите Specular в 0.0. Непрямое освещение не должно создавать видимых бликов, поэтому нам нужно полностью отключить бликовое освещение для вторичного света.

Примечание

Этот подход лучше всего работает в сценах, которые в основном находятся на открытом воздухе. При переходе в помещение свет вторичного DirectionalLight3D всё равно будет виден, так как у этого света отключены тени.

Это можно обойти, плавно уменьшая энергию вторичного DirectionalLight3D при входе в помещение (и делая обратное при выходе из помещения). Например, этого можно добиться с помощью узла Area3D и AnimationPlayer.

Имитация глобального освещения от позиционного света

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

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

Если вы торопитесь, вы можете поместить вторичный узел OmniLight3D в то же положение, что и основной узел OmniLight3D. Вы можете добавить этот узел как дочерний к основному OmniLight3D, чтобы легко перемещать и скрывать оба узла одновременно.

Во вторичном узле OmniLight3D выполните следующие изменения:

  • Увеличьте Range света на 25-50%. Это позволяет вторичному свету освещать то, что ранее не освещалось исходным светом.

  • Установите Shadows в Off. Это снижает нагрузку на производительность от вторичного света, а также позволяет затенённым областям получать некоторое освещение (что нам и нужно).

  • Установите Energy на 10-40% от исходного значения. Нет "идеального" значения, поэтому экспериментируйте с различными значениями энергии в зависимости от света и его окружения.

  • Установите Specular в 0. Непрямое освещение не должно создавать видимых бликов, поэтому нам нужно полностью отключить бликовое освещение для вторичного света.

Для SpotLight3D можно использовать тот же трюк. В этом случае вторичный OmniLight3D должен быть размещён так, чтобы отражать, где большая часть света будет отскакивать. Обычно это рядом с основным местом воздействия SpotLight3D.

В примере ниже узел SpotLight3D используется для освещения пола комнаты. Однако, поскольку нет непрямого освещения, остальная часть комнаты остаётся полностью тёмной. В реальной жизни стены и потолок комнаты освещались бы отражённым светом. Использование узла OmniLight3D, размещённого между источником SpotLight3D и полом, позволяет имитировать этот эффект:

../../../_images/faking_global_illumination_comparison.webp