Доброго времени суток,

Сегодня я продолжаю рассмотрение графики в Небесном Крае. Начнём более классическое рассмотрение всего конвейера, чтобы узнать что таит в себе Creation Engine? Не будем тянуть кота, пусть спит. Окунёмся сразу в пучину графических ухищрений Беседки.

В целом конвейер состоит из 5 основных этапов:

  1. Отражения

  2. Карта Теней

  3. Тест Глубины

  4. Рендер

  5. Пост-обработка

Не бит, не крашен

Небесный край вышёл позавчера в 2011 году. PBR, отложенный рендер и все эти ваши высокотребовательные фичи - были не в чести. Даже перейдя к новому двиглу в 2015 году вчера, разработчики решили не вкладываться заново в разработку движка игры, ведь её не продадут ещё раз чтобы окупить затраты на новом продукте. Поэтому, окупили непонятно что на старом, было принято решение использовать старый производительный конвейер… поверх которого, прикрутить новый непроизводительный для пары пост-эффектов.

Дерево и железо не отличаются по работе света
Дерево и железо не отличаются по работе света

Придется признаться, сейчас уже никто не помнит, но в своё время, Скайрим не пошёл на Xbox 360 даже в 30 FPS, графику урезали производительность повышали как могли. Иногда, было сложно отличить, это соседние пиксели Cкайрима или телевизор забыли включить. Конечно, для работяг сделали послабления и отключили пытки в виде пост-эффектов, бесконечного размытия и очень важного свечения. Вот бы и остальным разрешили играть в чистую картинку, а не в эффект Уставших Глаз.

https://youtu.be/xENEdxlkgnE?si=FX2So2aRSa4CZ3aL&t=56

Все Скайримы не используют PBR(Физически Корректный Рендеринг) ни в каком виде. Всё настолько бескомпромиссно, что нет даже карты Specular/Глянцевой/Шероховатой поверхности - графику вырезали любой ценой. Собственно, в игре всё так и выглядит, как будто состоит из одного материала по типу дерева или пластилина. Выделяющиеся цвета металла и дерева - единственное, что позволяет различать материалы из которых состоят объекты. Слава Богам, что оставили хотя бы карту нормалей для объектов, иначе, мыло было бы ещё и полигональным.

Пример разных материалов созданных с помощью Физически Корректного Рендеринга
Пример разных материалов созданных с помощью Физически Корректного Рендеринга

Интересно, они же исправили эту ситуацию в Старфилде? ведь да?...

Итого, у нас 2 уникальные карты для объекта:

  1. Цвет

  2. Нормаль

Напомню, что даже игры 2003-2007 годов уже применяли карты Specular и Glossiness. Они позволяют элементарно сделать металл более блестящим, чем дерево или отображать матовые поверхности и глянцевые. Без этих карт, всё выглядит как-будто состоит из одного материала, физика света для всех материалов одна и та же, металл это, дерево или пластик.

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

Кстати, а что там с физикой света? Сначала, придется рассмотреть отражения, чтобы убедится, что они вообще не используются.

Воды Нирна

Первое, что делает Скайрим - рисует динамическую кубическую карту отражений. Этот трюк очень дорогой для старых видеокарт. Хотя сегодня он не ест вообще производительности. В 2011 году, видеокарта могла половину времени кадра - заниматься отрисовкой 6 карт в полном разрешении. Самое печальное, что эти карты влияют только на отражения в воде, что делает их просто красивой затычкой, которую игрок видит 0.01% времени, а обращает внимание и того меньше.

Xbox 360 Slim времён выхода Skyrim
Xbox 360 Slim времён выхода Skyrim

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

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

Да, как я уже упомянул, есть только кубическая карта отражений. Никаких других методов отражений не используется. Но сами отражения тоже нигде не используется, зеркал в Скайриме нет, и материалы не используют отражения для физики света. Единственное применение - отражения на воде.

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

Во-третьих.. пусть это будет загадкой. Дам подсказку: вода не везде одинаковая.

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

Подведем итог,

Кубическая карта отражений:

  1. 6 карт разрешения 512 - 6x512 - 1.5K текстура

  2. 1.5K текстура заполняется небом и террейном

  3. Объекты ландшафта рисуются только в задний фон

  4. Остальные объекты не отображаются

  5. Используется только для воды

Свет Магнуса

Свет самая важная часть конвейера. В Скайриме используется три составляющих света:

  1. Прямой просчет света (Forward Rendering)

  2. Карта теней (Shadow Map)

  3. Затенение окружения (Ambient Occlusion)

    • Опционально: начиная со специального издания

(Поведение видеокарты при ветвлении инструкций)

