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

Кому интересно, добро пожаловать под кат!

Позвольте мне начать с поверхностного разбора законченного рендера Total War: Attila. В следующих нескольких статьях я расскажу вам о серьёзных изменениях и оптимизациях, которые были сделаны во время разработки Total War: Warhammer.

Тени


Каждый новый кадр начинается с отрисовки теней от основного направленного источника света. Используются каскадные карты теней: 2 — 4 каскада в зависимости от настройки графики. Ландшафт не отрисовывается в карту теней, но для стратегии реального времени, как вы могли уже представить, мы отрисовываем огромное количество маленьких объектов по сравнению с шутерами от первого или третьего лица, которые рисуют меньше, но более детально. На скриншоте ниже изображен финальный кадр движка Total War: Attila.



Ландшафт


Ландшафт — одна из самых важных частей в нашей игре. Будучи стратегией в реальном времени, ландшафт в нашей игре несколько отличается от ландшафта в играх от первого лица. Мы ориентируемся на средние-дальние дистанции, а не на ближние. Ландшафт должен быть разбит на повторяющиеся паттерны – тайлы, и иметь плавный переход между различными видами ландшафта. Также должно поддерживаться мгновенное перемещение при щелчке игрока по миникарте, что создает дополнительные трудности с потоковыми техниками. Также на карте находится множество мешей (часть скалы, к примеру), которые должны смешиваться с текстурами ландшафта, которые, в свою очередь, сами являются комбинацией нескольких слоев.

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

К примеру, представьте Т-образное пересечение тайлов леса, пустыни и болота. Каждый тайл содержит 8 слоёв текстур, и в некоторых точках необходимо смешать текстуры всех трёх тайлов, что означает потенциальное смешивание 24 слоёв на каждый пиксель. Каждый слой содержит текстуры –нормали и отражающую/блестящую, что означает 24?3 = 72 текстур на пиксель. У нас нет ограничений, как много тайлов/слоёв могут смешиваться.

Что бы удовлетворить все нужды, сначала мы отрисовываем только карту глубины (включая сгенерированный ландшафт и меши, созданные художниками). После мы пробегаем screen-space алгоритмами по каждому тайлу, каждый из которых имеет собственную карту смешивания и проецирует слои на геометрию, которую вы можете представлять как большую спроецированную декаль.

GBuffer


В GBuffer хранится 3 текстуры в следующем виде:



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

Вы также могли заметить, что мы используем рассеивающий/отражающий материал, а не цветной/металлический. Это некая традиция, и мы в процессе изменения.

Освещение


Большая часть освещения поступает от основного направленного источника света. Существует статистически просчитанная BRDF модель, которая физически правильна и дает распределение микрофасетов, основанное на гауссовом распределении. Впервые эта модель была представлена в Total War: Rome II. Это дает идеальные (невытянутые) зеркальные отражения сферы и позволяет работать с размером солнечного диска.

Total War: Attila имеет свою реализацию системы глобального затенения (ambient occlusion).

Частицы


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

Tonemapping


Мы используем tonemapping оператор, основанный на кривой с автоматическими уровнями, которые, в свою очередь, основаны на средней/минимальной/максимальной яркости на экране.

Пайплайн Total War: Attila (упрощённый)




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

От переводчика PS:
О некоторых темах («Tonemapping» и «зеркальные отражения сферы») у меня есть только теоретические поверхностные знания, поэтому был бы очень признателен за конструктивную критику и комментарии к переводу.
Поделиться с друзьями
-->

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


  1. kahi4
    08.11.2016 21:58
    +3

    Тема звучит интересно, но еще более скомкано можно? Совершенно ничего не понятно.


    Тени. Каждый новый кадр начинается с отрисовки теней от основного направленного источника света.

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


    Анатомия игрового движка Total War

    Пока что это выглядит, в лучшем случае, как графического движка, а то и вообще построение одного единственного геймплейного кадра.


    1. Warezovvv
      08.11.2016 23:42

      Спасибо за комментарий.
      Немного не понял про скомканность, если вы про перевод, то прошу прощения, исправлюсь.
      Если вы про оригинал, то там есть небольшое пояснительное введение, которое я опустил

      For the next few weeks we’ll be having a regular feature on GPUOpen that we’ve affectionately dubbed “Warhammer Wednesdays”. We’re extremely lucky to have Tamas Rabel, Lead Graphics Programmer on the Total War series providing us with a detailed look at the Total War renderer as well as digging deep into some of the optimizations that the team at Creative Assembly did for the brilliant, Total War: Warhammer.
      . Видимо Tamas Rabel забежал и решил рассказать про рендер.

      Пока что это выглядит, в лучшем случае, как графического движка, а то и вообще построение одного единственного геймплейного кадра.

      Возможно и вправду автору нужно было назвать серию статей как «Анатомия графического движка Total War», немного вводит в заблуждение.


      1. kahi4
        09.11.2016 00:30

        Я про скомканность оригинала, конечно же. Хоть перевод и с огрехами, но не отдает машинным, видна проделанная работа, что, разумеется, приятно. Оригинал местами какая-то абра-кадабра, выглядещая как недавний мем "у нас была некоторая тактика и мы её придерживались", иными словами — сказать нечего, но нужно.


        Взять те же тени: весь абзац можно сократить до "Используются каскадные карты теней", остальное — шум и вода.


        Про ландшафт — нужно перечитать 4 раза, чтобы понять, что под тайтлами тут имеются квадратики (гексагоны?) на глобальной карте (пошаговый режим, аналогичный игре Цивилизация), каждый из которых представляет из себя некий биом, если брать терминологию из других игр, и на локальной карте (режим сражения в реальном времени, аналогичный любой другой RTS за исключением одновременного количества юнитов на поле боя) сражения их нужно склеить в один ландшафт, плавно переходящий из одного типа местности в другой. Если кто-то не играл в серию Total war и не знаком с её механикой, в жизни не поймет о чем тут речь. Однако это порождает больше вопросов, чем ответов в этом пункте. Самый банальный — откуда берутся города? Они являются частью одного из тайтлов? Почему на каждую местность приходится всего 8 текстур? Как прячутся геометрические артефакты на стыке? Как делаются горы, озера, холмы?


        Ну и так далее.


  1. k_is
    08.11.2016 23:36

    начало хорошее, ждем пояснений и продолжения


  1. vlanko
    08.11.2016 23:36

    «идеальная сфера зеркальных отражений» :)
    Было бы это рассеяние, сказал что это 3-мерная индикатриса рассеяния (функция cos(fi))
    Тема очень интересная, но инфы пока мало.