1. Tekstury

Transkrypt

1. Tekstury
Grafika komputerowa – Tekstury
1. Tekstury
Tekstury są dwuwymiarowymi obrazkami nakładanymi na obiekty lub ich części, w
celu poprawienia realizmu rysowanych brył oraz dodatkowego określenia cech ich powierzchni np. przez nałożenie obrazka drewna lub marmuru. Tekstury mogą być również
używane do różnego rodzaju efektów specjalnych i być np. mapami definiującymi wyboje na
danej powierzchni (ang. bump mapping) . W związku z tym, że tekstura jest najczęściej
obiektem dwuwymiarowym, nałożenie jej na obiekt sprowadza się do przypisania każdemu
wierzchołkowi, tworzącemu pojedynczą ściankę (trójkąt) bryły, odpowiednich współrzędnych
obrazka. W przypadku nakładania tekstur na duże powierzchnie, których koniec znajduje się
daleko od obserwatora, zachodzi konieczność nakładania tekstury z uwzględnieniem odległości, czyli tzw. teksturowania z korekcją perspektywy. Technika ta znakomicie poprawia wygląd rysowanych obiektów, jednak wymaga pewnych nakładów obliczeniowych.
Procedura teksturowania polega na przyporządkowaniu każdemu z punktów, rysowanego wielokąta odpowiedniego punktu tekstury. Algorytm realizujący powyższe zadanie jest
bardzo podobny do algorytmu cieniowania Gouraud’a i pierwszą czynnością, jaką należy wykonać, jest przyporządkowanie każdemu wierzchołkowi, rysowanego trójkąta, odpowiedniego
wierzchołka tekstury. Następnie należy interpolować współrzędne tekstury wzdłuż rysowanego trójkąta. Podczas rysowania poziomej linii również dokonujemy interpolacji współrzędnych tekstury, w tracie tej operacji często dochodzi do powiększenia lub zmniejszenia obrazka tak, aby w całości pokrył, rysowany trójkąt. W wyniku powiększania tekstury (ang. magnification) nakładanej na duży, położony blisko obserwatora, obiekt może dojść do sytuacji, w
której pojedynczy piksel tekstury zostanie przyporządkowany kilku sąsiadującym ze sobą
pikselom. Efektem tego jest obraz składający się z dużych wyraźnych kwadratów. Znowu w
trakcie zmniejszania tekstury (ang. minification) może dojść do sytuacji, w której część z pikseli tekstury zostaje pominięta i nie zostaje naniesiona na ekran. W celu redukcji wspomnianych zjawisk wprowadzono kilka typu filtrów, stosowanych do poprawy wyglądu rysowanych tekstur. Poniżej przedstawiono algorytm realizujący teksturowanie.
1. Posortuj wierzchołki trójkąta względem ich współrzędnych (od najmniejszej do największej).
2. Oblicz przyrosty między wierzchołkami trójkąta na podstawie wzorów
x − x1
a) dx12 = 2
y 2 − y1
x − x1
b) dx13 = 3
y 3 − y1
x − x2
c) dx 23 = 3
y3 − y 2
xt − xt1
d) tx12 = 2
y 2 − y1
xt − xt1
e) tx13 = 3
y 3 − y1
xt − xt 2
f) tx 23 = 3
y3 − y 2
-1-
Grafika komputerowa – Tekstury
yt 2 − yt1
y 2 − y1
yt − yt1
h) ty13 = 3
y 3 − y1
yt − yt 2
i) ty 23 = 3
y3 − y 2
g) ty12 =
3. y = y1 ; x11 = x1 ; x12 = x 2 ; xd1 = xt1 ; xd 2 = xt 2 ; yd1 = yt1 ; yd 2 = yt 2
4. Rysuj linię poziomą od punktu ( x11 , y ) do punktu ( x12 , y ) z interpolacją współrzędnych tekstury od (xd1,yd1) do (xd2,yd2); pamiętaj, aby sprawdzić czy x11 ≤ x12 (w razie
potrzeby zamień kolejność punktów)
5. x11 = x11 + dx12
6. x12 = x12 + dx13
7. xd1 = xd1 + tx12
8. xd 2 = xd 2 + tx13
9. yd1 = yd1 + ty12
10. yd 2 = yd 2 + ty13
11. y = y + 1
12. Jeżeli y < y 2 to skacz do punktu 4.
13. y = y 21 ; x11 = x 2 ; x12 = x12 ; xd1 = xt 2 ; xd 2 = xd 2 ; yd1 = yt 2 ; yd 2 = yd 2
14. Rysuj linię poziomą od punktu ( x11 , y ) do punktu ( x12 , y ) z interpolacją współrzędnych tekstury od (xd1,yd1) do (xd2,yd2); pamiętaj, aby sprawdzić czy x11 ≤ x12 (w razie
potrzeby zamień kolejność punktów)
15. x11 = x11 + dx12
16. x12 = x12 + dx13
17. xd1 = xd1 + tx12
18. xd 2 = xd 2 + tx13
19. yd1 = yd1 + ty12
20. yd 2 = yd 2 + ty13
21. y = y + 1
22. Jeżeli y < y 3 to skacz do punktu 10.
Gdzie
1.1 Owinięcia
Owinięcie określa sposób nałożenia tekstury na trójwymiarowy obiekt. Poniżej podane są
wzory realizujące najczęściej stosowane typy teksturowania. Dla większej jasności przypominam, że wyznaczane współrzędne tu oraz tv są współrzędnymi tekstury. Wszystkie wzory
podane są w trzech przypadkach opisujących teksturowanie odpowiednio: wzdłuż osi X, Y i
Z.
-2-
Grafika komputerowa – Tekstury
• owiniecie płaskie (planarne), względem osi:
x) tu = s ⋅ z − cz ; tv = s ⋅ y − cy
y) tu = s ⋅ x − cx ; tv = s ⋅ z − cz
z) tu = s ⋅ x − cx ; tv = s ⋅ x − cx
gdzie sx,sy, sz parametry określające współczynniki skalujące teksturę wzdłuż odpowiednich
osi. Pamiętając, że współrzędne tekstury powinny być w przedziale od 0 do 1, odpowiednie
skale można wyznaczyć na zasadzie s=1/(maksymalny rozmiar bryły, względem wybranej
osi)
•
owinięcie cylindryczne, względem osi:
z
s
x) tu = u arctg   − ou ; tv = s v ⋅ x − ov
2 ⋅π
 y
y) tu =
su
 x
arctg   − ou ; tv = sv ⋅ y − ov
2 ⋅π
z
 x
su
arctg   − ou ; tv = s v ⋅ z − ov
2 ⋅π
 y
gdzie Su, Sv parametry skalujące odpowiednie współrzędne tekstury, ou , ov współrzędne wyznaczające środek tekstury
z) tu =
•
owinięcia sferyczne, względem osi:
x) tu =
su
z
arctg   − ou
2 ⋅π
 y
y) tu =
su
 x
arctg   − ou
2 ⋅π
z


x
 − ov
arctg 
 x2 + y2 + z2 
π




s
y
 − ov
tv = v arctg 
 x2 + y 2 + z 2 
π


tv =
sv


z
 − ov
arctg 
 x2 + y2 + z2 
π


gdzie Su, Sv parametry skalujące odpowiednie współrzędne tekstury, ou , ov współrzędne wyznaczające środek tekstury
z) tu =
su
 x
arctg   − ou
2 ⋅π
 y
tv =
sv
1.2 Adresowanie współrzędnych tekstur
Współrzędne tekstur powinny zawierać się w przedziale od 0 do 1, jednak czasem wskutek źle wyznaczonego współczynnika skalującego lub celowego działania, koordynaty przekraczają dozwolony przedział. Zwykle w przypadku przekroczenia przez współrzędną tekstury u bądź v wartości 1 bierze się pod uwagę jedynie ułamkową część liczby. Efektem tego
jest cykliczne powtarzanie tekstury na danej powierzchni. Zjawisko to może być wykorzystane do różnego rodzaju technik teksturowania obiektów, w związku z czym w systemach ta-
-3-
Grafika komputerowa – Tekstury
kich jak DirectX, czy OpenGL zdefiniowano kilka typów adresowania współrzędnych tekstur
w przypadku przekroczenia wartości jeden.
•
WRAP Tryb ten polega na powtarzaniu tekstury wzdłuż odpowiedniej współrzędnej za
każdym razem gdy, dana współrzędna przekroczy całkowitą wielokrotność liczby jeden.
Przykładowo jeżeli tekstura ma być nałożona na kwadrat i współrzędne tekstury zdefiniowano następująco (0,0),(0,2)(2,0) i (2,2) to efektem działania tego trybu adresowania
będzie umieszczenie czterech obrazków na rysowanym kwadracie. Sytuacja taka prezentowana jest na ilustracji.
•
MIRROR, W trybie tym, dla każdej współrzędnej, w momencie przekroczenia przez nią
wartości jeden, następuje lustrzane odbicie tekstury, względem odpowiedniej osi U lub V.
Dzieje się tak gdyż współrzędne po przekroczeniu pierwszej wielokrotności jeden cyklicznie zmieniają się od 0 do 1, następnie po przekroczeniu kolejnej wielokrotności jedynki od 1 do zera i tak dalej. Taki sposób wyznaczania współrzędnych można przedstawić za pomocą krótkiego programu
float fTest=fmod(ceil(u),2);
if fTest ) u=(u-floor(u));
else u=1-(u-floor(u));
Omawiany sposób adresowania jest szczególnie przydatny przy nakładaniu wszelkiego typu
tekstur o nieregularnych wzorach (marmur itp.), dzięki niemu mamy pewność, że tekstury
będą tworzyły jednolity wzór. Poniższa ilustracja jest prezentuje efekty działania tego trybu
adresowania.
•
CLAMP Tryb ten powoduje „przycięcie” odpowiednich współrzędnych do wartości z zakresu od 0 do 1. Efektem działania jest nałożenie obrazka tylko w miejscu gdzie
współrzędne nie przekraczają podanego zakresu. W pozostałym obszarze współrzędne
tekstur przyjmują zwykle wartość 1 co daje efekt rozmazania brzegów tekstury wzdłuż
odpowiednich osi U i V. Poniższa ilustracja prezentuje efekty tego trybu adresowania.
-4-
Grafika komputerowa – Tekstury
•
BORDER Tryb ten jest bardzo podobny do poprzedniego. Jedyną różnicą jest to, że
wszystkie wierzchołki, których współrzędne tekstur przekroczyły wartość 1 są pokrywane określonym kolorem „brzegowym”.
2. Efekty specjalne realizowane przy pomocy tekstur
2.1
Mapowanie środowiska
Na wstępnie wspomniałem, że tekstury mogą pełnić rolę map określających nierówności powierzchni itp. Teksturowanie może być również zastosowane do mapowania środowiska (ang. environment mapping), czyli inaczej mówią realizacji odbić. W zasadzie stosując
cieniowanie Gouraud’a jest to jedyny sposób uzyskania efektu odbijania się sceny w jednym
lub wielu obiektach. Ogólna zasada tego algorytmu jest prosta i polega na narysowaniu (w
pomocniczym buforze) sceny widzianej z pozycji określonego obiektu, a następnie pokrycie
go tak przygotowaną teksturą. Generalnie można wyróżnić dwa typy mapowania środwiska:
1) mapowanie środowiska sferyczne- owinięcie tego typu zakłada, że wokół teksturowanego
obiektu rozpięta jest wyimaginowana sfera, której wewnętrzna powierzchnia zostaje odbita na
obiekcie. Realizacja omawianej techniki jest niezwykle prosta i polega na transformacji
wierzchołków, wraz z ich wektorami normalnymi, a następnie dla każdego wierzchołka wyznacza się współrzędne u i v tekstury w następujący sposób.
Ny
N
v=
u = x + 0,5
+ 0,5
2
2
gdzie Nx i Ny są składowymi x i y wektora normalnego związanego z danym wierzchołkiem.
Stosowanie tej techniki daje świetne efekty metalicznego wyglądu obiektów, niestety zastosowanie jej do uzyskania efektu odbicia wymaga odpowiedniego spreparowania tekstury.
2) kubiczne mapowanie środowiska - ten typ owinięcia stanowi rozszerzenie poprzedniego i
opiera się na założeniu, że obiekt otaczany jest przez sześcian, którego ścianki odbijają się na
powierzchni bryły. Obraz na każdej z płaszczyzn sześcianu otrzymywany jest w wyniku rysowania sceny widzianej przez daną płaszczyznę. Stosowanie tej techniki wiąże się z poniesieniem stosunkowo dużych kosztów obliczeniowych (dla każdego obiektu ,w którym odbijają się inne, należy narysować scenę sześciokrotnie). Z tego powodu należy rysować scenę
jedynie na widocznych ściankach sześcianu. Współrzędne tekstury obliczane są na podstawie
wektora odbicia wyznaczanego na podstawie wzoru
R=2NzN-I
I(0,0,1)
-5-
Grafika komputerowa – Tekstury
2.2 Wyboje (ang. bump mapping)
Efekt nierówności powierzchni jest łatwo zrealizować stosując model cieniowania
Phong’a. Podstawową ideą tego algorytmu jest zmodyfikowanie współrzędnych x i y interpolowanych wektorów normalnych. Dzięki temu część wektorów zwróci się w stronę światła,
powodując lepsze oświetlenie określonych punktów, natomiast część pozostanie bez zmian
lub ulegnie przyciemnieniu. Tego typu efekty pozwalają właśnie na stworzenie złudzenia wypukłych powierzchni obiektu. Wartości, które należy dodać do współrzędnych wektorów są
przyrostami jasności definiowanymi przez odpowiednią teksturę (mapę nierówności powierzchni).i wyznaczane są w następujący sposób
gx( x , y ) = j ( x +1, y ) − j ( x −1, y )
gy ( x , y ) = j ( x , y +1) − j ( x , y −1)
gdzie j(x,y) jasność punktu o współrzędnych (x,y); gx przyrosty jasności względem osi x; gy
przyrosty jasności względem osi y;
Jak widać z powyższych wzorów przyrosty wyznaczane są dla każdego punktu wzdłuż
osi pionu i poziomu, z tego powodu należy przygotować dwie tablice o rozmiarach dokładnie
takich jak tekstura. W celu wyznaczenia właściwego punktu z tablic przyrostów można posłużyć się algorytmem teksturowania, tak jakbyśmy nakładali na obiekt typową teksturę z
tym, że współrzędne punktu tekstury będą dla nas współrzędnymi wartości, jakie należy pobrać z obu tablic przyrostów. Dodatkowo należy pamiętać, że wektory są znormalizowane i
w związku z tym przyrosty należy podzielić przez maksymalną ich wartość czyli 255
Rys. 1 Torus cieniowany algorytmem Phong’a z uwzględnieniem nierówności powierzchni. Do oświetlenia
bryły użyto dwóch świateł.
-6-
Grafika komputerowa – Tekstury
Zadania do wykonania w trakcie ćwiczeń
•
•
•
Napisać procedurę mapującą obrazek o rozmiarach 256x256 na prostokątny obszar
ekranu o dowolnych rozmiarach.
Napisać program rysujący teksturowany sześcian (współrzędne tektury dla kolejnych
wierzchołków określić ręcznie)
Program z poprzedniego punktu rozbudować o funkcję wyznaczającą współrzędne
tekstury (owinięcie płaskie) wzdłuż dowolnej osi.
-7-

Podobne dokumenty