Магнус бог магии - его свет, вместо нашего Солнца, восходит над Нирном. В прямолинейном рендере, каждый пиксель просчитывается сразу в пиксельном шейдере. Он принимает на вход массив источников света. Каждый из которых считается в банальном цикле for(Lights.Length). Да, это относительно дорогая операция. Ранешние игры, прямо в настройках позволяли задавать максимальное количество источников света на объект, чтобы контролировать производительность. Однако, при небольшом количестве источников, простой цикл быстрее отложенного освещения. Современные видеокарты имеют достаточно аппаратной логики - управления, чтобы щелкать циклы на раз. Все ещё важным моментом остаётся, содержимое цикла. Но просчет света, считается дешёвой операцией. Я бы даже заметил, что преимущество отложенного света, перед прямым освещением - ещё следует доказать, так как железо значительно изменилось с эпохи перехода.

AO/Затенение Окружения
AO/Затенение Окружения

Так же, как я отмечал в предыдущей статье - никаких систем глобального освещения и преображения света не используется. Есть лишь затенение в экранном пространстве. К недостаткам которого, следует отнести не только локальность, но и итоговый эффект. Раз симулируются вторичные тени, а не свет, то итоговый эффект затемняет изображение, но не даёт света и не учитывает остальные свойства отражения поверхности, мы получаем просто более темное изображение. Местами оно будет выглядеть достойно, но чаще всего, изображение сильно тускнеет, а некоторые области просто становятся неразличимо темными. Спасает только высветляющая гамма-коррекция, но артефакты изображения исцелить невозможно.

Карта теней

Качественная Карта Теней вблизи игрока
Качественная Карта Теней вблизи игрока

Главное оружие любого освещения - Карта Теней. С древних пор и до наших дней, даже в самых современных игровых движках - карта теней чуть ли не самая главная составляющая.

Здесь используется самая базовая карта теней, все тени чёткие и ровные. Если размер карты слишком малый, то тени просто пикселизируются. Тени имеют формат D16(только мантисса, 16 бит), рисуются с помощью Карты Глубины. В каждой точке тени, тень имеет одинаковую интенсивность, все тени одинаково серые.

 

Каскадные Тени - схематичное изображение
Каскадные Тени - схематичное изображение

Благо, есть каскад карты теней, беда в том, что их только два: 

1. Основной

2. Вторичный

Напоминаю, один уровень каскада - это просто ещё одна такая же карта теней, с меньшим разрешением и одновременно с более обширной областью. Основной уровень имеет разрешение в 4K и применяется в ближайшем радиусе от игрока, границу теней видно прямо в игре. Для более дальних объектов используется более мыльная карта теней. Подразумевается, что тени от деревьев на горе, за городом, в углу экрана - не требует высокого качества. Но тут уже все игры упираются только в производительность, в большинстве случаев с годами игры просто увеличивали дистанцию, где более точные тени кончаются и начинается желание - бежать быстрее.

Карта Теней и Карта Глубины
Карта Теней и Карта Глубины

После создания Карты Теней, перед Основным рендером, происходит ещё один этап, создание Буфера Глубины(Z-Prepass). Под конец, с помощью Буфера Глубины реконструируется позиция пикселя в мировых координатах. С помощью них, определяется сэмпл в Карте Теней и тень записывается в Экранное Пространство. И уже готовая тень для каждого пикселя - берётся в момент рендера, в пиксельном шейдере, в дальнейшем.

Освещение:

  1. Карты теней (Shadow Map)

  2. Буфер Глубины (Z-Prepass)

  3. Трансформация Теней в Экранное Пространство

  4. Основной Рендер - Рендер Освещения

  5. Пост-Обработка - Затенение Окружения(Ambient Occlusion)

Карта Теней в экранном пространстве
Карта Теней в экранном пространстве

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

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

Есть один секрет, с добавлением Солстейма в игру, был добавлен забавный факел, в одной таверне. Он единственный факел во всей игре, который отбрасывает тени, при этом он единственный динамический источник света, который игрок может носить в руке и он будет отбрасывать динамическую тень.

Вот так будет выглядеть итоговое совмещение всех аспектов тени в игре:

Creation Engine - двигатель на стыке эпох, он одновременно является сборником классических технологий, что очень интересно с точки зрения исторической ретроспективы. Одновременно являясь - набором костылей и пластырей для прикручивания новых механик, показывая чуть ли не зарождение отдельных современных графических техник, без комплексной интеграции. Мы можем наблюдать редкие кадры, поведение Кудряша в дикой природе.

На этом пока откланяюсь на покушать.

