
- •Задачи компьютерной графики и ее место среди других методов обработки информации
- •Основные направления компьютерной графики. Основные структурные элементы системы машинной графики
- •Виды данных, представленных в форме изображений
- •Класс 1: тоновые и цветные изображения
- •Класс 2: двухуровневые или представляемые в нескольких «цветах» изображения
- •Класс 3: непрерывные кривые и линии
- •Класс 4: точки или многоугольники
- •Виды данных, представленных в форме изображений Понятие изображения
- •Понятие о структуре изображения. Основные графические элементы (примитивы)
- •Графические элементы (примитивы).
- •Видимые и невидимые поверхности. Ограничения на сложность изображения
- •Ограничения на сложность изображения
- •Тесты глубины Тест 1.
- •Тест 2.
- •Тест 3. Проверка сканирующей прямой
- •Алгоритмы удаления невидимых поверхностей
- •Алгоритм сканирующей прямой Уоткинса
- •Алгоритм Робертса
- •Растровое представление геометрических объектов. Растровая развертка отрезка
- •Растровая развертка отрезка.
- •Растровая развертка сплошных областей. Закраска многоугольников
- •Закраска многоугольников.
- •Растровая развертка сплошных областей. Закраска ограниченной области
- •Алгоритмы отсечения отрезков Отсечение отрезков
- •Алгоритм Сазерленда-Коэна
- •Алгоритм средней точки
- •Алгоритм Кируса-Бека
- •Метод Гуро
- •Метод Фонга
- •Модели расчета освещенности граней трехмерных объектов
- •Методы трассировки лучей. Метод прямой трассировки лучей
- •Классический метод обратной трассировки лучей
- •Методы повышения качества изображения при обратной трассировке лучей Текстурные карты и свойства материалов. Работа с растровыми картами (bmp, png, jpeg)
- •Отображение шероховатости (bump-mapping)
- •Сглаживание (antialiasing)
- •Кубические сплайны
Методы трассировки лучей. Метод прямой трассировки лучей
Трассировка лучей (англ. Ray tracing; рейтрейсинг) — один из методов геометрической оптики — исследование оптических систем путём отслеживания взаимодействия отдельных лучей с поверхностями. В узком смысле — технология построения изображения трёхмерных моделей в компьютерных программах, при которых отслеживается обратная траектория распространения луча (от экрана к источнику).
Рассмотрим каким путем возникает реальное изображение. Выпустим из каждого источника света пучок лучей во все стороны и мысленно проследим за ним. При попадании луча на границу объекта выпускаем из точки попадания отраженный и преломленный лучи и отслеживаем их и все порожденные ими лучи.
Описанный процесс называется прямой трассировкой лучей. В результате можно получить изображение сцены однако, требуются огромные вычислительные затраты. Основным недостатком такого способа является то, что большая часть рассматриваемых лучей не попадает в глаз.
Как правило, применяется вероятностная модификация метода — при моделировании отдельные кванты испускаются в случайном направлении от источника света, и чем больше квантов будет рассчитано, тем более полной будет картина освещения. Использование физически достоверной модели распространения света позволяет получить реалистичную картину освещения с учетом вторичного освещения и других эффектов, но такой подход требует большого объема вычислений. Для каждого кванта необходимо произвести уйму сложных операций — хотя бы для нахождения точки столкновения с первым объектом. Особенно если объектов на сцене много и каждый представлен большой совокупностью треугольников.
Прямая трассировка лучей
Рассчитываются пути лучей света, идущие от источников до объектов сцены. Если такой первичный луч попадает в прозрачный объект, то преломляясь и теряя интенсивность, он идёт дальше и, возможно, попадает на другой объект, в свою очередь отражаясь от него. Так, многократно отражаясь и преломляясь, какая-то часть лучей приходят в точку наблюдения - т.е. эти лучи определяют цвет некоторых пикселей экранной плоскости. Если ограничиться некоторыми первичными лучами, выходящими из источников и попадающими только на объекты сцены или в камеру, а затем точно так же поступить со вторичными лучами, то время вычисления сцены уже будет конечным, а результат достаточно реалистичным. Например, тени и полутени от объектов сцены будут сформированы сразу же. Тем не менее, даже небольшое изменение точки наблюдения приведёт к пересчёту всей сцены. Недостаток данного метода - огромное количество "лишних" вычислительных операций.
Классический метод обратной трассировки лучей
Обратная трассировка лучей (она же рэйкастинг, raycasting) - простой, хотя и довольно медленный, метод получения высокореалистичных изображений. Этот метод часто путают с прямой трассировкой лучей (рэйтрэйсинг, raytracing), которая, на самом деле, практически никогда и никем не используется из-за своей редкостной неэффективности. Впрочем, эти два термина уже практически и не различают.
Итак, идея обратной трассировки лучей. Для определения цвета пиксела экрана через него из камеры проводится луч, ищется его ближайшее пересечение со сценой и определяется освещенность точки пересечения. Эта освещенность складывается из отраженной и преломленной энергий, непосредственно полученных от источников света, а также отраженной и преломленной энергий, идущих от других объектов сцены. После определения освещенности этой точки учитывается ослабление света при прохождении через прозрачный материал и в результате получается цвет точки экрана.
Для определения освещенности, привносимой непосредственным освещением, из точки пересечения выпускаются лучи ко всем источникам света и определяется вклад всех источников, которые не заслонены другими объектами сцены. Для определения отраженной и преломленной освещенности из точки выпускаются отраженный и преломленный лучи и определяется привносимая ими освещенность.
Непосредственное освещение от источника света считаем, например, по уравнению Фонга (см. п.5.1). На самом деле, компоненты diffuse и specular в этом уравнении для большей реалистичности с точки зрения физики надо разделить на квадрат расстояния до источника света, но обычно этим пренебрегают.
Ослабление света в прозрачной среде учитывается делением на коэффициент
k = exp(beta * l),
где
k |
коэффициент ослабления |
beta |
коэффициент прозрачности среды |
l |
длина пути внутри среды |
Наконец, преломляется луч света по следующему закону:
sin(b) = n1 * sin(a) / n2,
где
a |
угол между падающим лучом L и нормалью N |
b |
угол между преломленным лучом L' и нормалью N |
n1 |
коэффициент преломления среды, в которой проходит луч L |
n2 |
коэффициент преломления среды, в которой проходит луч L' |
Вот иллюстрация.
Для воздуха считают beta = 0, n = 1; для всех остальных сред обычно beta > 0, n > 1. Надо отметить, что все эти коэффициенты (отражения, преломления, прозрачности) различны для каждой из трех цветовых компонент R, G, B. Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают.
Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем цветовым компонентам, будет, таким образом, выглядеть примерно так:
ищем ближайшее пересечение луча со сценой (определяем точку p, где произошло пересечение, выясняем, с каким конкретно объектом оно произошло)
если не нашли, возвращаем 0
если пересечение есть, текущую освещенность полагаем равной фоновой освещенности (ambient)
определяем вектор n, нормаль к объекту в точке пересечения
для кажого (точечного) источника света
считаем вектор l, соединяющий источник и точку p (начало в p)
ищем пересечение луча с началом в точке p и направлением d со сценой
если нашли, прекращаем обработку этого источника, так как его не видно
считаем симметричный l относительно n вектор r
считаем по уравнению Фонга (оно использует n, l, r, d) освещенность в точке за счет этого источника света, добавляем ее к текущей
считаем симметричный d относительно n вектор refl, то есть отраженный вектор
трассируем отраженный луч (с началом p и направлением refl), добавляем полученную освещенность к текущей
считаем направление преломленного луча (вектор refr) по d, n и коэффициентам преломления
трассируем преломленный луч (с началом p и направлением refr), добавляем полученную освещенность к текущей
покомпонентно умножаем текущую освещенность на цвет объекта
если для материала, заполняющего пройденную лучом от o до p трассу beta != 0, умножаем текущую освещенность на коэффициент ослабления
возвращаем текущую освещенность
При стандартной камере, которая находится в (0,0,-dist), и ориентирована так, что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0), для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч, положив при этом
ox = oy = dz = 0, oz = -dist, dx = sx - xSize / 2, dy = ySize / 2 - sy.