44. Алгоритм трассировки лучей с использованием глобальной модели освещения. - p1xelse/CG GitHub Wiki

Теоретические сведения

Для чего нужна модель освещения?

Модель освещения предназначена для расчёта интенсивности отражённого к наблюдателю света в каждой точке изображения. Модель может быть глобальной или локальной.

  • Локальная модель - учитывается только свет от источников и ориентация поверхности
  • Глобальная модель - учитывается ещё и свет, отражённый от других поверхностей или пропущенный через них

Пример

Глобальная модель воспроизводит чрезвычайно важные эффекты

На рисунке сфера, треугольная призма и параллелепипед непрозрачны. Их поверхность зеркальна.

Если наблюдатель смотрит из точки обзора 0 в точку 1, то он также видит точку 2 на призме, несмотря на то, что призма загорожена параллелепипедом. В этом случае изображение, получаемое вокруг точки 1, перевёрнуто в силу того, что оно получается после одного отражения.

Если же наблюдатель смотрит в точку 1', то он видит не только точку 3' на призме, но и точку 2' на параллелепипеде. При этом точка 3' видима после одного отражения от сферы, в силу чего на сфере будет видно два изображения призмы. Второе изображение будет менее интенсивно. Более того, в сфере отражается обратная сторона параллелепипеда. Несмотря на то, что она освещается лишь отражённым светом, она всё равно видима наблюдателю.

Что мы из этого имеем?

Из приведённого примера можно заметить, что обычное отбрасывание задних граней, равно как и сортировка по глубине, не годится. На извечный русский вопрос "что делать" ответ прост - применим метод трассировки лучей!!!

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

Про трассировку для самых маленьких

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

Метод Потметсила

Метод Потметсила состоит из двух шагов:

  • Построение изображения
  • Постпроцессинг

Во время первого этапа с помощью метода трассировки строится "простое" изображение по выборочным точкам (т.е. изображение для камеры с маленьким отверстием). Для каждого пиксела хранятся данные о глубине z, интенсивности RGB и видимых поверхностях.

Во время второго шага каждая точка преобразуется в круг согласно законам геометрической оптики. Распределения размеров интенсивностей зависят от значения z.

Уиттед использует те же модели рассеянного, диффузного и зеркального отражения Фонга, что и локальная модель.

Глобальное зеркальное отражение

Члены, соответствующие глобальному зеркальному отражению, рассчитываются по правилу, описанному ниже:

Пускай трассируется луч v, падающий на поверхность в точку Q. В этой точке он отражается в направлении r, и, если поверхность прозрачна, преломляется в направлении p. Здесь It - интенсивность света в направлении p. Этот свет преломляется и достигает наблюдателя в направлении v.

Аналогично, Is - интенсивность зеркально отражённого света, падающего в направлении r и отражённая наблюдателю в точку Q. n - нормаль к поверхности в точке Q. L[j] - направление на j-й источник света. S, R - локальные векторы наблюдения и отражения. nu - показатель преломления среды. m - степень пространственного распределения Фонга для зеркального отражения.

Тогда наблюдаемая интенсивность выражается формулой Здесь Ka, Kd, Ks - коэффициенты рассеянного, диффузного и зеркального отражений, а Kt - коэффициент пропускания.

Про световую энергию

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

Дерево лучей

В глобальной модели освещения предполагается, что падающий луч v в точке Q отражается в направлении r и проходит сквозь поверхность в направлении p. Таким образом, в точке образуется ещё два луча. для которых нужно найти все пересечения с объектами. Процесс повторяется до тех пор, пока не останется ни одного пересечения.

Пусть v - падающий луч, r - отражённый, а p - преломлённый. Пропущенный луч высчитывается по закону Снеллиуса:

Здесь Kn - отношение показателей преломления, n с шляпкой - вектор единичной нормали в направлении падающего луча.

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

В теории, глубина дерева может быть любой, но его построение можно прерывать при достижении определённого уровня или при исчерпании запаса памяти.

Обработка теней

Если мы хотим включить в алгоритм обработку теней, то нужно из каждого пересечения луча с поверхностью направить ко всем источникам L[j] теневые зонды.

Если на направлении между точкой и источником света лежит другой объект, то точка относительно этого источника лежит в тени и его вклад в локальное и диффузное отражение этого источника уменьшается.

Если поверхность, лежащая на пути луча, непрозрачна, то свет вообще не попадает на поверхность.

Если тень отбрасывается прозрачной поверхностью, то свет ослабляется в зависимости от её свойств.

Теневые зонды изображены на рисунке ниже:

Тонкости реализации

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

В стеке для каждого луча хранятся следующие данные:

  • Идентификатор луча (уникальный номер)
  • Тип луча (v - из глаза, r - отражённый, p - преломлённый)
  • Идентификатор исходного (породившего данный) луча
  • Тип исходного луча
  • Флаг пересечения (1, если есть пересечения. 0 иначе)
  • Указатель объекта (* Положение объекта, с которым луч пересекается*)
  • Координаты пересечения
  • Направляющие косинусы луча
  • d (расстояние от пересечения исходного до пересечения данного лучей)
  • It (интенсивность пропущенного света в направлении луча)
  • Is (интенсивность зеркально отражённого света в направлении луча) --

Блок-схемы

  • Блок-схема модели освещения для алгоритма трассировки луча с использованием глобальной модели освещения.

  • Глобальная модель освещения с трассировкой лучей