Рендеринг кадра Resident Evil 2 +23


image

Общие примечания


Все результаты получены на довольно старой машине (i7 3770+GTX 770), игра запускалась в DirectX 11 со средним качеством. Для анализа использовались RenderDoc и Nsight.

Игра работает на движке Re Engine, ставшем наследником MT Framework — движка предыдущего поколения Capcom R&D. Кроме RE2 он используется в DMC5 и RE7:Biohazard.

Мне не удалось найти в Интернете материалов о RE Engine, поэтому всё в статье основано на догадках (надеюсь, обоснованных). Я рассмотрел примерно 90% структуры кадра и привёл общее описание алгоритмов. Дальнейшее исследование требует большего опыта и времени на реверс-инжиниринг шейдеров.

Структура кадра


Симуляция частиц/жидкости


Среди прочего в игре генерируются текстуры волн (пример взят из другого кадра).

particle sim 0

particle sim 0

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

Некоторые результаты копируются в staging buffer, и это предполагает, что результаты могут использоваться в ЦП.

Вычисление списка источников освещения


Этот проход генерирует список видимых источников света, проверяя расположение конусов освещения относительно пирамиды видимости. Его результатом является список видимых источников освещения и некая 3D-таблица, сопоставляющая позиции в пространстве обзора с соответствующими источниками света.

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

Точка белого


Этот проход строит гистограмму яркости на основании предыдущего HDR-изображения и таблицы измерения. Затем на основании этих данных он определяет точку белого.

metering table

prevhdr

Определение перекрывающих объектов


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

Отбрасывание перекрытой геометрии


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


Сэмплы 0-3

Использованный буфер глубин мультисэмплируется в четыре раза. Вероятно, для того, чтобы компенсировать низкое разрешение.

occlusion culling 0

Похоже на ограничивающие параллелепипеды, ориентированные относительно взгляда.

occlusion culling 0

Пример теста перекрытой геометрии (из другого кадра). Прошедшие тест пиксели (зелёные) записывают флаг (например 1) в буфер видимости для каждого экземпляра.

store_raw RWDrawIndirectArguments.x, v1.x, l(1)

Накопление косвенных аргументов


Почти каждый объект геометрии в мировом пространстве рендерится при помощи косвенного вызова отрисовки. Профилировщик Nsight показывает вызовы NvAPI_D3D11_MultiDrawIndexedInstancedIndirect. Информацию об его использовании см. в [1] и [2]. RenderDoc блокирует расширение MultiDraw, поэтому в EventBrowser они разворачиваются во множество DrawIndexedInstancedIndirect и некоторые из них оказываются пустыми.

Задача этого прохода заключается в сборе масок видимости из предыдущего прохода и генерации буфера аргументов.

Предварительный проход глубин


Ничего необычного. Подмножество сцены с основной перекрывающей геометрией.

depth prepass

Геометрия+декали прохода G-буфера



Выходные данные:

  • RT0 — r11g11b10 emissive
  • RT1 — rgba8 albedo.rgb + metallness.a
  • RT2 — r10g10b10a2 normal.rg + roughness.b + misc.a
  • RT3 — r16g16b16a16 baked_ao.x + velocity.yz + sss.a


В отрендеренных моделях используется запечённое ambient occlusion из моделей высокого разрешения.

Вычисление HiZ


HiZ gif

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

AO


SSAO или HBAO + обработка в зависимости от выбранных игроком параметров. В моём случае SSAO.

AO вычисляется на основании HiZ из предыдущего прохода.


Глобальные Specular+Diffuse


При помощи некоего нетривиального алгоритма зонды освещения, кубические карты и AO комбинируются в глобальные карты diffuse и specular.

GID

GID

Примеры кубических карт из сцены.

GID

Компонент diffuse глобального освещения.

GIS

Компонент specular глобального освещения.

Обновление карт теней


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


Локальные Specular+Diffuse+SSS


Затем вычисляется вклад каждого источника освещения в компоненты specular и diffuse.

GID

Diffuse+SSS. Влияния SSS в этом кадре не видно.

GIS

Компонент Specular.

Интеграция освещения



Компоненты Specular/Diffuse для светимости/локального освещения интегрируются с albedo.

Добавление прозрачного стекла



После добавления всех источников освещения рендерится прозрачное стекло.

Вычисление объёмного освещения/тумана/дыма



По сути, это просто куча спрайтов.

Применяем объёмное освещение/туман/дым



Этот проход вычисляет размытое изображение, чтобы улучшить освещение тумана.


Если заменить исходную маску тумана на шахматный паттерн.

GIS

Результат этого прохода.

TAA с предыдущим HDR-изображением


GIS

TTA — это просто магия.

Motion blur


GIS

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

GIS

Постобработка


GIS

Этот проход сначала вычисляет изображение в уменьшенном масштабе

GIS

А затем применяет фильтр bloom, тональную коррекцию, искажение и хроматическую аберрацию.

Заключение


В движке активно применяются вычислительные шейдеры+косвенная отрисовка. Все меши и текстуры имеют высокое качество.

Игра использует отложенный рендеринг с TAA/FXAA и стеклом как постобработкой. Подробнее о трюках с отложенным рендерингом можно прочитать здесь [пост по мотивам статьи на Хабре]. Многие текстуры сжаты BC7. В целом использованные техники похожи на описываемые в [4].

Бонусы


Вклад SSS


GIS

Пришлось хорошенько поискать подходящий кадр, чтобы показать влияние SSS.

Как рендерится монстр с щупальцами


G virus guy final form

Монстр разбит на множество частей.

Кишки



В игре есть много кровавых текстур для различных деталей.

Mip-уровни для текстур не просто отфильтрованы линейно. При каждом уровне повышается чёткость. Кроме того, на некоторых текстурах уже есть засветы specular (не очень понятно, как это влияет на их конечный вид).

Геометрия


G virus guy final form

Геометрия имеет хорошую топологию.

HBAO


G virus guy final form

HBAO обеспечивает гораздо лучшее качество, чем SSAO.

Дым



Дым учитывает конусные источники освещения.


Для рендеринга дыма используются настоящие плоскости.

Справочные материалы


[1] Kostas Anagnostou: Experiments in GPU-based occlusion culling

[2] Daniel Rakos: Multi-Draw-Indirect is here

[3] Блог Адриана Корреже

[4] Alien: Isolation




К сожалению, не доступен сервер mySQL