birmaga.ru
добавить свой файл

1

Лекция 7

Текстуры

Нанесение текстур

 

 

Различают два вида текстур:


  •          Процедурные

  •          Проективные (наносятся на грань объекта)

 

 

5.1. Процедурные текстуры

 

Рассмотрим простой пример: есть домик с кирпичными стенами. Решить задачу описания грани домика достаточно сложно. Можно было бы описать стенку, но это тоже сложно, поэтому эту стенку рисуют отдельно, а потом накладывают в качестве текстуры на нужную грань.

 

 

 

 

 

 

 

 

 

 

 

 

 

xt1, y t1 x t2, y t2

 

Рис. 4.1.1

 


индекс t означает «текстурный»






 

 

 

 

В ряде случаев могут получаться искажения

 

 

 

Рис. 4.1.2

 

Чем больше перспективное искажение, тем больше эти искажающие эффекты.

Решается следующая задача: в плоскости изображения имеется некоторый прямоугольник и bmp-картинка, которую нам надо вписать в этот прямоугольник. Эту задачу можно сформулировать иначе: имеется некоторый многоугольник и картинка, ему соответствующая. Многоугольник задан текстурными координатами, по которым из текстурного поля вырезается определённый кусок и наносится на объект.

 



Коррекция текстуры


 

 

P x2 y2 h2 xt2 y t2


i=N-1

X2 Y2 Z2 S2 xt2 yt2

 

x1 y1 h1 xt1 yt1 xt(i
) yt(i) h

xt yt s

 


i






 

i=0

X1 Y1 Z1 S1 xt1 yt1

 

Рис. 4.2

 

s-s1

xt = xt1 + ¾¾¾ (x t2 - x t1)

s2-s1

 

s-s1

yt = yt1 + ¾¾¾ (y t2 - y t1)

s2-s1

 

Линейная интерполяция:


A

h1 = ¾ - B ;

S1

 




A

h2 = ¾ - B ;

S2

 

 

 

A

h = ¾ - B ;

S

 


коэффициент, стоящий в первых двух уравнениях системы в скобках, – это поправочный коэффициент, выполняющий коррекцию текстурных координат






После подстановки всех формул получаем:

 

i h2 + B

xt(i) = xt1 + ¾¾ (x t2 - x t1) ¾¾¾

N-1 h(i)+ B

 

i h2 + B

yt(i) = yt1 + ¾¾ (y t2 - y t1) ¾¾¾

N-1 h(i
)+ B

 

i


h(i) = h1 + ¾¾ (h2 - h1)

N-1

 

 

При программировании эти формулы можно упростить:

 

i


fx(i
) = ¾¾ (xt2 - xt1) (h2 + B); fx(i+1) = fx(i) + Dfx

N-1

 

i


fy(i
) = ¾¾ (yt2 - yt1) (h2 + B); fy(i+1) = fy(i) + Dfy

N-1

 

(x t2 - x t1) (h2 + B) (y t2 - y t1) (h2 + B)

Dfx = ¾¾¾¾¾¾¾¾ ; Dfy = ¾¾¾¾¾¾¾¾ ;

N-1 N-1


 

Тогда будем иметь:

 

fx(i
)

xt(i
) = xt1 + ¾¾¾

h(i
)+B

 

fy(i
)

yt(i) = yt1 + ¾¾¾

h(i)+B

 

 

Билинейная интерполяция

 

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

Задача заключается в нахождении яркости в точке V.

Сначала находится яркость в точке V5 с учетом линейной интерполяции между точками V1 и V4; затем в точке V6 с учетом интерполяции между точками V2 и V3. Затем производится интерполяция между точками V5 и V6 для нахождения яркости в точке V.


V5=V1*(1-Ex) +V4*Ex

V6=V2*(1-Ex) +V3*Ex

V = V5*(1-Ey) +V6*Ey

Ex, EyÎ{0:1}

 








 

Рис. 4.3.1

 

 

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


 

Вопрос: как реализовать прозрачность (например, прозрачное окно в доме)?

Ответ: вводят признак прозрачности текстуры. При появлении кода прозрачности соответствующие точки игнорируются.

 

 

 

