Общие примечания
Все результаты получены на довольно старой машине (i7 3770+GTX 770), игра запускалась в DirectX 11 со средним качеством. Для анализа использовались RenderDoc и Nsight.
Игра работает на движке Re Engine, ставшем наследником MT Framework — движка предыдущего поколения Capcom R&D. Кроме RE2 он используется в DMC5 и RE7:Biohazard.
Мне не удалось найти в Интернете материалов о RE Engine, поэтому всё в статье основано на догадках (надеюсь, обоснованных). Я рассмотрел примерно 90% структуры кадра и привёл общее описание алгоритмов. Дальнейшее исследование требует большего опыта и времени на реверс-инжиниринг шейдеров.
Структура кадра
Симуляция частиц/жидкости
Среди прочего в игре генерируются текстуры волн (пример взят из другого кадра).
Волны используются для рендеринга воды, которой в анализируемом кадре нет.
Некоторые результаты копируются в staging buffer, и это предполагает, что результаты могут использоваться в ЦП.
Вычисление списка источников освещения
Этот проход генерирует список видимых источников света, проверяя расположение конусов освещения относительно пирамиды видимости. Его результатом является список видимых источников освещения и некая 3D-таблица, сопоставляющая позиции в пространстве обзора с соответствующими источниками света.
Также вычисляются списки видимых экземпляров для каждого источника освещения, которые позже используются при обновлении карты теней.
Точка белого
Этот проход строит гистограмму яркости на основании предыдущего HDR-изображения и таблицы измерения. Затем на основании этих данных он определяет точку белого.
Определение перекрывающих объектов
Ограничивающие параллелепипеды перекрывающих объектов проверяются на пересечение с пирамидой видимости в вычислительном шейдере и заполняется буфер косвенных аргументов.
Отбрасывание перекрытой геометрии
Перекрывающие объекты рендерятся в буфер глубин низкого разрешения, а затем ограничивающие параллелепипеды проверяются на попадание в этот буфер глубин.
Сэмплы 0-3
Использованный буфер глубин мультисэмплируется в четыре раза. Вероятно, для того, чтобы компенсировать низкое разрешение.
Похоже на ограничивающие параллелепипеды, ориентированные относительно взгляда.
Пример теста перекрытой геометрии (из другого кадра). Прошедшие тест пиксели (зелёные) записывают флаг (например 1) в буфер видимости для каждого экземпляра.
store_raw RWDrawIndirectArguments.x, v1.x, l(1)
Накопление косвенных аргументов
Почти каждый объект геометрии в мировом пространстве рендерится при помощи косвенного вызова отрисовки. Профилировщик Nsight показывает вызовы NvAPI_D3D11_MultiDrawIndexedInstancedIndirect. Информацию об его использовании см. в [1] и [2]. RenderDoc блокирует расширение MultiDraw, поэтому в EventBrowser они разворачиваются во множество DrawIndexedInstancedIndirect и некоторые из них оказываются пустыми.
Задача этого прохода заключается в сборе масок видимости из предыдущего прохода и генерации буфера аргументов.
Предварительный проход глубин
Ничего необычного. Подмножество сцены с основной перекрывающей геометрией.
Геометрия+декали прохода 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
Многопроходный вычислительный шейдер определяет каждый уровень иерархии глубин.
AO
SSAO или HBAO + обработка в зависимости от выбранных игроком параметров. В моём случае SSAO.
AO вычисляется на основании HiZ из предыдущего прохода.
Глобальные Specular+Diffuse
При помощи некоего нетривиального алгоритма зонды освещения, кубические карты и AO комбинируются в глобальные карты diffuse и specular.
Примеры кубических карт из сцены.
Компонент diffuse глобального освещения.
Компонент specular глобального освещения.
Обновление карт теней
Создаваемые для каждого источника освещения карты теней обновляются для тех источников, на которые влияют динамические объекты. Каждая карта теней размещается в большом массиве текстур.
Локальные Specular+Diffuse+SSS
Затем вычисляется вклад каждого источника освещения в компоненты specular и diffuse.
Diffuse+SSS. Влияния SSS в этом кадре не видно.
Компонент Specular.
Интеграция освещения
Компоненты Specular/Diffuse для светимости/локального освещения интегрируются с albedo.
Добавление прозрачного стекла
После добавления всех источников освещения рендерится прозрачное стекло.
Вычисление объёмного освещения/тумана/дыма
По сути, это просто куча спрайтов.
Применяем объёмное освещение/туман/дым
Этот проход вычисляет размытое изображение, чтобы улучшить освещение тумана.
Если заменить исходную маску тумана на шахматный паттерн.
Результат этого прохода.
TAA с предыдущим HDR-изображением
TTA — это просто магия.
Motion blur
На основании карты скоростей вычисляется вспомогательная карта размытия.
Постобработка
Этот проход сначала вычисляет изображение в уменьшенном масштабе
А затем применяет фильтр bloom, тональную коррекцию, искажение и хроматическую аберрацию.
Заключение
В движке активно применяются вычислительные шейдеры+косвенная отрисовка. Все меши и текстуры имеют высокое качество.
Игра использует отложенный рендеринг с TAA/FXAA и стеклом как постобработкой. Подробнее о трюках с отложенным рендерингом можно прочитать здесь [пост по мотивам статьи на Хабре]. Многие текстуры сжаты BC7. В целом использованные техники похожи на описываемые в [4].
Бонусы
Вклад SSS
Пришлось хорошенько поискать подходящий кадр, чтобы показать влияние SSS.
Как рендерится монстр с щупальцами
Монстр разбит на множество частей.
Кишки
В игре есть много кровавых текстур для различных деталей.
Mip-уровни для текстур не просто отфильтрованы линейно. При каждом уровне повышается чёткость. Кроме того, на некоторых текстурах уже есть засветы specular (не очень понятно, как это влияет на их конечный вид).
Геометрия
Геометрия имеет хорошую топологию.
HBAO
HBAO обеспечивает гораздо лучшее качество, чем SSAO.
Дым
Дым учитывает конусные источники освещения.
Для рендеринга дыма используются настоящие плоскости.
Справочные материалы
[1] Kostas Anagnostou: Experiments in GPU-based occlusion culling
[2] Daniel Rákos: Multi-Draw-Indirect is here
[4] Alien: Isolation
Автор: PatientZero