Seite 5: Трассировка лучей и NVIDIA RTX

Полная трассировка лучей со всеми функциями, описанная выше, остается очень сложной задачей. Поэтому технология NVIDIA RTX выполняет трассировку лучей лишь частично. Цель заключается в оптимизации вычислительной нагрузки. Но технология RTX - это интерфейс разработчика. Поэтому расчет лучей в реальном времени через Direct Compute и Microsoft DXR будет работать и на других GPU. Microsoft с обновлением Windows 10 April 2018 Update (Redstone 4) представила соответствующую версию DirectX 12 с поддержкой DXR.

Примерно пять лет назад NVIDIA решила взять направление аппаратной трассировки лучей. Компания решила разработать аппаратные блоки, которые будут ускорять расчеты трассировки. И сегодня мы как раз их получаем в виде ядер RT.

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

Один из способов выборки примитивов - Bounding Volume Hierarchy (BVH). В случае BVH сцена разбивается на все меньшие по размеру блоки, в которых присутствуют примитивы. Луч следует обрабатывать только с теми блоками, которые он проходит на пути к примитиву. Подход несколько напоминает воксели, которые NVIDIA использует для Voxel Global Illumination (VXGI). BVH представляет собой дерево, в котором можно видеть, какой именно блок и, в конечном итоге, примитив следует учитывать для расчета трассировки лучей.

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

Именно здесь на помощь приходят ядра RT. Они содержат специальные функциональные блоки SFU (Special Function Units), оптимизированные под поиск нужных блоков и примитива, с которым пересекается луч. Потоковый процессор принимает задачу, после чего передает ее ядру RT, которое возвращает результат потоковому процессору - и последний может выполнять рендеринг дальше по конвейеру.

Нормализованная производительность трассировки лучей

Вместе с трассировкой лучей NVIDIA представила новый способ расчета производительности, названный гигалучи в секунду. Который показывает количество рассчитанных лучей в единицу времени. Теперь вы знаете, что, в отличие от тех же TFLOPS, данное значение не фиксировано для GPU, а зависит от типа и сложности сцены.

Для сравнения NVIDIA использует видеокарту GeForce GTX 1080 Ti, которая обеспечивает вычислительную производительность 1,1 гигалуч/с. GeForce RTX 2080 Ti показывает не меньше 10 гигалучей/с, иногда даже более 12. Но как можно сравнить эти значения? Ответ прост: никак! Даже на идентичных сценах результат немного варьируется, поэтому можно говорить лишь о приближенном значении. NVIDIA также указывает, что трассировка лучей на архитектуре Pascal в описанном выше виде вообще невозможна.

Небольшой пример: на сцене Claybook, которая была рассчитана с помощью трассировки лучей, Radeon RX Vega 64 показывает производительность 4,88 гигалучей/с. Однако выполнялся только расчет Primary Ray Tracing, при добавлении теней (Shadow Rays) результат будет чуть ниже. Игра в случае Primary Ray Tracing в разрешении 4K шла плавно - 60 fps, но то же самое верно и для GeForce GTX 1080 Ti. Однако в данном случае результат 5 гигалучей/с не имеет смысла сравнивать со спецификациями NVIDIA. Добавьте еще лучи для расчета отражений и преломлений, которые тоже изменят производительность в гигалучах/с.

Гибридный конвейер рендеринга

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

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

Процесс рендеринга сцены состоит из множества вычислений. Которые распределяются по блокам FP32, INT32, ядрам RT и Tensor. В среднем, задействуется примерно 80% ресурсов FP32, 28% ресурсов INT32, 40% ресурсов ядер RT и 20% ядер Tensor. В результате мы получаем 78 RTX OPS - если принять подобную меру производительности гибридного рендеринга.