Minecraft — это творческая игра-выживалка, в которой нужно откапывать ресурсы, создавать инструменты и фермы, исследовать мир в поисках ценных сокровищ и строить порталы в соседние миры Nether и End.
Это ещё и социальная игра, в ней друзья, играющие на разных платформах, способны работать вместе над созданием интересных структур. Кроме того, она имеет интуитивно понятный интерфейс для программирования собственных серверов и модов.
Недавно был обновлён рендерер Minecraft для Windows 10, в его архитектуру были внесены значительные изменения: добавлена трассировка лучей в реальном времени (ray tracing), устранение шума трассировки лучей (ray tracing denoising) и суперсэмплирование при помощи глубокого обучения (deep learning super sampling).
Давайте же изучим, как Minecraft RTX выполняет рендеринг кадра, по мере возможности ссылаясь на исследовательские статьи.
Примечание: эта статья не является официальным анализом рендерера Minecraft RTX, в ней исследуется бета-версия рендерера, поэтому описанная структура к финальному релизу может измениться.
Трассировщик лучей
Текстура поиска (Look Up Texture) PBR-материала
Перед началом рендеринга выполняется предварительная обработка: текстуры материалов Physically Based Rendering (PBR) кешируются в текстуру поиска (lookup texture, LUT) размером 2048x2048
.
Создание каждого кадра Minecraft RTX начинается с построения низкоуровневых ускоряющих структур данных BuildRayTracingAccelerationStructure(...)
для всех анимированных объектов в сцене (животных или игроков).
После построения высокоуровневой ускоряющей структуры мы переходим к dispatchRays
для вычисления первичных лучей и теней освещения, записывая различные выходные данные. В том числе:
- Нормали
- Albedo/Metalness
- Испускаемое освещение/шероховатость
- Непрозрачнсть/ID материала
- Скорость
- Кешированное свечение
- Длина репроецируемого первичного пути
- Позиция с низкой точностью
- Геометрические нормали
- Тени лучей объёмного освещения
- Позиция обзора
- Направление обзора
- Производительность
Все проходы рендерятся дважды рядом друг с другом по оси x, с разрешением 742x835
, что в сумме составляет 1484x835
, а не 2560x1440
. Похоже, это странное число является просто четвертью разрешения по X и половиной по Y выходного разрешения плюс небольшой отступ. Слева находятся данные столкновений первичных лучей, справа — данные столкновений первичных лучей пропускающих свет поверхностей. например, воды.
Для сэмплирования Minecraft использует массив синего шума 128 изображений размером 256x256
в формате RGBA8
.
Далее испускаются дополнительные лучи для непервичных лучей, а результаты записываются в:
- Indirect Diffuse
- indirect Diffuse Chroma
Затем выполняется ещё одна операция с лучами, данные которой записываются в:
- Indirect Specular
- Reflection Distance
Последним вычисляется объёмный туман (Volumetric fog).
Устранение шумов A-SVGF
Minecraft использует пространственно-временную фильтрацию [Schied et al. 2019], состоящую из этапа пространственно-временного репроецирования на основании дисперсии. Он получает буферы момента, предыдущую длину и предыдущие кадры, после чего пытается разместить эти данные там, где они должны находиться в текущем кадре.
Подробнее о устранении шума трассировки лучей реального времени при помощи A-SVGF читайте в моём посте по этой теме.
Далее следует этап двунаправленной фильтрации, на котором в течение нескольких проходов выполняется адаптивное размытие кадров. Также для ускорения ресолвинга репроецированных регионов с короткой историей используется кеширование свечения.
- Рассеянное глобальное освещение с семикратным двунаправленным фильтром
- Отражения с трёхкратным двунаправленным фильтром
- Объёмные сумеречные лучи с пятикратным управляемым двунаправленным фильтром
Далее буферы с чередованием комбинируются, создавая готовые выходные данные, передаваемые ядру DLSS 2.0.
Суперсэмплирование при помощи глубокого обучения
Deep Learning Super Sampling 2.0 (DLSS 2.0) использует автоэнкодер, получающий на входе флуктуационный render target, размер которого является частью выходного разрешения, флуктуационный буфер скоростей, аналогичный используемому при временном сглаживании. На выходе получаются готовые выходные данные в увеличенном разрешении.
Проход UI
Элементы UI рендерятся с полным разрешением в отдельный render target и композитингом добавляются в конце кадра.
Постобработка
Minecraft завершает построение кадра тональной коррекцией и применением всех включённых эффектов постобработки, например, виньетирования.
Заключение
Minecraft сильно выигрывает от использования системы трассировки лучей. Его динамические окружения и чрезвычайно вариативные тени и освещение, движение по системам пещер и исследование структур кажутся гораздо более правдоподобными и интересными…
Дополнительные ресурсы
- В интервью Digital Foundry с разработчиками Minecraft RTX представлен высокоуровневый обзор рендерера RenderDragon DX12 RTX, а также сложностей, с которыми столкнулась команда разработчиков.
- Питер Кристоф из Microsoft создал очень стабильный пример Ambient Occlusion на основе RTX с реализацией SVGF.
- Пример DirectML Super Resolution от компании Microsoft. Хоть это и не Deep Learning Super Sampling 2.0 (DLSS 2.0) компании NVIDIA, он похож на DLSS тем, что в обеих техниках выполняется увеличение разрешения.
- GTC 2020 — Creating Physically Based Materials for Minecraft with RTX
Справочные материалы
[Schied et al. 2019] Real-Time Path Tracing and Denoising in ‘Quake 2’. Доклад Кристофа Шида и Алексея Пантелеева с GDC 2019
Видеоверсия статьи: