1 Все полигоны сортируются по глубине и находится самый близкий к камере многоугольник.
2 Все многоугольники отсекаются этим ближайшим многоугольником и формируются два списка: внутренний (то, что внутри отсекающего многоугольника) и внешний (то, что вне отсекающего многоугольника)
3 Если внутренний список пуст, то отсекающий многоугольник ни с чем не пересекается. Добавляем его в результат, и весь алгоритм выполняется для внешнего списка.
4 Иначе, сравниваются Z отсекающего многоугольника и каждого из внутреннего списка:
○ Если там есть хотя бы один многоугольник, который ближе отсекающего, то к нему рекурсивно применяется весь алгоритм.
○ Иначе отсекающий многоугольник заносится в результат и весь алгоритм выполняется для внешнего списка
1. Зеркальное отражение света:Is=Icospα
α — угол между лучом отражения и направлением камеры.
p — степень полировки поверхности.
I — яркость источника
2. Диффузное отражение— отражение от матовых поверхностей.
Луч отражается во всех направлениях одинаково, где расположена камера — неважно: Id=Icosθ
θ — угол между нормалью к поверхности и лучом из источника.
3. Фоновое освещение (попадает в камеру независимо ни от чего): Ia=const.
4. Сумма первых двух вариантов:I = KaIa + KsIs + KdId
Ka,s,d — коэффициенты, задающие свойства поверхности.
Ia,s,d — яркости разных освещений.
Если источников много, то
I = KaIa+Σ[F(R)(KsIs+KdId)]
где
R — расстояние,
F(R) ϵ [0,1] — функция ослабления.
Например, F(R) = 1 / (K1 + K2R + K3R2)
Если свет не монохромный, то все предыдущие действия производятся отдельно для каждого канала R,G,B. Если вектор С=(R,G,B), то
IC=I*Cисточника*Cточки объекта
— например, при освещении синей поверхности красным светом она будет выглядеть чёрной.
53. Методы закраски: монотонная закраска, метод Гуро и метод Фонга. Имитация микрорельефа (карты нормалей)
Методы закраски:
● Монотонная закраска
○ Алгоритм:
1 Вычисляем нормаль к полигону
2 Вычисляем цвет
3 Рисуем закрашенный полигон полученным цветом
○ Достоинства:
● Простой, как палка, не требует дополнительных вычислений.
○ Недостатки — связаны с вычислением нормали:
● Невозможно моделировать тела вращения.
● Метод себя плохо ведет (наказать!), если источник освещения слишком близко расположен к поверхности. Это связано с тем, что угол падения и отражения — разный, а нормали одинаковые.
● Закраска методом Гуро (немонотонная)
○ Алгоритм:
1 Вычисляется нормаль к грани
2 Вычисляется нормаль к каждой вершине путем усреднения нормалей для соответствующих граней.
3 Согласно закону освещения, для каждой вершины [треугольника] вычисляется интенсивность (цвет).
4 Используется модифицированный алгоритм рисования закрашенного многоугольника. В каждом пикселе значение цвета определяется как средневзвешенное значений на ребрах, точнее, в местах пересечения рёбер со сканирующей строкой. Интенсивность на ребрах получается путём усреднения интенсивности на вершинах.
○ Недостатки:
● Баг метода: подносим источник света к центру прямоугольника, тогда весь прямоугольник будет залит одним цветом (поскольку в углах интенсивность освещения одинаковая), хотя центр должен быть освещён сильнее.
● Закраска методом Фонга
○ Алгоритм
● Отличается тем, что путем усреднения вычисляется нормаль к каждому пикселю полигона, а уже потом вычисляется освещение. Теперь все будет честно нарисовано, но дорогой ценой (N=(Nx,Ny,Nz) — вещественный вектор).
○ Достоинства:
● Более качественная картинка.
○ Недостатки:
● Ресурсоёмкость и понижение скорости
● Оптимизация метода Фонга
○ Алгоритм
● У тел вращения угол нормали меняется не сильно. Считаем (α, β) — насколько сильно отклоняется нормаль в точке отклонения от нормали ко всему полигону.
● Создаем “карту” (матрицу), позволяющую из (α, β) получить N
Имитация микрорельефа:
● Честное задание шершавой поверхности в виде множества полигонов
○ Недостаток: низкая скорость
● Bump Mapping. Используется карта высот — аналог текстур, но хранящая не цвета, а поправки к координатам поверхностей (в перпендикулярном направлении).
● Normal Mapping. Аналогично BM, но хранятся поправки к нормалям.
● Displacement Mapping. Аналогично BM, но хранятся смещения в произвольном направлении.
Чем сложнее задаётся карта нормалей, тем тоньше получается рисунок, но и тем больше требуется ресурсов.