Realtime-фотореализм в Unity-играх

Статья подготовлена на основе доклада инструктора школы Realtime Константина Кустова на CGEvent 2019.
Константин — инди-разработчик игр на Unity с 500 000+ скачиваний проектов на Steam.

В сегодняшнем уроке по созданию фотореалистичных сцен в Unity мы вместе превратим это:

Unity_Photorealistic_Artboard 1.jpg

в это:

Unity_Photorealistic_Artboard 2.jpg

За последние 35 лет компьютерные игры претерпели колоссальные изменения. Из перфокарт и дискет родилась целая вселенная цифровых развлечений. В наши дни визуальная составляющая для многих становится одной из главных характеристик игры наравне с сюжетом, геймплеем и музыкальным оформлением. Основная тенденция современной игровой графики — фотореализм: разработчики пытаются сделать так, чтобы скриншот из игры можно было спутать с кадром из фильма. Развитие фотореализма в играх похоже на становление реализма в изобразительном искусстве, и погоня за «идеальной картинкой» никогда не кончится. Технологии развиваются на наших глазах: недавно nVidia запустила линейку видеокарт RTX с новой технологией просчёта света в realtime, которая, скорее всего, станет ключевой в играх нового поколения. Компьютерная графика не выдерживает испытания временем: проекты, которые выглядят фантастически сейчас, устареют уже завтра.

Какие возможности доступны игроделам сегодня и какие есть ограничения?

+ фото-сканирование объектов:
особенно хорошо получается сканирование непрозрачных и неметаллических предметов: идеальный пример — камень;

+ эффекты освещения (свечение, объёмный свет):
в материале 3D-модели можно указать где, каким цветом и с какой интенсивностью объект светится;

- мало памяти и производительности на хорошие текстуры и прорисовку всех объектов:
из-за этого приходиться идти на ухищрения и делать низкополигональные версии с «низкими» текстурами для оптимизации;

- отражения, прозрачность и динамическое освещение:
главная проблема современных игр. Просчитать весь свет в реальном времени — трудоёмкая задача.

Что на практике?

Ещё в версии Unity 5 разработчикам стали доступны средства, правильное использование которых позволяет за несколько минут значительно улучшить визуальную составляющую любого Unity-проекта. В частности, используются «запекание» освещения и карты отражений совместно с эффектами пост-обработки.

Итак, у нас имеется следующая сцена со стандартным освещением:

Unity_Photorealistic_Artboard 3.jpg


1. Первое, с чего стоит начать — с неба

Заменяем стандартное серо-синее небо на своё из HDRI-фото. Для этого импортируем в проект текстуру неба в формате .hdr, задаём в настройках импорта
в инспекторе формат текстуры (Texture Shape) — кубическая (Cube):

Unity_Photorealistic_Artboard 4.jpg

Теперь создадим новый материал, выберем ему тип Skybox — Cubemap и укажем импортированную текстуру неба. Затем, в настройках освещения сцены (меню: Window > Rendering > Lighting Settings) меняем стандартный материал окружения на созданный материал неба:

Unity_Photorealistic_Artboard 5.jpg


Результат первого этапа:

Unity_Photorealistic_Artboard 6.jpg


2. Следующий шаг — запекание освещения.

Перед этим шагом необходимо сменить пространство цветов на линейное (linear) в Edit > Project Settings. В категории Player ищем Other Settings и в Rendering меняем Color Space на Linear. Теперь возвращаемся в сцену и помечаем в окне инспектора объекты интерьера как статичные. Снова открываем
окно настройки освещения в сцене (меню: Window > Rendering > Lighting Settings), нажимаем на кнопку Generate Lightmap и идём за кружечкой кофе: запекание освещения занимает много времени.

Unity_Photorealistic_Artboard 8.jpg

Если у вас в компьютере мощная видеокарта, можете попробовать выбрать её в качестве лайтмэппера, но: эта опция пока в бете и возможно появление артефактов.

Сцена после запекания:

Unity_Photorealistic_Artboard 9.jpg


Если заметны артефакты запекания, то, скорее всего, для данной модели ее 3D-дизайнером не были сгенерированы карты освещения. Исправляем: идём в настройки импорта модели и ставим галочку Generate Lightmap UVs. Если это не помогло, можно увеличить масштаб объекта на карте освещения (у MeshRenderer’а увеличиваем Scale in Lightmap) или из настройки запекания.

