Закраска фигуры по Фонгу. Вуалирование граней
При закраске Фонга аппроксимация кривизны поверхности производится сначала в вершинах многоугольников - путем аппроксимации нормали в вершине. После этого билинейной интерполяцией вычисляется нормаль в каждом пикселе.
На рис. 25.2 (а также на рис. 25.3) изображены четыре плоскости, спроецированные на экран монитора. Горизонтальная штрих-линия представляет собой горизонтальный ряд пикселов, который строится лучом ЭЛТ.
Рассмотрим метод Фонга, суть которого состоит в аппроксимации нормалей, на примере.
1. Пусть нам известны уравнения плоскостей для трех многоугольников, и сходятся они в одной вершине. Три плоскости собираются в вершине V. Усредняем нормаль в ней:
nv = (a1 + a2 + a3)i + (b1 + b2 + b3)j + (c1 + c2 + c3)k
P0: z - 1 = 0;
P1: -y + z - 2 = 0;
P2: -x + z - 2 = 0.
nv = -i - j + 3k - усредненная нормаль в точке n (используется для вычисления интенсивности пиксела).
|n| = ((-1)2 + (-1)2 + 32)0.5 = 110.5 - абсолютная величина нормали.
е = nv / |n| = -0.3i - 0.3j + 0.9k - единичная (нормированная) нормаль.
2. Вычисляем нормаль в каждом пикселе строки. Для закраски необходимы векторы нормали в точках A, B и C. Аппроксимируем их усреднением нормалей к окружающим плоскостям. Для того, чтобы изобразить объект методом построчного сканирования, нужно в соответствии с моделью освещения рассчитывать интенсивность каждого пиксела вдоль сканирующей строки. Сначала определяется интенсивность вершин многоугольника (A, B и C), а затем с помощью интерполяции вычисляется интенсивность каждого пиксела на сканирующей строке.
Нормаль в точке Q находится линейной интерполяцией между А и В:
nQ = U * nA + (1 - U) * nB; 0 <= U <= 1; U = AQ/AB.
Нормаль в точке R находится линейной интерполяцией между B и C:
nR = Δ * nB + (1 - Δ) * nC; Δ = BR/BC.
Нормаль в точке P находится линейной интерполяцией между Q и R:
nP = t * nQ + (1 - t) * nR; 0 <= t <= 1; t = QP/QR.
Модели цвета
Объект кажется нам цветным, если он отражает и пропускает свет в узком диапазоне длин волн и поглощает все остальные длины волн. Параметры цвета: тон, насыщенность, светлость.
Тон определяет различие цветов и связан с длиной волны λ (рис. 26.1).
Насыщенность есть степень ослабленности данного цвета белым цветом (рис. 26.2).
Системы смешения цветов
RGB (красный, зеленый, синий - основные цвета) - аддитивная система (рис. 26.3), используется в излучающих поверхностях (светящиеся материалы, экраны мониторов). Белый цвет в этой системе является "абсолютно грязным цветом", так как он получается смешением красного, зеленого и синего цветов.
При смешении основных цветов системы RGB могут получаться дополнительные, например: зеленый + синий = голубой, зеленый + красный = желтый... Также нужно иметь в виду, что, например, полученный голубой цвет будет дополнительным к основному красному, и при этом голубой + красный = белый. Отсюда вытекает общая формула: <дополнительный цвет> + <основной цвет> = белый (справедливо и такое равенство: белый - <дополнительный цвет> = <основной цвет>).
CMY (голубой, пурпурный, желтый) - субтрактивная система, используется в отражающих поверхностях. Дополнительный цвет из субтрактивной системы есть основной цвет из аддитивной системы и наоборот.
Две системы взаимнооднозначны: голубой - красный, желтый - синий, пурпурный - зеленый. Цвета каждой пары взаимно дополняют друг друга. Это означает, что, скажем, пурпурный фильтр пропустит все цвета, кроме зеленого, желтый фильтр пропустит любой цвет, кроме синего и т. д. Как и в RGB-системе, справедлива формула: <дополнительный цвет> + <основной цвет> = белый.
Основные цвета и аддитивной, и субтрактивной системы можно получить, имея соответствующий набор светофильтров (рис. 26.5).
Любой цвет можно представить тройками чисел вида: (r, g, b); r, g и b характеризуют относительное количество потоков красного, зеленого и синего цветов и могут принимать любое значение в диапазоне от нуля до единицы.
На графике тройки чисел (r, g, b) являются координатами вектора, проведенного из начала координат:
Проецируя единичную плоскость, мы получим цветовой график (рис. 26.7). r' = r/(r + g + b), g' = g/(r + g + b), b' = b/(r + g + b), где r', g', b' - относительные веса компонент RGB. Следовательно, r' + g' + b' = 1 и b' = 1 - r' - g'; таким образом, с учетом двумерности и неодинаковой чувствительности в координатах XY, компоненту b' можно трактовать как яркость (интенсивность).
На рис. 26.8 изображен график МКО (МКО - Международная комиссия по освещению), на котором любой цвет, видимый глазом, кодируется как точка, лежащая внутри контура (100% чистые цвета лежат на контуре). Хотя этот график имеет необычную форму, им очень удобно пользоваться при практических расчетах.
Числа x и y дают относительное количество трех основных цветов, а третьей координатой дополнительно может быть задана интенсивность (см. формулы выше). D - это опорный белый цвет для экрана монитора. Стопроцентно чистые цвета лежат на контуре графика. Опорный белый цвет имеет 0% чистоты, то есть полностью разбавлен. Найти чистоту цветов означает найти отношение а/(а + b), где а - расстояние от белого до цвета, b - от цвета до контура.
Чтобы получить дополнительный цвет для основного, необходимо от основного цвета через опорный белый цвет провести прямую до пересечения с противоположной стороной фигуры.
Смешение цветов
Пусть имеется два цвета: c1(x1, y1, Y1) и c2(x2, y2, Y2), где x1, y1 - координаты первого цвета на графике МКО, x2, y2 - координаты второго цвета на графике МКО, Y1, Y2 - интенсивность. Требуется смешать c1 и c2 и получить цвет c12(x12, y12, Y12). С этой целью используются следующие формулы:
x12 = (x1 * Y1/y1 + x2 * Y2/y2 )/(Y1/y1 + Y2/y2 ),
y12 = (y1 * Y1/y1 + y2 * Y2/y2 )/(Y1/y1 + Y2/y2 ),
Y12 = Y1 + Y2.
Пример: необходимо смешать три цвета c1(0.1, 0.3, 10), c2(0.35, 0.2, 10) и c3(0.2, 0.5, 10) (рис. 26.9).
Вначале смешиваем c1 и c2: с помощью формул находим x12, y12, Y12 - получаем c12(0.25, 0.24, 20). Далее смешиваем c12 и c3 и получаем окончательно цвет c123(0.24, 0.29, 30).
На рис. 26.10 представлены характеристики некоторых светоматериалов (фотопленка, видеопленка и т. д.). Из этого рисунка хорошо видно, что разного рода технические средства искажают (срезают) видимую часть спектра.