Найти тему
Терри МакГиннис

Как устроены компьютерные игры: свет

Оглавление

“Помни, Артем, пока ты находишься в тени - ты жив. Тень - твой друг!”. Это одни из первых слов Павла из Metro Last Light. Как вы уже наверняка поняли из названия и вступительных слов - сегодня речь пойдет об устройстве света в играх Что такое динамические и статическое освещение. Чем динамические объекты в играх отличаются от статических. И как динамический свет и статический, образуя смешенное освещение делают сегодняшние игры столь красивыми. Бросайте пельмешки на сковородку и айда со мной! На связи разработчик игр с восьмилетним стажем и мы начинаем.

Павел из игры Metro 2034
Павел из игры Metro 2034

Свет в реальном мире

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

Отбивания фотонов света от поверхности объекта
Отбивания фотонов света от поверхности объекта

Динамическое освещение

В играх используют очень похожую схему. Но в отличии от реальности, где свет должен отбиться от поверхности в глаз к человеку, в играх используется другой алгоритм. Во первых в большинстве игровых движков свет может отбиться от поверхности лишь один раз. Во вторых фатону света не нужно попадать в глаз или на камеру игрока. Всё что делает фотон - делает пиксель текстуры на который он упол ярче. По итогу выходит что те участки куда свет не долетел остаются темными. Но просчёт такого света проходит от 15 до 60 раз в секунду, что сильно бьёт по производительности.

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

Проектор как тень

Но для создания тени в игре необязателен свет вовсе. В играх Paradise City и NFS Most Wanted 2005 используют проектор для создания тени. Уверен вы знает намного больше таких игр. Опишите их в комментариях. При низких настройках графики тени в этих играх отключаются и просто включается проектор тени. Так как у нас в обоих играх это просто машины, для текстуры проектора используют серый прямоугольник (прямоугольник может быть не ровным и должен повторять форму машины). Теперь нужно лишь установить проектор под машину и когда машина будет стоять на земле, проектор будет проецировать темносерый прямоугольник на дорогу создавая видимость тени под машиной.

NFS Most Wanted 1) низкая графика с проектором в виде тени 2) высокая графика с тенью от солнца просчитываемой динамично
NFS Most Wanted 1) низкая графика с проектором в виде тени 2) высокая графика с тенью от солнца просчитываемой динамично

Статический свет и запекание света

Самая интересная по моему часть постройки света в игре. Часто бывает, что LvL дизайнеры точно знают что какие-то объекты (например дома, памятники, тумбочки и столы) не будут двигаться в игре. Как это можно использовать в игре? Пометив их как Static object (статические объекты) мы можем оптимизировать игру не просчитывая свет для этих объектов динамически, а просчитать его один раз.

Разработчики игр пошли дальше и научились записывать свет в карты освещения. Как это работает? У нас есть уровень в котором мы точно знаем какие объекты нерушимы и где находятся источники света. Всё что нам нужно - выпустить фотоны света и сохранить все их отбивания от объектов. Но как? Продублировав все текстуры в уровне и получив их копию уже с нанесёнными на них тенями. Так же не забывайте, что у нас неограниченное время, потому мы можем увеличить количество отбиваний фотона от поверхности и тем самым приблизить картинку к реальности. Я обычно использую значение от 5 до 8 отбиваний, что позволяет получить более мягкие тени и при этом не затратить много времени.

Сцена с динамичным светом и запечённым при источнике света в одном и том же месте
Сцена с динамичным светом и запечённым при источнике света в одном и том же месте

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

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

Но подводным камнем такого способа будет долгое запекание света. Уровень из скриншота выше я запекал около 6 часов, при том что мой core i5 был нагружен на 100% запеканием света. Но результат стоит того. Свет на локации распределился равномерно и правдоподобно. Хотя, если бы я добавил больше источников света и убавил их интенсивность - картинка была бы так же сносной, но при этом на динамический просчёт света компьютер тратил бы больше ресурсов.

Если запеченный свет смешать с динамическим светом - мы получим очень красивый результат. Именно такой подход используют в современных играх. Хотя есть игры, использующие только статическое освещение. Но чаще всего - это старые игры. Например Half Life 1 и Counter Strike 1.6.