Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КГ - лекции Польского.doc
Скачиваний:
32
Добавлен:
06.11.2018
Размер:
1.3 Mб
Скачать

Лекция 14 Освещение

Если рассматривать луч света, как электромагнитную волну, то он характеризуется двумя параметрами – длиной волны , и амплитудой I. Произвольный луч можно рассматривать как сумму волн с различной длиной, каждая из них вносит свой вклад I(). Эта функция называется спектральной характеристикой луча света. В общем луч одного и того же цвета может состоять из различных волн. Обычно рассматривают луч света, как состоящий из трех базовых компонент R,G,B. При распространении света следует обрабатывать два случая – распространение в однородной среде и взаимодействие с границей раздела двух сред.

В однородной среде свет распространяется прямолинейно с постоянной скоростью. Отношение этой скорости к скорости света в вакууме определяется коэффициентом преломления среды (). При этом свет затухает с коэффициентом , где d – расстояние, пройденное светом в среде,  - коэффициент затухания. На практике, пользуются более простой формулой , где a,b – некоторые константы.

При переходе границы двух сред происходит отражение и преломление света. Угол отражения  равен углу падения. Отсюда легко можно получить отраженный вектор.

R=-L+a+b

a=b=L+c

c=(cos)N=(-LN)N

R=-L+2(L-(LN)N)=L-2(LN)N

Преломление происходит согласно закону Lsin=Tsin.

Можно использовать один коэффициент , тогда sin=sin.

,

(1)

=С, , если представить вектор T=aL+bN, тогда .

если наложить условие нормировки на T, тогда |T|=1

(2)

Если теперь сложить (1) и (2)

=>

Теперь из уравнения (2) можно вычислить b.

,

Это законы для идеального отражения и преломления, когда поверхность идеально гладкая. Обычно поверхность имеет неровности, и часть света отражается во всех направлениях. Такой освещение отражение диффузным и интенсивность отраженного луча рассчитывается по законы Ламберта Id=Il*kd()*cos, где Il – яркость света, упавшего на поверхность, kd() – коэффициент диффузного отражения поверхности. Этот коэффициент зависит от цвета поверхности, т.е. белый свет отражаясь от синей поверхности становится синим. Если свет задается тремя компонентами, то обычно эти коэффициенты рассчитывают из цвета поверхности (R,G,B) и некоторого общего коэффициента диффузного отражения kd. kd(R)=kd*R, kd(G)=kd*G, kd(B)=kd*B.

В направлениях, близких к направлению отраженного вектора, добавляется блик. Он рассчитывается по эмпирической формуле Is=Il*ks*cosn, параметр n дает фокусировку блика,  - угол между направлением на наблюдателя и отраженным лучем. Цвет блика не зависит от цвета поверхности, т.е. белый свет дает белый блик на синей поверхности. Кроме того, к этим двум цветам добавляется некоторый рассеянный свет Ia*ka(), где Ia – яркость рассеянного света, ka() – коэффициент отражения рассеянного света. Обычно ka()=kd().

Общая формула яркости света I’.

I’= Id+Is+Ia =Il*kd()*cos+ Il*ks*cosn+ Ia*ka()

I’=Il*(kd()*cos+ ks*cosn)+ Ia*ka()=(kd()*cos+ ks*cosn)+ Ia*ka()

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

Определение нормали к поверхности

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

,,

,

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

Метод излучательности

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

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

, где

- энергия, отбрасываемая i-м фрагментом;

- энергия излучаемая i-м фрагментом (если это источник света);

- доля энергии j-ого фрагмента, попадающая на i-м фрагментом (коэффициент формы);

- коэффициент отражения i-ого фрагмента;

Если учитывать закон сохранения энергии , то эта система хорошо решается итеративным методом.

,