Realtime-фотореализм в Unity-играх
Статья подготовлена на основе доклада инструктора школы Realtime Константина Кустова на CGEvent 2019.
Константин — инди-разработчик игр на Unity с 500 000+ скачиваний проектов на Steam.
В сегодняшнем уроке по созданию фотореалистичных сцен в Unity мы вместе превратим это:
в это:
За последние 35 лет компьютерные игры претерпели колоссальные изменения. Из перфокарт и дискет родилась целая вселенная цифровых развлечений. В наши дни визуальная составляющая для многих становится одной из главных характеристик игры наравне с сюжетом, геймплеем и музыкальным оформлением. Основная тенденция современной игровой графики — фотореализм: разработчики пытаются сделать так, чтобы скриншот из игры можно было спутать с кадром из фильма. Развитие фотореализма в играх похоже на становление реализма в изобразительном искусстве, и погоня за «идеальной картинкой» никогда не кончится. Технологии развиваются на наших глазах: недавно nVidia запустила линейку видеокарт RTX с новой технологией просчёта света в realtime, которая, скорее всего, станет ключевой в играх нового поколения. Компьютерная графика не выдерживает испытания временем: проекты, которые выглядят фантастически сейчас, устареют уже завтра.
Какие возможности доступны игроделам сегодня и какие есть ограничения?
+ фото-сканирование объектов:
особенно хорошо получается сканирование непрозрачных и неметаллических предметов: идеальный пример — камень;
+ эффекты освещения (свечение, объёмный свет):
в материале 3D-модели можно указать где, каким цветом и с какой интенсивностью объект светится;
- мало памяти и производительности на хорошие текстуры и прорисовку всех объектов:
из-за этого приходиться идти на ухищрения и делать низкополигональные версии с «низкими» текстурами для оптимизации;
- отражения, прозрачность и динамическое освещение:
главная проблема современных игр. Просчитать весь свет в реальном времени — трудоёмкая задача.
Что на практике?
Ещё в версии Unity 5 разработчикам стали доступны средства, правильное использование которых позволяет за несколько минут значительно улучшить визуальную составляющую любого Unity-проекта. В частности, используются «запекание» освещения и карты отражений совместно с эффектами пост-обработки.
Итак, у нас имеется следующая сцена со стандартным освещением:
1. Первое, с чего стоит начать — с неба
Заменяем стандартное серо-синее небо на своё из HDRI-фото. Для этого импортируем в проект текстуру неба в формате .hdr, задаём в настройках импорта
в инспекторе формат текстуры (Texture Shape) — кубическая (Cube):
Теперь создадим новый материал, выберем ему тип Skybox — Cubemap и укажем импортированную текстуру неба. Затем, в настройках освещения сцены (меню: Window > Rendering > Lighting Settings) меняем стандартный материал окружения на созданный материал неба:
Результат первого этапа:
2. Следующий шаг — запекание освещения.
Перед этим шагом необходимо сменить пространство цветов на линейное (linear) в Edit > Project Settings. В категории Player ищем Other Settings и в Rendering меняем Color Space на Linear. Теперь возвращаемся в сцену и помечаем в окне инспектора объекты интерьера как статичные. Снова открываем
окно настройки освещения в сцене (меню: Window > Rendering > Lighting Settings), нажимаем на кнопку Generate Lightmap и идём за кружечкой кофе: запекание освещения занимает много времени.
Если у вас в компьютере мощная видеокарта, можете попробовать выбрать её в качестве лайтмэппера, но: эта опция пока в бете и возможно появление артефактов.
Сцена после запекания:
Если заметны артефакты запекания, то, скорее всего, для данной модели ее 3D-дизайнером не были сгенерированы карты освещения. Исправляем: идём в настройки импорта модели и ставим галочку Generate Lightmap UVs. Если это не помогло, можно увеличить масштаб объекта на карте освещения (у MeshRenderer’а увеличиваем Scale in Lightmap) или из настройки запекания.
3. Займемся материалами.
В Unity используются материалы на основе физики (Physically Based Rendering — PBR). Эти материалы способны корректно реагировать на изменения
окружающей среды и освещения и обладают физическими свойствами для правильного просчета освещения. PBR-материалы представляются наборами картинок — карт, каждая из которых описывает какое-либо одно физическое свойство материала. Например, карта Metallic описывает, насколько хорошо объект отражает свет.
Для экономии времени мы не будем создавать материалы с нуля, а воспользуемся готовыми. Для создания PBR-материала создаём обычный новый материал в проекте и назначаем скачанные текстуры в качестве соответствующих карт:
4. Применяем созданные материалы к объектам в сцене:
Как видите, после применения новых материалов сцена стала выглядеть неестественно. Это происходит потому, что в нашей сцене нет информации об отражениях, и поэтому в качестве карты отражений используется небо. Исправим это: создаём новый Reflection Probe (меню: GameObject > Light > Reflection Probe), размещаем его посередине комнаты, ставим галочку Box Projection в инспекторе и подгоняем его размеры под комнату, нажав на кнопку с тремя точками:
5. Не забываем снова запечь освещение (повторяем шаг 2). Теперь материалы получили карту отражений и работают корректно:
6. Последний шаг — добавление эффектов пост-обработки.
В Unity эти эффекты включены в пакет Post-Processing. Для их использования нужно скачать этот пакет в менеджере пакетов (меню: Window > Package Manager). Ищем там нужный пакет и нажимаем на кнопку Install:
Теперь нужно всё настроить:
- Меняем у камеры Rendering path на Deferred.
- Создаём в проекте новый слой c названием PostProcessing.
- Добавляем компонент Post-process Layer через меню: Component > Rendering > Post-process Layer. В его опциях ставим в качестве слоя наш созданный слой PostProcessing и включаем режим сглаживания (Anti-aliasing) TAA:
- Создаём в сцене новый объём пост-обработки (Post-Processing Volume): меню GameObject > 3D Object > Post-process Volume. У него ставим галочку isGlobal и меняем его слой на слой PostProcessing. Нажимаем на кнопку New — теперь мы готовы добавлять эффекты:
- Нажимаем на Add Effect и выбираем нужный эффект по вкусу. Я добавил цветокоррекцию (ACES с экспозицией +2), свечение (intensity: 1), виньетку (intensity: 0.3) и экранные отражения.
Результат добавления эффектов:
Результатом нашей работы стало существенное визуальное улучшение сцены: добавились непрямое освещение и отражения. Уже на этом этапе мы видим значительные изменения, однако приближение к фотореализму — бесконечный процесс. В следующей статье мы протестируем RTX в Unity, обновив эту же сцену для использования RTX.
Вы можете сами поэкспериментировать с настройками этой сцены, скачав ее исходники.
Об авторе: Константин Кустов — инструктор Unity в школе Realtime.
Основатель компании KHB-Soft. Занимается программированием (C#, C++, игровые движки, мобильные платформы), web-дизайном и работой с 3D-графикой. В GameDev с 2010 года, коммерческой разработкой на Unity занимается с 2015 года. Создатель двух ассетов для Unity Asset Store и пяти инди-проектов в Steam, среди которых — музыкальные аркады и сюжетные игры.
Одна из наиболее популярных работ Константина — ритм-игра Intralism. Проект был запущен в Steam в 2016 году, а к зиме 2019 года игру купили более 300 000 человек, оставив 88% положительных отзывов. Суммарно же проекты Константина на Steam были скачаны более полумиллиона раз!
Константин поможет вам разобраться во всех особенностях игрового движка Unity и создать свой game-проект с нуля на курсах в Realtime School: