Методы закраски граней

В настоящее время в большинстве программ трёхмерного моделирования, таких как 3D Studio MAX и им подобных, вся сцена задаётся набором треугольников (граней), для которых рассчитывается значение освещённости и накладываются текстуры. Для рисования граней с наложенной на них освещённостью используются следующие три метода: метод постоянной закраски, метод Гуро и метод Фонга.

Метод постоянной закраски

Пусть имеется грань, заданная тремя вершинами и вектором нормали n. Метод заключается в том, что освещённость рассчитывается целиком для всей грани, и цветом, соответствующим этой освещённости, рисуется вся грань целиком. Освещённость в данном случае представляется в цветовой модели RGB и является трёхмерным вектором с положительным значением координат. В качестве простейшей модели освещённости в этом случае может использоваться следующая модель:

I = Ka · Ia + Kd · Id · (n, l), где
I - рассчитываемое значение освещённости грани;
Ka - коэффициент постоянной освещённости (независящей от характеристик сцены и источников цвета);
Ia - значение постоянной освещённости;
Kd - коэффициент диффузной освещённости (освещённость, которая зависит лишь от материала (цвета) объекта и от доли площади объекта, видимой наблюдателем);
Id - цвет грани;
n - вектор нормали к грани;
l - направление на источник света.

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

После расчёта значения освещённости может оказаться, что освещённость не является единичным вектором или что значения некоторых координат вектора освещённости приняли отрицательные значения. В этом случае выполняется следующая нормировка: для каждой координаты вектора освещённости проверяется её значение и если оно больше 1, то выполняется присваивание значению этой координаты 1; если это значение меньше 0, то выполняется присваивание значению этой координаты 0.

После того, как вычислена освещённость грани, производится растеризация грани в соответствии с используемым перспективным преобразованием, и производится вывод пикселей цветом, соответствующим вычисленному значению освещённости.

Метод постоянной закраски прост, но имеет один существенный недостаток - модель, построенная с применением этого метода визуально носит чисто полигональный характер - не вооружённым глазом заметно, что модель состоит из отдельных граней. Другими словами, освещённость в этом случае является кусочно-постоянной функцией с конечным числом точек разрыва первого рода.

Метод Гуро

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

Рис. 1

Пусть требуется вычислить значение освещённости в точке A (рис. 1). Пусть вершине v1 соответствует значение освещённости I1, а вершине v2 - значение освещённости I2. Обозначим искомую освещённость в точке A через IA. Тогда значение освещённости в точке A вычисляется по следующей формуле:

IA = I1 + (I2 - I1) · (A - v1) / (v2 - v1)

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

IA+1 = IA + C, C = (I2 - I1) / N, где
IA+1 - значение освещённости в точке, следующей после точки A по вертикали;
N - значение, которое вычисляется после выполнения перспективного преобразования по отношению к вершинам v1 и v2 как модуль разности между вертикальными координатами (Y) векторов v2 и v1.

Для вычисления освещённости в точке C используется точно такая же формула, но вместо вершин v1 и v2 используются координаты точек A и B, а вместо значений освещённостей I1 и I2 используются значения освещённостей в точках A и B.

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

Рис. 2

Метод Фонга

Для построения модели с гладкой функцией освещённости требуется, чтобы для этой модели было задано непрерывное поле единичных векторов нормали, но, так как модель состоит из граней, такое поле не может быть задано явным образом. Однако, это поле можно искуственно смоделировать, опираясь на нормали к каждой грани. Суть метода Фонга состоит в том, что для каждой точки грани вычисляется значение вектора нормали, используя билинейную интерполяцию. Таким образом, в методе Фонга интерполируются значения векторов нормалей, а не значения освещённостей, как в методе Гуро. Для реализации метода Фонга требуется иметь значения векторов нормалей для каждой вершины грани. Для вычисления значения вектора нормали n для произвольной вершины может использоваться следующая формула:

n = (n1 + n2 + ... + nk) / || n1 + n2 + ... + nk ||, где nk - значение вектора нормали к k-й грани, которой принадлежит вершина с вычисляемой нормалью n.

После того, как вычислено значение нормали для конкретной точки грани, можно вычислить освещённость для этой точки, используя, например, модель освещённости, описанную в методе постоянной закраски.

Метод Фонга требует гораздо больше вычислений для каждого пикселя, чем метод Гуро (три сложения на пиксель), однако обеспечивает значительно лучшее качество изображения по сравнению с методом Гуро. Метод Фонга также устраняет недостаток метода Гуро - зависимость освещённости грани от её положения относительно наблюдателя. Результат применения метода Фонга для заливки граней приведён на рис. 3.

Рис. 3

Возврат в раздел "Писанина"Возврат на Главную Страницу

Hosted by uCoz