Обратная трассировка лучей


Алгоритм выглядит следующим образом: из виртуального глаза через каждый пиксел изображения испускается луч и находится точка его пересечения с поверхностью сцены (для упрощения изложения мы не рассматриваем объемные эффекты вроде тумана). Лучи, выпущенные из глаза называют первичными. Допустим, первичный луч пересекает некий объект 1 в точке H1 (рис. 1).

Рисунок 1. Алгоритм трассировки лучей.

Далее необходимо определить для каждого источника освещения, видна ли из него эта точка. Предположим пока, что все источники света точечные. Тогда для каждого точечного источника света, до него испускается теневой луч из точки H1. Это позволяет сказать, освещается ли данная точка конкретным источником. Если теневой луч находит пересечение с другими объектами, расположенными ближе чем источник чвета, значит, точка H1 находится в тени от этого источника и освещать ее не надо. Иначе, считаем освещение по некоторой локальной модели (Фонг, Кук-Торранс и.т.д.). Освещение со всех видимых (из точки H1) источников света складывается. Далее, если материал объекта 1 имеет отражающие свойства, из точки H1 испускается отраженный луч и для него вся процедура трассировки рекурсивно повторяется. Аналогичные действия должны быть выполнены, если материал имеет преломляющие свойства.


// Алгоритм трассировки лучей

//

float3 RayTrace(const Ray& ray)

{

  float3 color(0,0,0);

 

  Hit hit = RaySceneIntersection(ray);

  if (!hit.exist)

    return color;

 

  float3 hit_point = ray.pos + ray.dir*hit.t;

 

  for (int i=0;i<NumLights;i++)

    if (Visible(hit_point, lights[i]))

      color += Shade(hit, lights[i]);

 

  if (hit.material.reflection > 0)

  {

    Ray reflRay = reflect(ray, hit);

    color += hit.material.reflection*RayTrace(reflRay);

  }

 

  if (hit.material.refraction > 0)

  {

    Ray refrRay = refract(ray, hit);

    color += hit.material.refraction*RayTrace(refrRay);

  }

 

  return color;

}


Листинг 1. Алгоритм обратной трассировки лучей. 

Поясним фрагмент программы (листинг 1). Луч представлен двумя векторами. Первый вектор – pos – точка испускание луча. Второй – dir – нормализованное направление луча. Цвет – вектор из трех чисел – синий, красный, зеленый. В самом начале функции RayTrace мы считаем пересечение луча со сценой (представленной просто списком объектов пока что) и сохраняем некоторую информацию о пересечении в переменной hit и расстояние до пересечения в переменной hit.t. Далее, если луч промахнулся и пересечения нет, нужно вернуть фоновый цвет (в нашем случае черный). Если пересечение найдено, мы вычисляем точку пересечения hit_point, используя уравнение луча (эквивалентное уравнению прямой с условием t>0). Когда мы вычислили точку пересечения в мировых координатах, приступаем к расчету теней. Пусть источники лежат в массиве lights. Тогда проходим в цикле по всему массиву и для каждого источника света проверяем (той же трассировкой луча), виден ли источник света из данной точки hit_point. Если виден, прибавляем освещение от данного источника, вычисленное по некоторой локальной модели (например модели Фонга).  После, если у материала объекта, о который ударился луч, есть отражающие или преломляющие свойства, трассируем лучи рекурсивно, умножаем полученный цвет на соответствующий коэффициент отражения или преломления и прибавляем к результирующему цвету. Коэффициенты reflection и refraction могут быть как монохромными так и цветными. Всё зависит от того, какая используется математическая модель для представления материалов.

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

Если это не так, то под прозрачным объектом образуется сложная картина, называемая каустиком. Каустики рассчитываются отдельно с помощью метода фотонных карт [7]. Типичный пример каустика – солнечный зайчик от стакана воды, когда через него просвечивает солнце.

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

Рисунок 2. Изображение, полученное с помощью трассировки лучей.

Даже при разрешении картинки 1024x768 количество первичных лучей равно 786432 - то есть приближается к миллиону. Каждый из этих лучей может уйти глубоко в рекурсию, увеличивая количество трассируемых лучей в несколько раз. Объем вычислений, которые надо при этом производить - громадный и обычно трассировка лучей работает довольно медленно. Причем, львиная доля процессорного времени затрачивается на поиск пересечений. Поэтому вопрос производительности здесь стоит на первом месте. Существуют классы алгоритмов, позволяющих на порядки ускорить поиск пересечений. Соотношение качество/скорость является основным критерием при выборе тех или иных алгоритмов, но эффективные алгоритмы в любом случае стараются использовать когерентность лучей в том или ином виде. Подробнее о них см. в разделе "Быстрая трассировка лучей".



Анти Алиасинг (Anti Aliasing)
Тени
Отражения
Преломления


<< Вернуться назад

Статьи и обзоры

Поиск пересечений

Обратная трассировка лучей

Быстрая трассировка лучей

Индустриальная основа

Фотореалистичная визуализация

GPU ray tracing

Сферические гармоники

Дружественные проекты:

OpenSource RTRT

Siberian renderer

Наши разработки

Hydra renderer

AdaRT

Публикации

Загрузить

Скриншоты и видео

ССЫЛКИ

© Copyright 2007 Владимир Фролов, Александр Фролов

При поддержке Лаборатории компьтерной графики и мультимедия ф-та ВМК МГУ
Создание сайта: Александр Фролов