Декомпозиция света: как работает освещение в играх

image-loader.svg

Освещение в играх напрямую влияет на наше восприятие происходящего на экране — и даже может являться основой геймплея. Как и в реальном мире, это понятие комплексное, едва ли реализуемое при помощи одного метода. 

Пожалуй, ближе всего к этому смогла приблизиться трассировка лучей — простая по своей концепции, но требовательная к вычислительным ресурсам системы. И та получила свое развитие в игровой индустрии сравнительно недавно, с началом эпохи RTX. А ведь геймдев развивается гораздо дольше — и к сегодняшнему дню разработан уже не один метод симуляции распространения света в игровой сцене.

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

Прямое освещение, глобальное освещение, трассировка лучей, растеризация — разбираемся в понятиях

Для лучшего понимания, из чего вообще состоит освещение в играх, разделим его на два этапа:

  • Первый — прямое освещение (direct light). Это свет, исходящий непосредственно от источника (лампа накаливания, огонь, солнце), который затем проходит сквозь сцену и попадает в какую-то поверхность — например, террейн или любой другой внутриигровой объект.

  • Второй — непрямое освещение (indirect light) или глобальное освещение (global illumination), которое, попадая на поверхность, отражается от нее в разных направлениях и тем самым освещает другие поверхности вокруг. В зависимости от отражательной способности материала, такие переотражения могут происходить неоднократно то тех пор, пока световая энергия источника не истощится.

image-loader.svg

Именно непрямое освещение придает изображению большую реалистичность. На скриншоте ниже, например, показана сцена из Quake 2 RTX только с прямым освещением (слева) и с освещением ото всех источников сразу (справа).

image-loader.svg

Но его же и сложнее реализовать — при том сделать это хорошо.

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

Хотя сама по себе концепция трассировки лучей проста, эта технология очень ресурсозатратна: так, даже для игры 1997 года реализовать ее удалось лишь к 2019 году. Поэтому до недавнего времени игровая графика чаще всего рисовалась на экранах с помощью гораздо более быстрой техники — растеризации.

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

image-loader.svg

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

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

Впрочем, несмотря на это, непрямое освещение в 3D-играх существует уже очень давно — иначе все бы они были похожи на Doom 3, где градации тени как таковой практически нет.

image-loader.svg

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

Карты освещения (Lightmaps)

Первый метод, о котором мы поговорим, — lightmapping. Техника эта использовалась еще в оригинальном Quake II 1997 года и используется до сих пор даже в самых современных тайтлах — но, конечно, в более продвинутом и детализированном виде. 

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

image-loader.svg

Впрочем, как и любая другая техника, она имеет ряд недостатков:

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

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

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

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

В Half-Life 2 Valve активно использовала световые карты (2011)В Half-Life 2 Valve активно использовала световые карты (2011)

Освещение на основе изображения (Image-based lighting)

Техника IBL работает следующим образом: давайте представим, что шесть камер снимают одну и ту же сцену с одной и той же точки в шести разных направлениях, тем самым образуя кубическую карту (cube map).

image-loader.svg

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

image-loader.svg

Шесть граней карты позволяют получить меняющиеся в зависимости от угла камеры отражения, захватывая в том числе и происходящее за пределами экрана. Техника уже довольно старая — используется в играх с начала 2000-ых. И, как обычно, имеет свои недостатки:

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

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

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

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

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

Скриншот из Need for Speed: PaybackСкриншот из Need for Speed: Payback

Непрямое освещение на основе световых проб (Probe-based indirect lighting)

Эволюционное продолжение предыдущего метода, световые пробы предназначены для частичного решения проблем с видеопамятью и интерактивностью окружения. Упрощенно говоря, световые пробы (light probes) представляют собой зонд меньшего размера и с меньшим числом сторон, чем кубические карты — например, с четырьмя, а не шестью сторонами. То есть, идейно это та же кубическая карта, но более низкого разрешения и всего с несколькими битами цветовой информации.

Пример расстановки световых проб в сцене. Источник: https://research.nvidia.com/sites/default/files/pubs/2017-02_Real-Time-Global-Illumination/light-field-probes-final.pdf Пример расстановки световых проб в сцене. Источник: https://research.nvidia.com/sites/default/files/pubs/2017–02_Real-Time-Global-Illumination/light-field-probes-final.pdf 

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

Far Cry 3 стала одной из первых игр, использующих световые пробы для динамического освещения со сменой времени суток. Источник: https://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-GlobalFar Cry 3 стала одной из первых игр, использующих световые пробы для динамического освещения со сменой времени суток. Источник: https://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-Global

Основное преимущество световых проб заключается в их размере. Из-за того, что они крайне малы, места в видеопамяти они занимают немного —, а значит, их можно обновлять экономнее, чем в случае кубических карт. А также расставить куда большее количество таких зондов на уровне, благодаря чему освещение может оказаться даже более детальным, чем в случае с кубическими картами. 

Однако и здесь есть свои минусы и компромиссы:

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

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

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

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

image-loader.svgimage-loader.svg

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

© Habrahabr.ru