Физический принцип обратной трассировки

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

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

Иерархия алгоритмов от бросания лучей до трассировки путей

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

Ray casting или бросание лучей

Этот метод стал фундаментом для классических шутеров вроде Wolfenstein 3D. Алгоритм пускает лучи в одной двумерной плоскости параллельно полу. Каждый луч проверяет пересечение с квадратной сеткой уровня по алгоритму Брезенхэма или цифрового дифференциального анализатора DDA. Как только луч встречает стену, движок вычисляет дистанцию до нее и отрисовывает вертикальную полоску текстуры нужной высоты. В современных соревновательных шутерах ray casting выполняет другую задачу. Им проверяют попадания мгновенного оружия типа hitscan, рассчитывают траектории пуль и определяют зоны видимости вражеских ботов.

Ray tracing и классическая модель Уиттеда

Тернер Уиттед в 1980 году предложил строить дерево лучей. Первичный луч ударяется о поверхность, а затем ветвится на два направления. Один луч уходит по вектору зеркального отражения, второй преломляется внутри прозрачной среды. Параллельно в сторону каждого источника света посылается теневой луч. Если теневой луч натыкается на непрозрачный полигон, точка считается затененной. Этот подход дает геометрически идеальные тени и зеркала, но создает слишком резкие границы, игнорируя мягкое рассеянное освещение от пола и стен.

Path tracing и уравнение рендеринга Каджии

Трассировка путей решает интегральное уравнение рендеринга, сформулированное Джеймсом Каджией в 1986 году. Метод имитирует глобальное освещение с помощью стохастического интегрирования Монте-Карло. Луч после удара о матовую поверхность выбирает случайное направление в пределах полусферы нормали согласно функции двунаправленного светорассеяния BRDF. Чтобы получить чистое изображение без зернистого шума, через один пиксель приходится пропускать десятки или сотни лучей. В реальном времени шутеры применяют трассировку путей только в связке с нейросетевыми шумоподавителями, которые дорисовывают неполную картинку.

Растеризация против трассировки лучей в динамичных играх

Традиционная растеризация проецирует трехмерные треугольники на плоскость экрана. Графический процессор обрабатывает геометрию конвейером, закрашивая экранные фрагменты параллельно на тысячах шейдерных ядер. Для теней растеризация использует карты теней shadow maps, а для отражений берет данные из буфера видимого кадра screen-space reflections. Это очень быстрый процесс, требующий считанные миллисекунды на кадр, но страдающий от артефактов при исчезновении объектов за краем экрана.

Трассировка лучей требует постоянного поиска пересечений луча с геометрией всего виртуального мира. При тысячах динамических полигонов прямая проверка каждого треугольника уронила бы кадровую частоту до нуля. Для ускорения структуры сцены упаковывают в иерархию ограничивающих объемов BVH. Это древовидная структура из вложенных прямоугольных боксов. Луч сначала проверяет попадание в крупные контейнеры и спускается к конкретным полигонам только внутри нужного узла дерева.

  • Растеризация тратит вычислительные ресурсы пропорционально количеству треугольников на экране и площади закрашиваемых пикселей
  • Трассировка лучей масштабируется от количества выпущенных лучей, глубины их отскоков и плотности древовидной структуры BVH
  • Аппаратные RT-ядра в современных видеокартах берут на себя аппаратный обход дерева BVH и расчет пересечений луча с треугольниками по формуле Моллера-Трумбора, освобождая универсальные шейдерные процессоры

Частые вопросы

Почему нельзя пускать лучи прямо от фонарей и солнца к игроку?

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

Чем трассировка путей тяжелее обычной трассировки лучей?

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

Как шутеры выдают 60 кадров в секунду с включенным Ray Tracing?

Разработчики используют гибридный рендеринг. Базовая геометрия и текстуры отрисовываются быстрой растеризацией, а трассировкой просчитывают только один-два эффекта, например мягкие тени или отражения на воде, после чего картинку восстанавливают алгоритмы денойзинга.

Что такое алгоритм DDA в шутерах?

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