![](https://habrastorage.org/getpro/habr/upload_files/b5d/801/056/b5d8010562a5c89b1a940b24a5316762.png)
Освещение в играх напрямую влияет на наше восприятие происходящего на экране — и даже может являться основой геймплея. Как и в реальном мире, это понятие комплексное, едва ли реализуемое при помощи одного метода.
Пожалуй, ближе всего к этому смогла приблизиться трассировка лучей — простая по своей концепции, но требовательная к вычислительным ресурсам системы. И та получила свое развитие в игровой индустрии сравнительно недавно, с началом эпохи RTX. А ведь геймдев развивается гораздо дольше — и к сегодняшнему дню разработан уже не один метод симуляции распространения света в игровой сцене.
О методах реализации глобального освещения в играх (которые мы, кстати, используем и в своих проектах) и о том, что это вообще такое — далее в статье.
Прямое освещение, глобальное освещение, трассировка лучей, растеризация — разбираемся в понятиях
Для лучшего понимания, из чего вообще состоит освещение в играх, разделим его на два этапа:
Первый — прямое освещение (direct light). Это свет, исходящий непосредственно от источника (лампа накаливания, огонь, солнце), который затем проходит сквозь сцену и попадает в какую-то поверхность — например, террейн или любой другой внутриигровой объект.
Второй — непрямое освещение (indirect light) или глобальное освещение (global illumination), которое, попадая на поверхность, отражается от нее в разных направлениях и тем самым освещает другие поверхности вокруг. В зависимости от отражательной способности материала, такие переотражения могут происходить неоднократно то тех пор, пока световая энергия источника не истощится.
![](https://habrastorage.org/getpro/habr/upload_files/fcc/ae6/62c/fccae662c3375fc61773255350a3361f.png)
Именно непрямое освещение придает изображению большую реалистичность. На скриншоте ниже, например, показана сцена из Quake 2 RTX только с прямым освещением (слева) и с освещением ото всех источников сразу (справа).
![](https://habrastorage.org/getpro/habr/upload_files/7fa/eb7/720/7faeb77203a08788a5f9858561e80ed6.png)
Но его же и сложнее реализовать — при том сделать это хорошо.
Как уже упоминалось, лучше всего этой цели служит, конечно же, трассировка лучей. Суть ее заключается в следующем. Давайте представим, что на 3D-сцене расположена камера, имеющая конечное разрешение. Для получения трассировки лучей один из непосредственно лучей выстреливает из пикселя этой камеры в сцену и попадает в 3D-объект на ней. Этот объект с точки зрения пикселя можно закрасить, отследив больше лучей с этой точки. Например, с этого момента луч может продолжить движение в направлении источника света с целью выяснения, будет ли пиксель находиться в тени от этого источника света или на него воздействовать. Или другой луч также может быть отправлен в сцену и иметь в ней отражения и даже переотражения в зависимости от свойств материала объекта. Чтобы получить еще более точную информацию о цвете для этого пикселя, понадобится больше лучей и больше отражений — а значит, гораздо больше времени на вычисления.
Хотя сама по себе концепция трассировки лучей проста, эта технология очень ресурсозатратна: так, даже для игры 1997 года реализовать ее удалось лишь к 2019 году. Поэтому до недавнего времени игровая графика чаще всего рисовалась на экранах с помощью гораздо более быстрой техники — растеризации.
Проблема с растеризацией в том, что она на самом деле не про свет: это просто способ отрисовки трехмерных объектов на двумерном экране. Растеризация — это процесс, при котором трехмерный объект преобразуется в двухмерное изображение на основе перспективы с целью получения правильной геометрии без затенения на двумерном изображении.
![](https://habrastorage.org/getpro/habr/upload_files/fbd/a39/8a2/fbda398a2ba5f1f62cbe872aaa1f47a4.png)
По умолчанию она вообще не имитирует освещение и не особо этим занимается. А чтобы получить достоверное освещение и затенение объектов, требуются дополнительные проходы вычислений.
Как выглядит освещение при растеризации? Представьте источник света, помещенный в трехмерное пространство. Поверхность объектов в сцене затеняется в зависимости от их нормали и направления вектора света: таким образом, отдаленная от источника света часть объекта будет темнее, находящаяся ближе к свету — светлее. В данном случае речь идет только о прямом освещении: растеризация по умолчанию не отображает никаким образом непрямой свет.
Впрочем, несмотря на это, непрямое освещение в 3D-играх существует уже очень давно — иначе все бы они были похожи на Doom III, где градации тени как таковой практически нет.
![](https://habrastorage.org/getpro/habr/upload_files/227/b2f/423/227b2f423d12e74635eef8ef465b847a.png)
Ниже мы как раз рассмотрим — не исчерпывающий — список техник, при помощи которых в играх эмулируют непрямое освещение.
Карты освещения (Lightmaps)
Первый метод, о котором мы поговорим, — lightmapping. Техника эта использовалась еще в оригинальном Quake II 1997 года и используется до сих пор даже в самых современных тайтлах — но, конечно, в более продвинутом и детализированном виде.
Заключается она в том, чтобы предварительно рассчитать информацию об освещении в игровой сцене и заложить ее в текстуру, которая впоследствии будет применяться к этой сцене. Таким образом, метод карт освещения избавляет игру от необходимости расчета освещения в реальном времени, что дает огромный выигрыш в производительности.
![](https://habrastorage.org/getpro/habr/upload_files/7b5/ac7/42a/7b5ac742aba30e657f60e9a2df69c4b4.png)
Впрочем, как и любая другая техника, она имеет ряд недостатков:
Карты освещения хороши только для статических объектов, иначе свет в сцене не будет выглядеть согласованным и реалистичным. Это накладывает сильные ограничения на геймдизайн и интерактивность и требует иных техник освещения для динамических объектов — одними картами освещения будет уже не обойтись.
Карты освещения из-за своей статичности могут отображать только рассеянное освещение и не подходят для имитации зеркальных поверхностей, поскольку они во многом зависят от положения камеры. Таким образом, они хорошо подойдут, например, для бетонных поверхностей, но не металлических.
Как и любые текстуры, карты освещения имеют конечное и, как правило, довольно низкое разрешение, из-за чего могут возникать артефакты на поверхностях, такие как рваные края и пикселизация. Во избежание этого, метод может потребовать довольно большого объема видеопамяти.
Техника все время улучшается и обрастает модернизациями, пытающимися решить перечисленные проблемы — но многое все равно упирается в необходимость освещения динамических объектов, и тогда на помощь приходят другие методы.
![В Half-Life 2 Valve активно использовала световые карты (2011) В Half-Life 2 Valve активно использовала световые карты (2011)](https://habrastorage.org/getpro/habr/upload_files/019/17e/b25/01917eb25fbd03f1b91b4ef6862aad4c.png)
Освещение на основе изображения (Image-based lighting)
Техника IBL работает следующим образом: давайте представим, что шесть камер снимают одну и ту же сцену с одной и той же точки в шести разных направлениях, тем самым образуя кубическую карту (cube map).
![](https://habrastorage.org/getpro/habr/upload_files/683/90e/572/68390e572f9018bb977d56fa3809ea72.png)
Впоследствии этот куб можно преобразовать в сферу, которую затем можно применить к различным — в частности, глянцевым — поверхностям для получения непрямого освещения.
![](https://habrastorage.org/getpro/habr/upload_files/b19/bbd/c0d/b19bbdc0d821400f5013c7d0fe40d2a3.gif)
Шесть граней карты позволяют получить меняющиеся в зависимости от угла камеры отражения, захватывая в том числе и происходящее за пределами экрана. Техника уже довольно старая — используется в играх с начала 2000-ых. И, как обычно, имеет свои недостатки:
Таким кубическим картам нужно иметь высокое разрешение, чтобы создавать убедительные отражения. Это, в свою очередь, требует немалого объема видеопамяти и ограничивает количество кубический карт, которые можно использовать в одной сцене.
Кубическая карта — это снимок мира с определенной точки, далеко не всегда совпадающей с камерой игрока, что может привести к проблемам с перспективой на поверхностях с высоким отражением. Проблему можно решить увеличением количества кубических карт в сцене, но это потребует большого объема видеопамяти.
Несмотря на то, что кубические карты можно применять к динамическим объектам, сама она может быть и не динамической. Обычно под ней подразумевается статический снимок окружения. Так что если в вашей игре, допустим, динамически меняется время суток, одна и та же кубическая карта не подойдет для дневного и вечернего освещения. В таком случае нужно будет пересчитывать ее в реальном времени, а это очень дорого.
И последнее: освещение на основе изображения включает в себя вклады в освещение окружающих объектов, но не самого объекта, к которому оно применяется. Скажем, металлические предметы сложной формы так или иначе могут отражаться на собственных поверхностях, но в случае с кубическими картами это крайне сложно учесть.
Наибольшее распространение эта техника получила, пожалуй, в гоночных симуляторах, которые используют кубические карты в реальном времени, закрепленные на модели автомобиля игрока. Это позволяет учитывать зеркальные и рассеянные отражения на протяжении всей трассы и адаптироваться к изменениям в окружающей среде, хотя и требует ряда оптимизаций — например, для таких карт обычно используется упрощенная версия сцены с более низким разрешением и/или FPS.
![Скриншот из Need for Speed: Payback Скриншот из Need for Speed: Payback](https://habrastorage.org/getpro/habr/upload_files/bec/594/3dd/bec5943dd85176f2197d01420595401b.png)
Непрямое освещение на основе световых проб (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](https://habrastorage.org/getpro/habr/upload_files/5f1/0aa/4a3/5f10aa4a37648bcc0d29ce36bf419536.png)
Такие зонды можно размещать на уровне с разной плотностью либо равномерно в виде сеток, использовать для статического освещения и обновлять динамически.
![Far Cry 3 стала одной из первых игр, использующих световые пробы для динамического освещения со сменой времени суток. Источник: https://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-Global Far Cry 3 стала одной из первых игр, использующих световые пробы для динамического освещения со сменой времени суток. Источник: https://www.gdcvault.com/play/1015326/Deferred-Radiance-Transfer-Volumes-Global](https://habrastorage.org/getpro/habr/upload_files/476/cc2/fbf/476cc2fbf3beb9cddf4475c7daaf585e.png)
Основное преимущество световых проб заключается в их размере. Из-за того, что они крайне малы, места в видеопамяти они занимают немного — а значит, их можно обновлять экономнее, чем в случае кубических карт. А также расставить куда большее количество таких зондов на уровне, благодаря чему освещение может оказаться даже более детальным, чем в случае с кубическими картами.
Однако и здесь есть свои минусы и компромиссы:
Столь малые зонды улавливают лишь основную информацию о свете — а значит, хуже работают с отражающими поверхностями в сравнении с кубическими картами.
Система зондов может создавать прерывистое освещение для динамических объектов, да и вообще сильно зависит от плотности расположения проб. Освещение от световой пробы может просачиваться даже сквозь объекты, создавая косвенное освещение и эффект свечения в затененных областях.
Из-за низкой точности световые пробы не в состоянии отображать мелкие детали и тени, из-за чего затенение поверх освещения на основе проб зачастую нужно накладывать дополнительно иными способами.
Как можно заметить, оговорка про использование дополнительных техник освещения звучала неоднократно: все эти методы вовсе не обязательно являются конкурирующими и взаимоисключающими — скорее наоборот, все чаще в современных играх используются их комбинации и различные улучшения. Например, мы уже раньше писали статью о том, как реализовали кастомные тени в своих проектах: предварительно рассчитанное освещение для статики — при помощи теневых карт, для динамической геометрии — зонды освещения.
![](https://habrastorage.org/getpro/habr/upload_files/a99/f58/b8f/a99f58b8fbaccf9b37f0f98e0793fa64.png)
![](https://habrastorage.org/getpro/habr/upload_files/b26/5da/b7b/b265dab7b3aac326e1e0d59c5a75bfd3.png)
Все это доказывает, что, сколько бы еще различных методов не было изобретено, рендеринг действительно правдоподобного непрямого освещения в реальном времени — сложная задача, требующая комплексных решений.
Комментарии (10)
Fixthisis
08.10.2021 12:32+2За скрин из DOOM III отдельный респект. Считаю одним из лучших ФПС по сей день. Атмосфера, графика (на то время) - огонь!
docent27
11.10.2021 14:53Я с вами полностью согласен. На момент выхода мне его графика казалась вообще кинематографической.
chelovek-jpeg
14.10.2021 09:49края теней слишком уж резкие были (их кстати можно было включить в квейке 3). В том же году вышел хл2, вот там действительно фотореалистичная графика, даже сегодня (в версии до обновлений с постфильтрами), просто текстуры мутные и модели угловатые, но картинка очень правдоподобная, благодаря хорошему освещению и использованию текстур, сделанных из фото, в отличие от пластикового дума 3
BattleAngelAlita
08.10.2021 12:53-4Ммм… О чём статья то? О том что есть латмапы?
omgwhatswrong Автор
08.10.2021 13:09+3Обзорная по основным существующим техникам освещения и возможности их взаимодополнения — в том числе и про лайтмапы
docent27
11.10.2021 15:03Да, свет в играх очень важная составляющая, особенно в хоррорах, где от него напрямую зависит погружение.
chelovek-jpeg
14.10.2021 11:33Техника эта использовалась еще в оригинальном Quake II 1997 года
да даже в первом квейке)
GCU
15.10.2021 00:44С некоторыми оговорками - карты освещения в Quake плохо подходили к текстурам в GPU - это явно заметно по glQuake. В то время в OpenGL был довольно жёсткий конвейер по многослойному текстурированию и GL_MODULATE для карт освещения выглядел убого даже по сравнению с софтовым рендерером. Полноцветной текстурой мазня карт освещения стала в Quake 2.
P.S. В Quake карты освещения были с единственным каналом яркости, и утилита light, которая их рассчитывала, изначально умела считать только прямое освещение. В Quake 2 карта освещения стала цветной текстурой и утилита считала уже не только прямое освещение. В Half-life 2 карты освещения были представлены несколькими цветными текстурами для разных нормалей к поверхности.
maximfaustov
игростроение в целом очень интересная сфера, тут есть средства и значит она развивается, я тоже всегда обращаю внимание на освещение, в хороших современных играх это целое искусство сделать имитацию действительно реального освещения