Оглавление Дополнительное чтение Учебник «Компьютерная графика» Тени 
Цвет

Фактура

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

Впервые метод для нанесения рисунка (узора) на поверхность предложил Кэтмул. Блинн и Ньюэл усовершенствовали подход Кэтмула и включили в алгоритм отражение и блики на криволинейных поверхностях.

Главным при нанесении рисунка на поверхность является отображение, поэтому задача сводится к преобразованию систем координат. Если рисунок задан в фактурном пространстве в прямоугольной системе координат (u, w), a поверхность — в другой прямоугольной системе координат (q, f), то для нанесения рисунка на поверхность нужно найти или задать функцию отображения одного пространства на другое, то есть q = f(u, w); f = g(u, w) или u = r(q, f); w = s(q, f).

Обычно, хотя необязательно, предполагается, что функция отображения линейна: q = Au + B, f = Cw + D, где коэффициенты A, B, C, D выводятся из соотношения между двумя известными точками в системах координат.

рис. 29.1

Пример. Узор, показанный на рис. 29.1а, необходимо отобразить на кусок поверхности, заданный октантом сферы (рис. 29.1b). Узор представляет собой простую сетку из пересекающихся прямых. Параметрическое представление октанта сферы:
x = sinqsinf, 0 <= q <= p/2, p/4 <= f <= p/2,
y = cosf,
z = cosqsinf

Пусть функция отображения линейна, то есть q = Au + B; f = Cw + D и углы узора переходят в углы октанта:
u = 0, w = 0 при q = 0, f = p/2,
u = 1, w = 0 при q = p/2, f = p/2,
u = 0, w = 1 при q = 0, f = p/4,
u = 1, w = 1 при q = p/2, f = p/4.

Отсюда A = p/2, B = 0, C = -p/4, D = p/2, то есть линейная функция отображения пространства uw на пространство qf есть q = (p/2)u, f = p/2 - (p/4)w.

Обратное преобразование имеет вид: u = q/(p/2), w = (p/2 - f)/(p/4).

В таблице ниже приведено отображение одной линии из пространства uw в пространство qf, а затем в декартовы координаты xyz. Законченное отображение показано на рис. 29.1с.

u w q f x y z
1/4 0 p/2 p/2 0.38 0 0.92

1/4
7/(16p) 0.38 0.20 0.91

1/2
3/(8p) 0.35 0.38 0.85

3/4
5/(16p) 0.32 0.56 0.77

1
p/4 0.27 0.71 0.65

Узор на рис. 29.1 задан математически, но он может быть также нарисован от руки, либо получен путем сканирования фотографий и т. д. Для нанесения рисунка на поверхность необходимо отображение объектного пространства в пространство изображения, а также рассмотренное выше преобразование из фактурного пространства в объектное. Может быть применено также любое видовое преобразование. Если для пространства изображения используется растровое устройство, то можно применить два несколько отличающихся метода.

Первый основан на алгоритме разбиения Кэтмула. Алгоритм Кэтмула разбивает кусок поверхности на фрагменты до тех пор, пока фрагмент не будет покрывать центр только одного пиксела. Затем интенсивность пиксела можно было бы найти по узору, который получен при отображении параметрических значений центра фрагмента или пиксела в фактурное пространство. Но, как указал Кэтмул, такой метод поточечной выборки приводит к сильному лестничному эффекту. Например, можно потерять значительную часть или даже весь узор, показанный на рис. 29.1a, если все выбранные точки окажутся в белых областях узора. Чтобы этого не случилось, Кэтмул, разбивает как кусок поверхности, так и соответствующий узор. Когда найден фрагмент, покрывающий центр только одного пиксела, усредненная интенсивность соответствующего фрагмента узора используется для определения интенсивности пиксела.

В общем случае полученный фрагмент узора не обязательно прямоугольный. Когда он изображается на растровом устройстве, его интенсивность равна средней взвешенной интенсивности пикселов фактуры на данном фрагменте. В качестве весовой функции берется отношение площади пикселов фактуры, находящихся внутри фрагмента, к их полной площади. Блинн и Ньюэл применяли более качественный пирамидальный сглаживающий фильтр 2 * 2, предложенный Кроу Барски получил изображение бутылки, показанное на рис. 29.2, отобразив узор шахматной доски на кусок поверхности, заданной b-сплайнами.

рис. 29.2

Таким образом, алгоритм разбиения Кэтмула начинает свою работу на куске поверхности в объектном пространстве и развивается в двух направлениях: в пространстве изображения и фактурном пространстве. Рассмотрим этот метод на примере.

рис. 29.3

Пример. Рассмотрим кусок поверхности, образованный октантом единичной сферы (рис. 29.1b), простой узор в виде решетки (рис. 29.1a). Кусок поверхности нужно повернуть на -45o вокpyг оси y, затем на 35o вокруг оси x и изобразить в ортогональной проекции на растре 32 * 32 (рис. 29.3a). Узор задан на растре 64 * 64, где каждая строка имеет один пиксел в высоту (рис. 29.3b).

Сначала кусок поверхности разбивается на фрагменты, а затем преобразуется в пространство изображения. Начало координат объектного пространства находится в центре растра 32 * 32. Для того чтобы фрагмент покрывал центр только одного пиксела необходимо четыре разбиения (рис. 29.3a). В пространстве изображения этот фрагмент имеет прямоугольную форму. Пределы изменения параметров q и f для этого фрагмента в объектном пространстве суть 0 <= q <= p/32, 31p/64 <= f <= p/2. С помощью функции oбpaтного отображения из объектного пространства qf в фактурное пространство uw u = q/(p/2), w = (p/2 - f)/(p/4) получим координаты углов фрагмента в фактурном пространстве:
q = 0, f = p/2 -> u = 0, w = 0,
q = 0, f = 59p/64 -> u = 0, w = 1/16,
q = p/32, f = 59p/64 -> u = 1/16, w = 1/16
q = p/32, f = p/2 -> u = 1/16, w = 0.

Как видно из рис. 29.3b, в фактурном пространстве — это квадрат. На растре 0 до 64 часть 1/16 соответсвует 4 пикселам. На рис. 29.3b показаны все этапы деления.

Интенсивность пиксела в пространстве изображения определяется путем усреднения интесивностей пикселов в соответствующей части фактурного пространства. Компонента диффузного отражения масштабируется с учетом полученного коэффициента. При разбиении 4 * 4 фрагмент куска содержит 7 черных пикселов, поэтому в пространстве изображения интенсивности пиксела равна 7/16 в масштабе от 0 до 1.

Одно из преимуществ алгоритма разбиения Кэтмула состоит в том, что не обязательно знать обратное преобразование из пространства изображения в объектное пространство или глубину (значение z) фрагмента в пространстве изображения. Однако есть и недостатки: например, фрагмент может не совпадать с одним пикселом в пространстве изображения (рис. 29.3a). Часто глубина (значение z) известна из алгоритма удаления невидимых поверхностей. Для того чтобы найти обратное преобразование, нужно сохранить трехмерное видовое преобразование и преобразование объектного пространства в пространство изображения до проецирования на плоскость картины. При этом в фактурное пространство переводится точная площадь, покрываемая пикселом в пространстве изображения. Задача состоит в том, чтобы отобразить площадь пиксела из пространства изображения на поверхность в объектном пространстве, а затем — в фактурное пространство. Интенсивность пиксела в пространстве изображения равна средней интенсивности пикселов, покрытых этой площадью в фактурном пространстве. На полученный коэффициент умножается диффузная компонента модели освещения. Существуют, конечно, и другие, более сложные методы, позволяющие устранять лестничный эффект.

Пример построения фактуры обратным отображением пикселов. Рассмотрим опять октант единичной сферы (рис. 29.1b) и узор — простую решетку на растре 64 * 64 (рис. 29.3b). Октант снова нужно повернуть на -45o вокруг оси y, на 35o вокруг оси x и изобразить в ортогональной проекции на растре 32 * 32 (рис. 29.3a).

Рассмотрим интенсивность пиксела при Px = 21, Py = 15 на рис. 29.3a. Пиксел определяется своим левым нижним углом. Площадь пиксела ограничена 21 <= Px <= 22, 15 <= Py <= 16. Предположим, что окно в объектном пространстве, соответствующее растру 32 * 32 в пространстве изображения, задано: -1 <= x' <= 1, -1 <= y' <= 1. Тогда x' = Px/16 - 1, y' = Py/16 - 1.

Из уравнения единичной сферы z' = (1 - (x'2 + y'2))1/2, где x', y' — координаты в объемном пространстве после видового преобразования. Координаты углов на рассматриваемой поверхности таковы:

