Декомпозиция света: как работает освещение в играх
Освещение в играх напрямую влияет на наше восприятие происходящего на экране — и даже может являться основой геймплея. Как и в реальном мире, это понятие комплексное, едва ли реализуемое при помощи одного метода.
Пожалуй, ближе всего к этому смогла приблизиться трассировка лучей — простая по своей концепции, но требовательная к вычислительным ресурсам системы. И та получила свое развитие в игровой индустрии сравнительно недавно, с началом эпохи RTX. А ведь геймдев развивается гораздо дольше — и к сегодняшнему дню разработан уже не один метод симуляции распространения света в игровой сцене.
О методах реализации глобального освещения в играх (которые мы, кстати, используем и в своих проектах) и о том, что это вообще такое — далее в статье.
Прямое освещение, глобальное освещение, трассировка лучей, растеризация — разбираемся в понятиях
Для лучшего понимания, из чего вообще состоит освещение в играх, разделим его на два этапа:
Первый — прямое освещение (direct light). Это свет, исходящий непосредственно от источника (лампа накаливания, огонь, солнце), который затем проходит сквозь сцену и попадает в какую-то поверхность — например, террейн или любой другой внутриигровой объект.
Второй — непрямое освещение (indirect light) или глобальное освещение (global illumination), которое, попадая на поверхность, отражается от нее в разных направлениях и тем самым освещает другие поверхности вокруг. В зависимости от отражательной способности материала, такие переотражения могут происходить неоднократно то тех пор, пока световая энергия источника не истощится.
Именно непрямое освещение придает изображению большую реалистичность. На скриншоте ниже, например, показана сцена из Quake 2 RTX только с прямым освещением (слева) и с освещением ото всех источников сразу (справа).
Но его же и сложнее реализовать — при том сделать это хорошо.
Как уже упоминалось, лучше всего этой цели служит, конечно же, трассировка лучей. Суть ее заключается в следующем. Давайте представим, что на 3D-сцене расположена камера, имеющая конечное разрешение. Для получения трассировки лучей один из непосредственно лучей выстреливает из пикселя этой камеры в сцену и попадает в 3D-объект на ней. Этот объект с точки зрения пикселя можно закрасить, отследив больше лучей с этой точки. Например, с этого момента луч может продолжить движение в направлении источника света с целью выяснения, будет ли пиксель находиться в тени от этого источника света или на него воздействовать. Или другой луч также может быть отправлен в сцену и иметь в ней отражения и даже переотражения в зависимости от свойств материала объекта. Чтобы получить еще более точную информацию о цвете для этого пикселя, понадобится больше лучей и больше отражений —, а значит, гораздо больше времени на вычисления.
Хотя сама по себе концепция трассировки лучей проста, эта технология очень ресурсозатратна: так, даже для игры 1997 года реализовать ее удалось лишь к 2019 году. Поэтому до недавнего времени игровая графика чаще всего рисовалась на экранах с помощью гораздо более быстрой техники — растеризации.
Проблема с растеризацией в том, что она на самом деле не про свет: это просто способ отрисовки трехмерных объектов на двумерном экране. Растеризация — это процесс, при котором трехмерный объект преобразуется в двухмерное изображение на основе перспективы с целью получения правильной геометрии без затенения на двумерном изображении.
По умолчанию она вообще не имитирует освещение и не особо этим занимается. А чтобы получить достоверное освещение и затенение объектов, требуются дополнительные проходы вычислений.
Как выглядит освещение при растеризации? Представьте источник света, помещенный в трехмерное пространство. Поверхность объектов в сцене затеняется в зависимости от их нормали и направления вектора света: таким образом, отдаленная от источника света часть объекта будет темнее, находящаяся ближе к свету — светлее. В данном случае речь идет только о прямом освещении: растеризация по умолчанию не отображает никаким образом непрямой свет.
Впрочем, несмотря на это, непрямое освещение в 3D-играх существует уже очень давно — иначе все бы они были похожи на Doom 3, где градации тени как таковой практически нет.
Ниже мы как раз рассмотрим — не исчерпывающий — список техник, при помощи которых в играх эмулируют непрямое освещение.
Карты освещения (Lightmaps)
Первый метод, о котором мы поговорим, — lightmapping. Техника эта использовалась еще в оригинальном Quake II 1997 года и используется до сих пор даже в самых современных тайтлах — но, конечно, в более продвинутом и детализированном виде.
Заключается она в том, чтобы предварительно рассчитать информацию об освещении в игровой сцене и заложить ее в текстуру, которая впоследствии будет применяться к этой сцене. Таким образом, метод карт освещения избавляет игру от необходимости расчета освещения в реальном времени, что дает огромный выигрыш в производительности.
Впрочем, как и любая другая техника, она имеет ряд недостатков:
Карты освещения хороши только для статических объектов, иначе свет в сцене не будет выглядеть согласованным и реалистичным. Это накладывает сильные ограничения на геймдизайн и интерактивность и требует иных техник освещения для динамических объектов — одними картами освещения будет уже не обойтись.
Карты освещения из-за своей статичности могут отображать только рассеянное освещение и не подходят для имитации зеркальных поверхностей, поскольку они во многом зависят от положения камеры. Таким образом, они хорошо подойдут, например, для бетонных поверхностей, но не металлических.
Как и любые текстуры, карты освещения имеют конечное и, как правило, довольно низкое разрешение, из-за чего могут возникать артефакты на поверхностях, такие как рваные края и пикселизация. Во избежание этого, метод может потребовать довольно большого объема видеопамяти.
Техника все время улучшается и обрастает модернизациями, пытающимися решить перечисленные проблемы —, но многое все равно упирается в необходимость освещения динамических объектов, и тогда на помощь приходят другие методы.
В Half-Life 2 Valve активно использовала световые карты (2011)
Освещение на основе изображения (Image-based lighting)
Техника IBL работает следующим образом: давайте представим, что шесть камер снимают одну и ту же сцену с одной и той же точки в шести разных направлениях, тем самым образуя кубическую карту (cube map).
Впоследствии этот куб можно преобразовать в сферу, которую затем можно применить к различным — в частности, глянцевым — поверхностям для получения непрямого освещения.
Шесть граней карты позволяют получить меняющиеся в зависимости от угла камеры отражения, захватывая в том числе и происходящее за пределами экрана. Техника уже довольно старая — используется в играх с начала 2000-ых. И, как обычно, имеет свои недостатки:
Таким кубическим картам нужно иметь высокое разрешение, чтобы создавать убедительные отражения. Это, в свою очередь, требует немалого объема видеопамяти и ограничивает количество кубический карт, которые можно использовать в одной сцене.
Кубическая карта — это снимок мира с определенной точки, далеко не всегда совпадающей с камерой игрока, что может привести к проблемам с перспективой на поверхностях с высоким отражением. Проблему можно решить увеличением количества кубических карт в сцене, но это потребует большого объема видеопамяти.
Несмотря на то, что кубические карты можно применять к динамическим объектам, сама она может быть и не динамической. Обычно под ней подразумевается статический снимок окружения. Так что если в вашей игре, допустим, динамически меняется время суток, одна и та же кубическая карта не подойдет для дневного и вечернего освещения. В таком случае нужно будет пересчитывать ее в реальном времени, а это очень дорого.
И последнее: освещение на основе изображения включает в себя вклады в освещение окружающих объектов, но не самого объекта, к которому оно применяется. Скажем, металлические предметы сложной формы так или иначе могут отражаться на собственных поверхностях, но в случае с кубическими картами это крайне сложно учесть.
Наибольшее распространение эта техника получила, пожалуй, в гоночных симуляторах, которые используют кубические карты в реальном времени, закрепленные на модели автомобиля игрока. Это позволяет учитывать зеркальные и рассеянные отражения на протяжении всей трассы и адаптироваться к изменениям в окружающей среде, хотя и требует ряда оптимизаций — например, для таких карт обычно используется упрощенная версия сцены с более низким разрешением и/или FPS.
Скриншот из 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
Такие зонды можно размещать на уровне с разной плотностью либо равномерно в виде сеток, использовать для статического освещения и обновлять динамически.
Far Cry 3 стала одной из первых игр, использующих световые пробы для динамического освещения со сменой времени суток. Источник: https://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-Global
Основное преимущество световых проб заключается в их размере. Из-за того, что они крайне малы, места в видеопамяти они занимают немного —, а значит, их можно обновлять экономнее, чем в случае кубических карт. А также расставить куда большее количество таких зондов на уровне, благодаря чему освещение может оказаться даже более детальным, чем в случае с кубическими картами.
Однако и здесь есть свои минусы и компромиссы:
Столь малые зонды улавливают лишь основную информацию о свете —, а значит, хуже работают с отражающими поверхностями в сравнении с кубическими картами.
Система зондов может создавать прерывистое освещение для динамических объектов, да и вообще сильно зависит от плотности расположения проб. Освещение от световой пробы может просачиваться даже сквозь объекты, создавая косвенное освещение и эффект свечения в затененных областях.
Из-за низкой точности световые пробы не в состоянии отображать мелкие детали и тени, из-за чего затенение поверх освещения на основе проб зачастую нужно накладывать дополнительно иными способами.
Как можно заметить, оговорка про использование дополнительных техник освещения звучала неоднократно: все эти методы вовсе не обязательно являются конкурирующими и взаимоисключающими — скорее наоборот, все чаще в современных играх используются их комбинации и различные улучшения. Например, мы уже раньше писали статью о том, как реализовали кастомные тени в своих проектах: предварительно рассчитанное освещение для статики — при помощи теневых карт, для динамической геометрии — зонды освещения.
Все это доказывает, что, сколько бы еще различных методов не было изобретено, рендеринг действительно правдоподобного непрямого освещения в реальном времени — сложная задача, требующая комплексных решений.