
Diablo Immortal — бесплатная многопользовательская ролевая игра (ARPG), разработанная совместно Blizzard Entertainment и NetEase . Diablo Immortal, новая глава серии Diablo, стартовавшая в 2022 году. Игра заполняет сюжетный пробел между Diablo 2 и Diablo 3 и разворачивает новое приключение вокруг фрагментов Мирового Камня , где игроки исследуют континент Святилища , чтобы сражаться с демонами и порочными силами.
Благодаря инновациям в архитектуре мобильных графических процессоров и прорывам в возможностях аппаратного ускорения технология трассировки лучей постепенно мигрирует с настольных компьютеров на мобильные устройства, становясь одним из основных факторов высококачественного графического рендеринга. Расчет физически реалистичных динамических отражений требует больших вычислительных ресурсов, но специальный аппаратный блок делает это возможным на мобильных платформах с ограниченным энергопотреблением. Отслеживая путь распространения света по сцене в реальном времени, технология точно имитирует отражательное поведение сложных поверхностей, таких как зеркала, металлы и жидкости. Трассировка лучей преодолевает пространственные ограничения и ошибки аппроксимации традиционных схем растеризации и поддерживает глобальное согласованное выражение динамических источников света, закадровых объектов и многоуровневых отражений.
Аппаратная трассировка лучей на мобильных устройствах
Технология аппаратной трассировки лучей в основном включает в себя две парадигмы реализации: конвейер трассировки лучей и запрос лучей .
Конвейер трассировки лучей строит полный конвейер с помощью выделенных этапов шейдера (генерация лучей/пересечение/шейдер ближайшего попадания). Хотя конвейер трассировки лучей позволяет обеспечить точный контроль взаимодействия лучей, он требует независимой конфигурации конвейера, что увеличивает сложность разработки.
С другой стороны, лучевой запрос позволяет инициировать лучевые запросы непосредственно из традиционных вычислений или фрагментных шейдеров, что делает его основной технологией мобильной трассировки лучей. Устраняя необходимость в отдельных конвейерах, ray query не только существенно упрощает процесс разработки, но и имеет три основных преимущества:
- Обеспечивает совместимость с гетерогенными вычислительными средами и неполным оборудованием трассировки лучей.
- Поддерживает вызов трассировки лучей по требованию на любом этапе затенения.
- За счет сокращения использования ресурсов удовлетворяются ограничения пропускной способности и мощности мобильных платформ и обеспечивается реальная основа для расширенных эффектов, таких как динамическое глобальное освещение и отражение в реальном времени в мобильных играх.
Diablo Immortal использует Vulkan , чтобы воспользоваться возможностями аппаратной трассировки лучей графического процессора. Игра вычисляет путь световых лучей через сцену в реальном времени и учитывает сложные свойства материалов для достижения революционных эффектов отражения в реальном времени на устройствах Android.


Структура ускорения
Структура ускорения является основой аппаратной трассировки лучей. Структура ускорения значительно повышает эффективность тестирования пересечений лучей за счет иерархической организации данных.
Система обычно имеет два уровня: структура ускорения верхнего уровня (TLAS) и структура ускорения нижнего уровня (BLAS):
- TLAS играет роль менеджера сцен . Записывая матрицу пространственного преобразования (включая положение, вращение и масштаб) всех экземпляров BLAS, TLAS реализует глобальную организацию динамических сцен. Например, TLAS позволяет разработчикам распределять сотни экземпляров одной и той же модели дерева в разных положениях и позах на сцене; и поэтому разработчикам нужно только обновлять матрицу преобразования движущегося объекта каждый кадр вместо восстановления геометрии.
- BLAS в качестве базового блока. Отвечая за эффективное кодирование геометрических деталей одного трехмерного объекта, BLAS устанавливает структуру пространственного индекса с помощью алгоритма иерархии ограничивающего объема (BVH), чтобы ненужные области можно было быстро пропустить во время обнаружения лучей.
Такая иерархическая конструкция позволяет конвейеру трассировки лучей формировать эффективную цепочку обнаружения лучей ==> TLAS (экземпляр объекта грубого сита) ==> BLAS (точное пересечение) .
Разделение динамических и статических моделей является ключом к минимизации стоимости строительства ускоряющей конструкции:
- Статическая модель. BLAS необходимо построить только один раз на этапе инициализации, и его можно напрямую повторно использовать при последующей загрузке сцены. Чтобы избежать задержки загрузки крупномасштабных сцен, можно использовать технологию асинхронного предварительного построения кадра, чтобы распределить задачу построения BLAS на несколько кадров.
- Динамическая модель
- На основе скелетной анимации — данные вершин со скинами должны вычисляться параллельно вычислительным шейдером в каждом кадре для создания нового буфера вершин, а затем запускать постепенное обновление соответствующего BLAS, что позволяет избежать полной реконструкции для повышения производительности.
- Преобразование твердого тела. Если задействованы только преобразования перемещения/вращения/масштабирования, нет необходимости модифицировать BLAS, просто обновите его матрицу мирового преобразования в TLAS, а затем запустите процесс быстрого обновления TLAS.
Периодическая реконструкция необходима для поддержания эффективности структуры ускорения в динамических сценах трассировки лучей. Когда динамические объекты претерпевают значительные изменения в геометрической топологии, такие как деформация или крупномасштабное смещение вершин, исходное пространственное разделение может не работать, что снижает производительность обнаружения столкновений во время прохождения лучей. В результате полная реконструкция, а не постепенное обновление высокодинамичного BLAS/TLAS должна запускаться каждые N кадров.
Наконец, чтобы оптимизировать производительность рендеринга с трассировкой лучей, примите стратегию динамического построения TLAS, основанную на видимой области персонажа: в TLAS включаются только модели в пределах порога активного радиуса персонажа, чтобы уменьшить основные накладные расходы на вычисление пересечения лучей.
Отражения с трассировкой лучей
Отражения с трассировкой лучей имеют ряд преимуществ по сравнению с традиционными методами, такими как отражения в экранном пространстве (SSR) и плоские отражения (простые поверхности, проецирующие сцену в одном измерении). Отражение с трассировкой лучей физически имитирует путь света, точно фиксирует динамические объекты внутри и снаружи сцены, поддерживает естественные отражения от изогнутых и неплоских поверхностей и обеспечивает множество эффектов отражения света, таких как зеркала. Напротив, SSR ограничен информацией, видимой на экране, а плоские плоские отражения склонны к визуальным ошибкам или искажениям в сложных сценах.


Отражение с трассировкой лучей в принципе похоже на традиционное SSR: отражение с трассировкой лучей излучает лучи в направлении отражения по линии прямой видимости на попиксельной основе и рассчитывает пересечение лучей с объектами сцены. Точка пересечения, возвращаемая API запроса лучей, содержит геометрическую информацию (включая идентификатор экземпляра, индекс геометрии и индекс примитива) и параметры растеризации (барицентрические координаты) на уровне треугольника, но не содержит данных о цвете пикселей. Типичное решение использует технологию привязки ресурсов без привязки для предварительной компиляции всех параметров текстур и материалов сцены в глобальный индексный массив. Используя геометрические идентификаторы, возвращаемые лучевым запросом, можно найти физические свойства соответствующего материала (например, карту нормалей и шероховатость), а затем объединить их с интерполяцией барицентрических координат для расчета информации о затенении поверхности, а реальное значение цвета пересечения можно восстановить посредством растеризации.
Однако в процессе реализации команда Diablo Immortal обнаружила две существенные технические проблемы:
- Модель освещения пришлось унифицировать, что противоречило разнообразным системам затенения, накопленным за историю проекта, и приводило к несоответствию зеркального материала и исходного материала.
- Разнообразие форматов вершин приводит к снижению эффективности ветвления инструкций на этапе растеризации, что является серьезной проблемой при ограниченном бюджете производительности мобильного устройства.
Команда Diablo Immortal инновационно представила буфер видимости, чтобы отделить обработку геометрии от вычислений затенения:
- Фаза трассировки лучей. Информация о попадании лучей на уровне пикселей фиксируется в реальном времени посредством запроса лучей. Трехмерный пространственный идентификатор (
InstanceID
сPrimitiveIndex
) точки пересечения кодируется в компактный идентификатор видимости и записывается в буфер экранного пространства. - Этап раскраски. Подобно операциям, выполняемым вершинными и пиксельными шейдерами, геометрические идентификаторы в буфере видимости динамически анализируются, свойства вершин (такие как UV и нормали) и физические карты материалов исходной модели извлекаются, и наконец выполняются расчеты затенения, связанные с типом материала.
Это решение позволяет подключать художественные ресурсы к системе отражений с трассировкой лучей без необходимости изменять форматы вершин или шейдеры.
Конкретные этапы рендеринга
Проход запроса Рэя
Соответствует этапу трассировки лучей и генерирует буфер видимости для отражений в экранном пространстве:
- Цвет0
- Формат: R32G32UInt
- R = TriangleID, G = Барицентрика

- Глубина:
- Формат: Depth32F
- D = EncodeAsFloat(InstanceIdx, GeometryIdx)
- Идентификатор материала пересечения кодируется в 32-битном формате с плавающей запятой и записывается в буфер глубины для следующего этапа метода обнаружения соответствия кодирования глубины материала.

По сравнению с вычислительным шейдером лучевой запрос в пиксельном шейдере имеет следующие преимущества:
- Интеграция конвейера — конвейер встроен непосредственно в существующие конвейеры прямого/отложенного рендеринга, обеспечивая непрерывность состояния конвейера рендеринга.
- Оптимизация пропускной способности мобильных устройств. Для мобильной архитектуры на основе плиток встроенное сжатие без потерь может быть запущено при записи данных о попадании луча в
RenderTarget
, что снижает потребление полосы пропускания памяти по сравнению с традиционным выводом вычислительных шейдеров в буфер. - Контроль количества лучей. Неотражающие области можно пометить и отклонить с помощью этапа предварительного расчета в сочетании с трафаретным тестом.
Разрешить пропуск
На этапе окраски (см . Отражения с трассировкой лучей ) команда Diablo Immortal добилась быстрого идентификации, используя аппаратный блок для проверки глубины и выполняя окраску материалов последовательными партиями.
Для каждого материала выдается проход полноэкранной отрисовки. Вершинный шейдер динамически восстанавливает закодированный идентификатор текущего материала. Используя тест равенства глубины, идентификатор сравнивается с закодированными значениями в буфере глубины, и сохраняются только те пиксели, чьи закодированные значения точно совпадают, то есть те пиксели, которые принадлежат текущему экземпляру материала. Сохраненные пиксели выполняют соответствующий шейдер материала.
Далее в пиксельном шейдере реализуется высокоточное воспроизведение материала:
- Декодирование данных геометрии — извлекает идентификатор треугольника (
MeshID
+PrimitiveID
) и барицентрические координаты из буфера видимости и динамически загружает атрибуты вершин (положение, UV, нормаль и т. д.) соответствующего треугольника из буфера вершин. Поскольку каждая модель раскрашивается как независимый материал, дополнительные функции, такие как переплет, не нужны. - Реконструкция параметров поверхности — вычисляет UV-координаты на пересечении с помощью интерполяции барицентрических координат. Программная растеризация выполняется для выборки карты на основе интерполированных UV.
- Повторное использование расчета шейдера — напрямую повторно использует существующий код шейдера для поддержания той же логики материала, что и основной конвейер рендеринга.