Px Py x' y' z'
21 15 0.3125 -0.0625 0.948
22 15 0.3750 -0.0625 0.925
22 16 0.3750 0 0.927
21 16 0.3125 0 0.950

Видовое преобразование до проецирования на плоскость картины и обратное преобразование суть

Обратное преобразование дает углы пиксела на куске поверхности в исходной ориентации, а именно:
|x y z 1| = |x' y' z' 1||T|-1.

Px Py x y z
21 15 0.795 0.493 0.341
22 15 0.826 0.479 0.296
22 16 0.802 0.532 0.272
21 16 0.771 0.545 0.329

Из параметрического представления единичной сферы
x = sinqsinf
y = cosq
z = cosqsinq
получаем
f = cos-1y
q = sin-1(x/sinf)
в параметрическом пространстве. С помощью преобразования из первого примера отобразим параметрическое пространство в фактурное:
u = q/(p/2)
w = (p/2 - f)/(p/4)
то есть углы пиксела в фактурном пространстве таковы:

Px Py f q u w
21 15 60.50o 66.04o 0.734 0.656
22 15 61.34o 70.30o 0.781 0.636
22 16 57.88o 71.28o 0.792 0.714
21 16 56.99o 66.88o 0.743 0.734

На рис. 29.4 показан результат, где криволинейный участок аппроксимирован четырехугольным. Заданный на растре узор проходит через левое ребро пиксела. Интенсивность пиксела можно вычислить несколькими методами, например, как взвешенное среднее значение пикселов фактуры, центры которых лежат внутри пиксела изображения. В данном случае отношение «черных» пикселов фактуры, образующих узор, ко всем пикселам с центрами внутри пикселов изображения равно 5/18. На это число умножается интенсивность диффузной составляющей в модели освещения.

рис. 29.4

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

В любой точке поверхности Q(u, w) частные производные по направлениям u и w, Qu и Qw, лежат в плоскости, касательной к поверхности в этой точке. Нормаль в ней определяется векторным произведением >n = Qu x Qw.

Блинн строит новую поверхность, которая выглядит шероховатой, внося в направлении нормали функцию возмущения P(u, w). Таким образом, радиус-вектор точки на новой поверхности есть
Q'(u, w) = Q(u, w) + P(u, w)(n/|n|).
Нормаль к возмущенной поверхности имеет вид
n' = Q'u x Q'w
Частные производные Q'u и Q'w выражаются формулами
Q'u = Qu + Pu(n/|n|) + P(n/|n|)u
Q'w = Qw + Pw(n/|n|) + P(n/|n|)w.
Последним членом можно пренебречь, так как P (функция возмущения) очень мала. Поэтому
Q'u = Qu + Pu(n'/|n|)
Q'w = Qw + Pw(n'/|n|).
Возмущенная нормаль имеет вид
n' = Qu x Qw + Pu(n x Qw)/|n| + Pw(Qu x n)/|n| + PuPw(n x n)/|n|2.
Первый член — нормаль n к исходной поверхности, а последний равен нулю, поэтому
n' = n + Pu(n x Qw)/|n| + Pw(Qu x n)/|n|,
где два последних члена, приведенные к единичной длине, представляют собой возмущение нормали к поверхности и создают соответствующий эффект в модели освещения.

В качестве P можно использовать почти любую функцию, у которой существуют частные производные. Блинн работал с простыми сетками, заданными математически, битовыми изображениями символов, узорами, заданными с помощью z-буфера, и рисунками, сделанными от руки. Например, на рис. 29.5b Т. ван Хук отобразил заданную фактуру (рис. 29.5a) на кусок бикубической поверхности. Если узор не определяется аналитически, то функция возмущения записывается как двумерная таблица цветов с индексами u, w. Промежуточные значения вычисляются билинейной интерполяцией табличных величин, а производные Pu и Pw вычисляются методом конечных разностей.

рис. 29.5

Эффект шероховатости зависит от масштаба изображаемого объекта. Например, если размер объекта увеличится в два раза, то величина вектора нормали возрастет в четыре раза, а его возмущения — только в два. Это приводит к тому, что увеличенный объект кажется более гладким. Однако масштаб фактуры на перспективном изображении не зависит от перемещения объекта в пространстве по направлению к наблюдателю или от него.

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

Один из последних методов построения нерегулярностей основан на фрактальных поверхностях. Фрактальная поверхность состоит из случайно заданных полигональных или биполиномиальных поверхностей.

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

рис. 29.6

Тени Цвет