Unity_Photorealistic_Artboard 7.jpg


3. Займемся материалами.

В Unity используются материалы на основе физики (Physically Based Rendering — PBR). Эти материалы способны корректно реагировать на изменения
окружающей среды и освещения и обладают физическими свойствами для правильного просчета освещения. PBR-материалы представляются наборами картинок — карт, каждая из которых описывает какое-либо одно физическое свойство материала. Например, карта Metallic описывает, насколько хорошо объект отражает свет.

Для экономии времени мы не будем создавать материалы с нуля, а воспользуемся готовыми. Для создания PBR-материала создаём обычный новый материал в проекте и назначаем скачанные текстуры в качестве соответствующих карт:

Unity_Photorealistic_Artboard 10.jpg


4. Применяем созданные материалы к объектам в сцене:

Unity_Photorealistic_Artboard 11.jpg


Как видите, после применения новых материалов сцена стала выглядеть неестественно. Это происходит потому, что в нашей сцене нет информации об отражениях, и поэтому в качестве карты отражений используется небо. Исправим это: создаём новый Reflection Probe (меню: GameObject > Light > Reflection Probe), размещаем его посередине комнаты, ставим галочку Box Projection в инспекторе и подгоняем его размеры под комнату, нажав на кнопку с тремя точками:

Unity_Photorealistic_Artboard 12.jpg


5. Не забываем снова запечь освещение (повторяем шаг 2). Теперь материалы получили карту отражений и работают корректно:

Unity_Photorealistic_Artboard 13.jpg


6. Последний шаг — добавление эффектов пост-обработки.

В Unity эти эффекты включены в пакет Post-Processing. Для их использования нужно скачать этот пакет в менеджере пакетов (меню: Window > Package Manager). Ищем там нужный пакет и нажимаем на кнопку Install:

Unity_Photorealistic_Artboard 14.jpg


Теперь нужно всё настроить:

  • Меняем у камеры Rendering path на Deferred.
  • Создаём в проекте новый слой c названием PostProcessing.
  • Добавляем компонент Post-process Layer через меню: Component > Rendering > Post-process Layer. В его опциях ставим в качестве слоя наш созданный слой PostProcessing и включаем режим сглаживания (Anti-aliasing) TAA:

Unity_Photorealistic_Artboard 15.jpg

  • Создаём в сцене новый объём пост-обработки (Post-Processing Volume): меню GameObject > 3D Object > Post-process Volume. У него ставим галочку isGlobal и меняем его слой на слой PostProcessing. Нажимаем на кнопку New — теперь мы готовы добавлять эффекты:

Unity_Photorealistic_Artboard 16.jpg

  • Нажимаем на Add Effect и выбираем нужный эффект по вкусу. Я добавил цветокоррекцию (ACES с экспозицией +2), свечение (intensity: 1), виньетку (intensity: 0.3) и экранные отражения.

Результат добавления эффектов:

result 2.gif

Результатом нашей работы стало существенное визуальное улучшение сцены: добавились непрямое освещение и отражения. Уже на этом этапе мы видим значительные изменения, однако приближение к фотореализму — бесконечный процесс. В следующей статье мы протестируем 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:

766 0 850 4
3
2020-02-06
первое с чего стоило начать - озвучить версию юньки, до интеграции HDRP или после? чтоб знать, актуально после выхода этой новости или нет https://render.ru/ru/news/post/17149

по результату урока критика - текстура кирпича растянута, промежуточный результат после запекания света выглядит лучше, чем с этим кирпичом текстурой.
ну а вообще в целом урок оказался полезным, и простым - не занимающим много времени. за что спс!

чем можно было бы ещё обогатить урок, или расширить.. прокатать тему - как делают домики из заранее заготовленных кусочков стен, окон, типа как в игре sims, стыкуют эти блоки кусочков досок пола и стен, крыш с привязкой по вертексам, и потом запекают свет - и всё выглядит целостно.
2020-02-08
ещё раз спс, думаю формат статьи хорош как шпаргалка, потому как рецепт состоит из всяких малозапоминаемых чекбоксов и рудиментарных по своему качеству интерфейса действий (которые в будущем в Юнити думаю будут сведены в более лаконичное интуитивно простое управление)
2020-02-10
Занятно, что иллюстрация даже близко не фотореалистичная...
RENDER.RU