Наконец, модели, которые фактически участвуют в вычислении отражений, составляют лишь очень небольшую часть сцены. Данные идентификации модели отражения, возвращаемые графическим процессором, могут считываться асинхронно, чтобы исключить модели/материалы, которые не участвуют в отражении, эффективно сокращая количество вызовов отрисовки (вызов отрисовки происходит, когда материалы и сетка передаются в графический процессор для рисования) на этапе затенения.
Физически обоснованное зеркальное отражение
Для достижения высокой точности отражения отражающие поверхности по шероховатости подразделяют на один из трех типов:
- Без отражения — расчеты отражения для этих поверхностей можно пропустить для экономии ресурсов. Если поверхность очень шероховатая, отражение становится размытым и тусклым, поэтому вклад не очевиден.
- Зеркальное отражение. Как и в гладком зеркале, отраженное изображение четкое и не размытое. Стреляйте в линию прямо в направлении отражения от луча визирования.
- Глянцевое отражение — отражение с определенной шероховатостью поверхности моделируется на основе выборки важности GGX , которая может учитывать как вычислительную эффективность, так и физическую точность. Отражение отклоняется в основном направлении зеркального отражения при излучении линии, что повышает эффективность выборки светлых областей.
Чтобы добиться приемлемого качества изображения при ограниченном энергопотреблении, команда Diablo Immortal использовала решение 1SPP+Denoiser . То есть команда Diablo Immortal брала одну выборку на пиксель, а затем использовала алгоритм временного/пространственного шумоподавления для сглаживания большого количества шума, вызванного низкой частотой дискретизации.
Команда Diablo Immortal выбрала шумоподавитель Reflection Denoiser в AMD FidelityFX Denoiser, высокопроизводительный шумоподавитель, оптимизированный для отражений с трассировкой лучей и отражений в экранном пространстве. Основным преимуществом Reflection Denoiser является его пространственно-временной гибридный алгоритм шумоподавления: путем объединения данных текущего кадра и исторических кадров (на основе компенсации движения) в сочетании с методами пространственной фильтрации (такими как фильтрация с сохранением границ с учетом дисперсии), Reflection Denoiser эффективно устраняет шум и выводит эффекты плавного отражения при очень низкой дискретизации.
Чтобы адаптироваться к характеристикам самостоятельно разработанных конвейеров рендеринга и удовлетворить строгие ограничения производительности мобильных устройств, команда Diablo Immortal реализовала целенаправленную оптимизацию и адаптацию архитектуры при интеграции AMD FidelityFX Reflection Denoiser.
Высокоточная трассировка лучей с помощью Vulkan
Diablo Immortal работает на широком спектре Android-устройств с поддержкой Vulkan, где команда Diablo Immortal воспользовалась инновационными возможностями аппаратной трассировки лучей графического процессора. Vulkan сократил накладные расходы и трудности при разработке, облегчив предоставление пользователям Android высококачественного контента и игрового процесса Diablo Immortal.
Начало работы с трассировкой лучей в Vulkan
Как продемонстрировал Diablo Immortal, для достижения эффектов трассировки лучей на Android необходимо использовать API Vulkan на соответствующем оборудовании. Разработчики, заинтересованные в непосредственном использовании Vulkan, могут обратиться к статье «Узнайте о трассировке лучей с помощью Vulkan на Android от ARM» или к разделу «Трассировка лучей» в статье Adreno GPU на мобильных устройствах: лучшие практики от Qualcomm. Подробную информацию об API см. в официальных спецификациях Khronos Ray Tracing In Vulkan .
Для разработки на основе движка Unreal Engine в сотрудничестве с ARM обеспечивает экспериментальную поддержку Lumen с аппаратной трассировкой лучей на мобильных устройствах . Хотя поддержка Unity аппаратной трассировки лучей на Android все еще развивается, следите за обновлениями Unity.