Рендеринг теней в приложениях реального времени представляет определенные проблемы по сравнению с их автономными аналогами. В автономных приложениях с трассировкой лучей и путей тени предоставляются «бесплатно» как часть алгоритма рендеринга, но в реальном времени нам обычно приходится полагаться на физически неточные многопроходные методы.

В этой серии статей я объясню различные способы достижения этого.

Я бы классифицировал наиболее распространенные методы следующим образом, в зависимости от варианта использования и типа света:

  • Static
     – Карты Baked Light
  • Динамический
     — Карты теней
     – Трафаретные тени

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

Начнем со статических теней.

Карты запеченного света

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

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

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

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

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

Я бы выбрал эту технику, если:

  • Окружающая среда и основные источники света, отбрасывающие тень, статичны.
  • Вам нужны максимально качественные и максимально реалистичные тени.
  • Вы хотите уменьшить количество источников света, отбрасывающих тени в реальном времени, сохраняя при этом тени, которые они отбрасывают на окружающую среду.
  • И/или вам нужно большое количество источников света, отбрасывающих тень

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

Я бы избегал этого, если бы:

  • У вас есть изменяющееся окружение:
    - Деревья, движущиеся по ветру
    - Разрушаемые конструкции
    - Строения, созданные пользователями
  • Источники света, отбрасывающие тень, меняют цвет, положение или интенсивность с течением времени:
    - Смена дня и ночи
    - Мерцающие или переключаемые источники света

Примером игры наихудшего случая для этой техники может быть мультяшная стратегия в реальном времени со сменой дня и ночи.

📚 Ссылки

1. Lightmapping: Начало работы (документы Unity) https://docs.unity3d.com/2018.2/Documentation/Manual/Lightmapping.html
2. Пример Battlefield 4: Что такое Baked Lighting? (Карта освещения)”: «https://www.youtube.com/watch?v=eGmXDOGjKPA