окно

 

непрозрачно

a1


a1 - коэффициент прозрачности.

a1 Î [0, 1]

a1 = 0 => прозрачно

a1 = 1 => непрозрачно

 








 

 


 

V2

 

V1

Рис. 4.3.2

 

В этом случае VS = a1V1 + V2 (1-a1)

 

 



a1 a2 непрозрачно

 

 

 

 

V2

V3

V1

 

Рис. 4.3.3

 

VS = a1V1 + (1-a1)( a2V2 + V3 (1-a2))

Виды текстур

 


  1. 1.       Прозрачные текстуры

  2. 2.       Полупрозрачные текстуры

  3. 3.       Циклические текстуры

  4. 4.       Динамические текстуры

  5. 5.       текстуры с мультиразрешением

 

 

Прозрачные

 

Если необходима прозрачная текстура, то можно воспользоваться следующим методом:

 

 

Зарезервируем один код Vt под признак прозрачности, то есть эта точка не будет заноситься в буфер изображения. Нижеприведенный алгоритм отображает обработку одной точки при использовании прозрачной текстуры:

 

 

Полупрозрачные

 

При применении полупрозрачной текстуры используется L-буфер, хранящий коэффициенты прозрачности всех точек текстуры, то есть размет буфера равен размеру текстуры.

Коэффициент прозрачности L = 0…1 , 0 – чисто прозрачная точка, 1 – непрозрачная точка.

Алгоритм обработки точки полупрозрачной текстуры:

 

 

 

 

Наложение двух полупрозрачных граней:

 

Полупрозрачнсть:

 

H – обычный буфер

A –  буфер

V – поле изображения

HA – вспомогательный буфер для полупрозрачной грани

VA – яркость полупрозрачной грани

Pj – признак обработки j- ой грани (j = [0;m-1], если m граней)

 

Алгоритм:

 

  


Алгоритм обработки грани – сводится к обработке текущей точки:



 

Алгоритм учета полупрозрачности - перебор всех точек изображения - для каждой точки с координатами x,y:

 

 

 

Циклические

 

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

 

 

Динамические

 

Как можно показать, что море волнуется? У нас есть несколько текстур моря, и мы генерируем изображение с учетом изменения текстур. Т.е. в первом кадре накладывают первую текстуру, в следующем вторую и т.д. (каждый кадр берёт текстуру из своего файла).

 


 

Текстуры с мультиразрешением

 

Рассмотрим текстуру шахматного поля:

 



Рис 4.4.5.1

 

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

Трилинейная интерполяция:

 


Суть: использование текстур в зависимости удаления от наблюдателя Р (то есть дистанция D):

 

использование

текстуры Т1 Т2 Т3

 

Р V1 V2 D (S)

 

Smin S1 S S2 Smax

 

Рис 4.4.5.2

 

Проще работать с глубиной отрезка S, но корректнее с D.

 

В точках S1 и S2 при нетрилинейной интерполяции будет происходить резкий скачок из Т2 в Т3. Если мы используем трилинейную интерполяцию, то эти переходы будут плавными, и в точке S будет среднее между Т2 и Т3, причем в большей степени будет содержание Т3:

S-S1

V = V1 + * ( V2 – V1) , при расчете V1 и V2 используется

S2 – S1 билинейная интерполяция

 

y

x

S

P главный луч проектирования

r

(x,y)

R Начало координат находится в центре плоскости изображения

 

D

 

 

 

Рис 4.4.5.3

 



 

Вычисляем h = H(x,y), а затем – глубину S = A / (h + B).

Для пространственных координат получим:

 



 



 

Величина S вычисляется через буфер глубины: S = A / ( H(x,y) + B).
Проективные текстуры

 

Рассмотрим общий случай, когда текстура проецируется на поверхность, которая затем проецируется на 2-х мерный экран. Мы проецируем проектором некое изображение на поверхность, а затем смотрим на нее из произвольной точки (см. рис.1). Т.е. снова проецируем изображение, на этот раз уже с поверхности на наблюдателя. При построении изображения эта ситуация моделируется крайне просто - проекция примитивов поверхности на экран дело обычное, а роль второй проекции (проецирование изображения на поверхность) играет привязка соответствующего места текстуры с изображением на примитивы.


 



