Рис. 2.1.1. Блок-схема рекуррентного алгоритма обратной трассировки лучей.
В этой программе алгоритм обратной трассировки реализован рекуррентным образом. Функция расчета интенсивности первичного луча рекуррентно вызывает саму себя для нахождения интенсивностей отраженного и преломленного лучей.
Алгоритм:
Для расчета цвета каждого пиксела буфера кадра выполняются следующие действия:
1. Найти координаты пиксела в мировой системе координат.
2. Найти координаты первичного луча.
3. Запуск функции вычисления интенсивности первичного луча.
4. Найти пересечения луча со всеми примитивами сцены и выбрать ближайшее.
5. Если пересечение не найдено, значит, луч ушел в свободное пространство.
Для расчета цвета принимаем полную интенсивность равной фоновой интенсивности. Перейти на шаг 12. Если пересечение найдено, перейти на шаг 6.
6. Рассчитываем «локальную» интенсивность цвета объекта, которому принадлежит точка пересечения. Под «локальной» интенсивностью понимается интенсивность с учетом интенсивности диффузно отраженного света и интенсивность бликов.
7. Если материал отражает свет только диффузно, то считаем интенсивности отраженного и преломленного света нулевыми. Перейти на шаг 12. Иначе перейти на шаг 8.
8. Если достигнута максимальная глубина рекурсии, то принять интенсивности отраженного и преломленного света нулевыми. Перейти на шаг 12. Иначе перейти на шаг 9.
9. Вычислить вектор отраженного луча. Запуск рекурсии для нахождения интенсивности отраженного луча.
10. Вычислить вектор преломленного луча. Запуск рекурсии для нахождения интенсивности преломленного луча.
11. Вычисление полной интенсивности цвета. Полная интенсивность включает в себя интенсивность рассеянного света, локальную интенсивность и интенсивности отраженного и преломленного лучей.
12. Возврат в точку вызова функции вычисления интенсивности луча.
Если шел расчет первичного луча, то в буфер кадра помещается пиксел вычисленного цвета. Переходим к расчету следующего пиксела буфера кадра Если шел расчет отраженного (преломленного) луча, то вычисленная интенсивность будет принята как интенсивность отраженного (преломленного) луча на предыдущем шаге рекурсии.
Построение теней
СПЛОШНЫЕ ТЕНИ
Для построения сплошных теней в алгоритме трассировки на этапе вычисления «локальной» интенсивности цвета в точке объекта проверяется «видимость» каждого источника света из этой точки.
Принцип работы алгоритма.
1. Из проверяемой точки строится луч, направленный на источник света.
2. Производится поиск пересечений этого луча с примитивами сцены между проверяемой точкой и источником.
3. Если найдено хотя бы одно пересечение, то проверяемая точка находится в тени. При расчете ее цвета источник, для которого проводилась проверка, не учитывается.
4. Если пересечений не найдено, точка не в тени. При расчете ее цвета учитываем проверяемый источник.
Такой метод нахождения теней дает приемлемый результат до тех пор, пока на сцене нет прозрачных объектов. Однако сплошная черная тень от стакана выглядит не реалистично. Стекло частично пропускает свет, поэтому интенсивность заслоненного источника должна учитываться при подсчете интенсивности света в точке объекта, но она должна ослабляться при проходе света сквозь стекло.
РЕАЛИСТИЧНЫЕ ТЕНИ
В этой программе предлагается способ построения теней, хотя и не соответствующий физике процесса образования тени, но, тем не менее, дающий более реалистичные результаты, чем обыкновенные сплошные тени. В этом алгоритме ослабление интенсивности света, дошедшего до проверяемой точки, привязано к расстоянию, пройденному светом в материале (в стекле). При этом преломлением света полностью пренебрегаем.
Алгоритм работает следующим образом.
1. Из проверяемой точки строится луч, направленный на источник света.
2. Находятся ВСЕ пересечения этого луча с примитивами сцены между проверяемой точкой и источником и сохраняются в массив пересечений. Первым элементом в массив заносится 0 (сама точка, для которой истроится тень). Одновременно с этим формируется массив, в котором хранятся данные о том, какому объекту сцены принадлежит найденная точка пересечения.
3. Массив пересечений сортируется по возрастанию расстояния от проверяемой точки до точки пересечения. При этом абсолютно аналогичные операции проводятся и со вторым массивом.
4. Если в массив не была добавлена ни одна точка кроме начальной, то проверяемая точка не затенена. Берется полная интенсивность источника. В противном случае начинаем проход массива со второй точки по всем точкам.
5. Если объект, которому принадлежит текущая точка пересечения, абсолютно непрозрачный, то имеет место сплошная тень, цикл прерываем. Иначе проверяем, входит луч в объект или выходит из него. Если входит – переход в следующей точке.
6. Если выходит, то вычисляем расстояние от предыдущей точки до текущей. Это будет расстояние, пройденное светом внутри объекта. В зависимости этого расстояния ослабляем интенсивность источника. Переходим к следующей точке.
Надо заметить, что различные прозрачные объекты могут отбрасывать разную тень даже при одинаковом расстоянии, пройденном светом в объекте. Так цветное стекло должно отбрасывать более темную тень, чем прозрачное. Для учета этого факта для каждого объекта введен специальный параметр - это расстояние, пройденное светом внутри объекта до полного затухания. Чем больше этот параметр, тем светлее тень, отбрасываемая объектом.
Согласно модели Уиттеда цвет некоторой точки объекта определяется суммарной интенсивностью
I(l)=Ka*Ia(l)C(l) + Kd*Id(l)*C(l) +Ks*Is(l) + Kr*Ir(l) +Kt*It(l),
где l – длина волны, C(l) – заданный исходный цвет точки объекта, Ka, Kd, Ks, Kr и Kt – коэффициенты, учитывающие свойства конкретного объекта параметрами фоновой интенсивности, диффузного рассеивания, зеркальности, отражения и прозрачности.
Ia – интенсивность фоновой подсветки,
Id – интенсивность, учитываемая для диффузного рассеивания,
Is – интенсивность, учитываемая для зеркальности,
Ir – интенсивность излучения, пришедшая по отраженному лучу,
It – интенсивность излучения, пришедшая по преломленному лучу.
Интенсивность фоновой подсветки (Ia) для некоторого объекта обычно константа. Запишем формулы для остальных интенсивностей.
Для диффузного отражения:
Id=∑I(l)cosӨ,
где I(l) – интенсивность излучения i-го источника света, Ө - угол между нормалью к поверхности объекта и направлением на i-й источник света.
Для зеркальности:
Id=∑I(l)cosα,
где p – показатель степени от единицы до нескольких сотен (согласно модели Фонга), α – угол между отраженным лучом (обратной трассировки) и направлением на i-й источник света.
Надо заметить, что в модели Уиттеда в чистом виде есть один существенный недостаток. Дело в том, что доля световой энергии отраженной от поверхности объекта зависит от угла падения и преломления. Например, если смотреть вдоль поверхности стекла, то доля отраженного света повысится, а преломленного понизится. Но в модели Уиттеда коэффициенты, отражающие доли интенсивности отраженного и преломленного света в суммарной интенсивности точки поверхности объекта задаются константами (не зависят от угла). В большинстве случаев это дает приемлемый результат. Но при моделировании стекла мы встречаемся с эффектом полного внутреннего отражения. Некоторые лучи света не могут выйти из толщи стекла за заданное фиксированное число итераций. В результате этого по краям стакана возникает четкая черная полоса. Если учесть зависимость интенсивности отраженного и преломленного света от углов падения и преломления, то эффект будет намного более реалистичным. Края черной области размоются.
Для вычисления коэффициента при интенсивности отраженного луча используется следующая формула:
r = 0.5(cos α - Ncos β)2 /(cos α + Ncos β)2 + 0.5(Ncos α – cos β)2 /(Ncos α + cos β)2,
где α – угол падения луча, β – угол преломления луча, N – относительный показатель преломления двух сред.
Коэффициент при интенсивности преломленного луча вычисляется по формуле:
t = 1 – r.
Схема рассчета интенсивности. параметры, задающие свойства тел
В связи с недостатками модели Уиттеда в этой программе предлагается следующая система вычисления интенсивности света в точке.
Интенсивность света складывается из интенсивности фоновой подсветки сцены, интенсивности диффузно отраженного света источников, интенсивности бликов от источников («локальные» характеристики освещенности), интенсивности зеркально отраженного луча и интенсивности преломленного луча, если таковые имеются.
Интенсивность фоновой подсветки (IA) задается некоторой константой.
Интенсивность диффузно отраженного света (ID) вычисляется по классическому «закону косинуса».
ID = IL cos α,
где IL – интенсивность источника света, α – угол между нормалью к поверхности и направлением на источник.
В случае освещения сцены несколькими источниками Id вычисляется для каждого из них и затем суммируются.
IDi =Σ ILi cos αi.
Интенсивность блика от источника (IS) вычисляется в соответствии с моделью Фонга.