Per aspera ad astra или RoadMap по вашей будущей игре. Godot 4 C# Часть 12 "Освещение".
Что касается визуального стиля, есть еще несколько интересных вещей, которые хотелось бы затронуть: освещение, шейдеры и VFX-эффекты.
Освещение – это очень важный аспект любой игры. Правильно подобранное освещение сильно сказывается на восприятии атмосферы игры, естественно, в лучшую сторону.
Например, смена дня и ночи в ARK: Survival Evolved очень сильно влияет не только на визуальное восприятие игры, но и на геймплей. Сложность игры в ночное время значительно возрастает.
Еще один пример: я недавно смотрел обзоры на S.T.A.L.K.E.R. 2. Об освещении от фонарика не сказал только ленивый. Динамическое освещение из первых частей положительно сказывалось на восприятии пространства, во второй же части выглядит как Doom 1993 года. Так что разработчикам S.T.A.L.K.E.R. 2 удалось визуализировать деградацию.
Некоторые механики вовсе построены на восприятии освещения и без него работать не будут. Вспомните, например, уровень Бездны или Склепа Великанов из Dark Souls.
В Godot освещение добавляется несколькими узлами:
- DirectionalLight3D: имитирует удалённый источник света, солнце или луну. Его лучи параллельны и освещают всю сцену равномерно. Это наиболее производительный тип света, но он может создавать нагрузку при расчёте теней.
- OmniLight3D: точечный источник, излучающий свет во всех направлениях (как лампочка). Подходит для локального освещения.
- SpotLight3D: создает конический пучок света (прожектор). Идеален для фонарей, светильников или спецэффектов.
Для 2D:
- PointLight2D - точечный свет;
- DirectionalLight2D - направленный свет, аналог солнц.
Основные проблемы, связанные с освещением, – это производительность, точность теней, световые утечки и артефакты при расчете.
Как-то я пытался добавить каждому снаряду, вылетающему из турели, источник света. К моему удивлению, работало это странно: какие-то снаряды светились, какие-то нет. Особенно это было заметно при большом количестве снарядов в сцене.
В итоге я выяснил, что движок позволяет создавать ограниченное количество источников освещения в сцене, и при достижении этого лимита лишние источники света не работают. Мне пришлось изменить подход и имитировать источник света за счёт шейдера (об этом чуть позже).
В целом освещение, особенно динамическое (например, SDFGI), – ресурсоёмкий процесс. Злоупотребление источниками света может сильно сказаться на производительности сцены (FPS). Поэтому был придуман такой подход, как запекание света.
Он работает только со статикой – другими словами, если у вас в игре есть движущиеся объекты или источники света (смена дня и ночи), данный метод не подходит. Запекание позволяет один раз просчитать взаимодействие света с геометрией и создать карту освещения. Далее видеокарте достаточно просто работать с этой картой без сложных расчётов.
Для запекания карт используется узел LightmapGI.
Часто используется комбинированный подход: создание запечённого освещения для окружения, а динамические тени для персонажей и движущихся объектов накладываются поверх карты освещения. Всё зависит от того, что вы хотите сделать.
Описывать всё детализировано нет смысла, так как статья потянет на половину книги. Поэтому рекомендую самостоятельно ознакомиться с видеоуроками по освещению на YouTube. Также в документации к движку есть неплохая статья по освещению.
Основная мысль – освещение особенно важно! Над ним реально стоит заморачиваться.
Спасибо за внимание!