Комментарии (12)


  1. Jec13
    02.12.2024 20:01

    Одна из любимых игр. Было интересно узнать.


  1. OldFisher
    02.12.2024 20:01

    Похотливая Аргонианская Дева

    Феерический памятник надмозговитости переводчиков, попросту не умеющих отличить maid от maiden и которых абсолютно, вот ни капельки не смущает, что в самой книге она занимается типичными обязанностями горничной в соответствии с указаниями своего нанимателя.

    Просто пишем "дева" и не видим препятствий! Знать слова? Пользоваться словарём? Хотя бы думать? Это для неудачников!


    1. 8street
      02.12.2024 20:01

      Искали медь, а нашли золото.


      1. Kenya-West
        02.12.2024 20:01

        Русы Норды не против ящерок, получается


    1. Okeu
      02.12.2024 20:01

      она занимается типичными обязанностями горничной в соответствии с указаниями своего нанимателя.

      Действительно, обычные обязанности горничной, в типичном сюжете художественного фильма, на кассете у родителей в шкафу)

      -Here, polish my spear.
      -But it is huge! It could take me all night!
      ну и куда же без
      -My goodness, that's quite a loaf! But how ever shall it fit my oven?


      1. OldFisher
        02.12.2024 20:01

        На то это и двусмысленности, чтобы иметь два смысла: один формально пристойный, а второй - то, что у Крассиуса на уме.

        Я сейчас вдруг подумал: а ведь из-за старины К.К. и его своеобразных представлений о том, как люди становятся хортаторами, нынче могут просто взять и запретить Morrowind.


  1. ArkadiyMak
    02.12.2024 20:01

    Какая-то каша из шуток вместо разбора конвейера.

    1. Тест Глубины

    Это z-prepass.

    Первое, что делает Скайрим - рисует динамическую кубическую карту отражений. Этот трюк очень дорогой для старых видеокарт. Хотя сегодня он не ест вообще производительности.

    С чего бы ему быть дорогим? На изображении видно, что там только ландшафт без теней и биллборды деревьев без текстур. В хл2 за 7 лет до скайрима в отражения на воде рендерилась вся геометрия, и никто не жаловался.

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

    Так вода рендерится до постобработки? Или как часть её? Как нужно взаимодействовать с отражением при желании модифицировать игру?

    6 карт разрешения 512 - 6x512 - 3K текстура

    seems legit

    После создания Карты Теней, происходит ещё один этап, создание Буфера Глубины. Под конец, с помощью Буфера Глубины реконструируется позиция пикселя в мировых координатах. С помощью них, определяется сэмпл в Карте Теней и тень записывается в Экранное Пространство. И уже готовая тень для каждого пикселя - берётся в момент рендера, в пиксельном шейдере, в дальнейшем.

    По структуре статьи складывается впечатление, что SSAO, тени и буфер глубины создаются после основного прохода рендера. Правильнее было бы сказать, что перед основным проходом выполняется z-prepass, в том числе для того, чтобы тяжелый шейдер основного прохода считался только на видимых фрагментах. Буфер глубины, полученный после z-prepass'a, используется для расчета SSAO и маски тени в скринспейсе. Маска тени - это вообще оригинальное изобретение для фильтрации теней. Чтобы не тратиться на тяжелый PCF, они решили рисовать четкую корявую тень в маску в скринспейсе и блюрить её. Вроде работает быстро, но выглядит как мазня.


    1. Ruins007 Автор
      02.12.2024 20:01

      Спасибо, за ваше мнение.

      Это z-prepass.

      Для этого сначала придётся пояснить, что такое EarlyZ, потом что такое сам Z-Prepass, потом особенности реализации в Скайриме, потом что они используют его неправильно. Это всё будет в следующей части. На данный момент, чтобы никого не путать, достаточно обобщения.

      С чего бы ему быть дорогим?

      Насколько я понял, он был вырезан на консолях (кроме скайбокса), так же рекомендации по оптимизации тех лет, прямо рекомендуют выключать всё, кроме неба. Раньше и планарные отражения использовали, это не значит, что это дёшево.

      складывается впечатление, что SSAO, тени и буфер глубины создаются после основного прохода рендера

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

      Поправил, для лучшего понимания


  1. Merkan
    02.12.2024 20:01

    Кто-то сказал Скайрим? Самое время установить в 100500 раз, понаставить модов, просрать кучу времени на исправление ошибок, зайти в игру, добежать до Вайтрана и выйти из игры опять на несколько месяцев.


  1. orefkov
    02.12.2024 20:01

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


    1. ArkadiyMak
      02.12.2024 20:01

      В Обливионе спекуляр хранился в альфа-канале карты нормалей. Вполне возможно, что в Скайриме используется подобный подход.


    1. Ruins007 Автор
      02.12.2024 20:01

      Они на самом деле есть, но я оставил эту информацию для раздела про шейдеры, мне просто было нужно заострить внимания на фокусах и в расследовательском формате потом уже пояснить, где на самом деле всё спрятано. Про одни текстуры можно статью написать, но она выйдет техничной и скучной, в формате справочника. У локаций есть даже множители для того же Specular. Шейдеры, в нашем случае, наиболее информативны и будет в разы интереснее. Для меня самый большой вопрос, почему объекты в Скайриме выглядят очень похоже, даже если накатывать 4K текстуры.