Рис5.1

 

 

Нам осталось лишь научиться правильно привязывать текстуру с исходным изображением к нашей поверхности. 

Всего мы имеем дело с четырьмя координатными системами. 

 


  1. Наблюдательская система ("clip" или "projection") - является обычным для графики 4-х координатным представлением 3-х мерного (объемного) пространства. Координаты зовутся x, y, z, w. Начало этой координатной системы лежит в точке наблюдения.

  2. Экранная система ("screen") - 2-х мерный экран, который и видит наблюдатель. Эти координаты получаются из наблюдательской системы путём деления x и y на w – x5 = x / w, y5 = y / w, (индекс "s" у получающихся координат обозначает экранную систему).

  3. Система источника света ("light") - это вторая объемная система координат (xt, yt, zt и wt,). В начале этой системы координат находится источник света.

  4. Текстурная система (texture) - координаты на плоскости проецируемой текстуры (тот слайд, сквозь который светит воображаемый источник света). Текстурные координаты получаются как xt = xt / wt, yt = yt / wt (также можно вычислить  zt = zt / wt , если мы решили не ограничиваться плоской текстурой).

 

Наша задача: имея точку (x5, y5) на экране, нам необходимо найти соответствующую ей точку (xt, yt) на текстуре.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

На рис. 5.2 показан сегмент линии в нашем трехмерном пространстве и его проекция на 2-х мерный экран. Этот сегмент - горизонтальная полоса сканирования на экране, расположенная между двумя рёбрами полигона. Координаты его концов в наблюдательской системе:

 



 

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



 

и решим относительно t . Для тех, кому интересно, приведем все рассуждения: 

 

Вычисление t:

Зададим a и b, таким образом, что 1 – t5 = a / (a + b) и t5 = b / (a + b).

Зададим A и B так, что t = A / (A + B) и t = B / (A + B).

Тогда:



Легко проверить, что A = aw1 и B = bw2 удовлетворяют этому уравнению, позволяя нам получить искомый параметр t , и, далее, координаты Q.

Продолжим. У нас есть матрица M, переводящая координаты из системы источника в наблюдательскую: 

 



 

Уравнение (6) выражает координаты на поверхности текстуры, соответствующие любой точке сегмента выбираемой (линейно интерполируемой) параметром в экранных координатах. 


Для того, чтобы получить координаты, мы должны линейно интерполировать xt/w, yt/w, wt/w.

Для каждого пикселя:



Если wt постоянна на всём полигоне, то уравнение (7) приобретает вид



откуда мы имеем s = xt/wt, t = yt/wt. Здесь (s,t) - текстурные координаты, синонимы (xt, yt).

 

Уравнение (8) и определяет текстурные координаты, которые можно привязать к вершинам передаваемого на ускоритель полигона. В более общем сложном случае проективной текстуры, выражаемом уравнением (7), требуется деление на wt/w, а не на 1/w.
Рельефные текстуры.

 

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

 

Т
еперь рассмотрим мировую систему координат, в которой мы имеем следующий треугольник (имеет рельефную текстуру):

 

S – источник света;

,

где - координаты связанные с рельефным полем (поле нормалей).

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


 

 


Где:



 

Воспользуемся следующими формулами:

 



 

И
спользуем относительные координаты точки в пределах треугольника:

Относительные координаты:

точка (x,y) будет характеризоваться:

Для любой точки принадлежащей этому треугольнику:





 

При обратном пересчёте:



 

Определим для точки относительные координаты через её пространственные

координаты:

 



 

Координаты точки в рельефной системе:



 

Алгоритм прорисовки:


  1. 1)      пересчёт координаты в рельефном поле;
  2. 2)      при закраске интерполяция (нелинейная) рельефных координат.


 

По рельефным координатам просчитываем нормаль, плюс имея расстояние до S

высчитываем угол между векторами и , следовательно имеем яркость то-

чки.

 

Учёт освещения: