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-