Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00098 007776 10476149 na godz. na dobę w sumie
Aplikacje Direct3D - książka
Aplikacje Direct3D - książka
Autor: Liczba stron: 192
Wydawca: Helion Język publikacji: polski
ISBN: 83-7197-877-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> gry >> directx
Porównaj ceny (książka, ebook, audiobook).
Dzięki Direct3D możesz tworzyć nowoczesne gry, symulacje czy programy multimedialne. Jest on podstawowym standardem programowania grafiki trójwymiarowej w systemach operacyjnych zgodnych z Windows. Akceleracja sprzętowa, oferowana przez większość współczesnych kart graficznych oraz bogaty zbiór narzędzi dostępnych w wersji 8.1 umożliwia programowanie zaskakującej i efektownej grafiki 3D. Direct3D dostarcza programiście gotowych interfejsów, uwalniając go jednocześnie od konieczności zaznajamiania się ze wewnętrznymi funkcjami sprzętu.

Blisko 100 przykładowych projektów prezentujących wiele praktycznych zastosowań Direct3D wprowadzi Cię w świat programowania grafiki 3D.

W książce omówiono m.in.:

Autor zakłada, że Czytelnik potrafi posługiwać się pakietem Visual C++ i posiada umiejętność programowania w tym języku, korzysta z klas MFC, a także jest zaznajomiony z pojęciami dotyczącymi grafiki komputerowej. Jeśli spełniasz te warunki i chcesz kreować własne, trójwymiarowe światy na ekranie komputera, z pewnością pomoże Ci w tym ta książka.
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI Aplikacje Direct3D KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Autor: Robert Krupiñski ISBN: 83-7197-877-4 Format: B5, stron: 180 Dziêki Direct3D mo¿esz tworzyæ nowoczesne gry, symulacje czy programy multimedialne. Jest on podstawowym standardem programowania grafiki trójwymiarowej w systemach operacyjnych zgodnych z Windows. Akceleracja sprzêtowa, oferowana przez wiêkszoġæ wspó³czesnych kart graficznych oraz bogaty zbiór narzêdzi dostêpnych w wersji 8.1 umo¿liwia programowanie zaskakuj¹cej i efektownej grafiki 3D. Direct3D dostarcza programiġcie gotowych interfejsów, uwalniaj¹c go jednoczeġnie od koniecznoġci zaznajamiania siê ze wewnêtrznymi funkcjami sprzêtu. Blisko 100 przyk³adowych projektów prezentuj¹cych wiele praktycznych zastosowañ Direct3D wprowadzi Ciê w ġwiat programowania grafiki 3D. W ksi¹¿ce omówiono m.in.: • Podstawy programowania w Direct3D • Bufory werteksów • Zarz¹dzanie z³o¿onymi obiektami (obiekt Mesh) • Przekszta³cenia przestrzeni • Ďwiat³o i materia³, przeĥroczystoġæ • Operowanie teksturami • Zarz¹dzanie obiektami le¿¹cymi na jednej p³aszczyĥnie • Pisanie kodu niezale¿nego od rodzaju karty graficznej Autor zak³ada, ¿e Czytelnik potrafi pos³ugiwaæ siê pakietem Visual C++ i posiada umiejêtnoġæ programowania w tym jêzyku, korzysta z klas MFC, a tak¿e jest zaznajomiony z pojêciami dotycz¹cymi grafiki komputerowej. Jeġli spe³niasz te warunki i chcesz kreowaæ w³asne, trójwymiarowe ġwiaty na ekranie komputera, z pewnoġci¹ pomo¿e Ci w tym ta ksi¹¿ka. Spis treści Wprowadzenie ...................................................n...................................................n........7 Rozdział 1. Aplikacje bazowe ...................................................n.................................11 Szkielet podstawowy ...................................................o...................................................o.......................11 Kreator DirectX AppWizard ...................................................o...................................................o...........14 Rozdział 2. Bufory werteksów...................................................n................................17 .......................17 Prymitywy ...................................................o...................................................o................ FVF...................................................o...................................................o...................... ............................25 Bufory indeksów...................................................o...................................................o..............................30 Dynamiczna zmiana zawartości buforów...................................................o...........................................32 Łączenie buforów ...................................................o...................................................o............................34 Rozdział 3. Obiekt Mesh ...................................................n.........................................37 Obiekty podstawowe ...................................................o...................................................o.......................37 Klasy pomocnicze...................................................o...................................................o............................40 Teselacja ...................................................o...................................................o..........................................41 .............................44 Pliki .x...................................................o...................................................o................. Rozdział 4. Przekształcenia przestrzeni ...................................................n................47 Okno widoku ...................................................o...................................................o...................................47 Macierz świata...................................................o...................................................o.................................48 Macierz widoku ...................................................o...................................................o...............................50 Macierz rzutowania ...................................................o...................................................o.........................53 Kwaterniony ...................................................o...................................................o....................................54 Rozdział 5. Światło i materiał...................................................n.................................59 Ustawienia kolorów...................................................o...................................................o.........................59 Światło kierunkowe ...................................................o...................................................o.........................63 Światło punktowe ...................................................o...................................................o......... ...................64 Światło źródłowe ...................................................o...................................................o.............................65 Wiele źródeł światła ...................................................o...................................................o........................66 Materiał...................................................o...................................................o............................................68 Rozdział 6. Blending werteksów...................................................n.............................71 Tweening ...................................................o...................................................o.........................................71 Macierze deformujące ...................................................o...................................................o.....................76 4 Aplikacje Direct3D Rozdział 7. Alpha Blending ...................................................n....................................83 Rozdział 8. Bufor szablonu ...................................................n.....................................89 Rozdział 9. Tekst...................................................n...................................................n...93 Rozdział 10. Tekstury...................................................n..............................................97 Tekstury płaskie...................................................o...................................................o...............................97 Tekstury otoczenia...................................................o...................................................o.........................100 Dwa etapy łączenia tekstur ...................................................o...............................................................106 Tekstura wichrująca i tekstura obiektu...................................................o.............................................109 Tekstura wichrująca i tekstura otoczenia...................................................o..........................................114 Tekstura obiektu, wichrująca i otoczenia ...................................................o.........................................116 Tekstury przestrzenne...................................................o...................................................o....................117 Dot3 ...................................................o...................................................o..................... ..........................119 Mapy wektorów normalnych i wektorów wichrujących ...................................................o..................122 Rozdział 11. Potoki ...................................................n................................................125 VertexShader ...................................................o...................................................o.................................125 PixelShader...................................................o...................................................o....................................136 Program uruchomieniowy ...................................................o...................................................o.............141 Rozdział 12. Z-bufor...................................................n..............................................143 Rozdział 13. Efekty...................................................n................................................145 Rozdział 14. Płaszczyzny tnące...................................................n.............................153 Rozdział 15. Mgła ...................................................n..................................................155 Rozdział 16. Sprajty ...................................................n..............................................159 Rozdział 17. Punkty...................................................n...............................................163 Rozdział 18. Wygaszacz ekranu ...................................................n...........................167 Rozdział 19. Interakcja ...................................................n.........................................171 Zawartość CD-ROM-u...................................................n..........................................177 Skorowidz...................................................n...................................................n............181 Rozdział 10. Tekstury Tekstury zwiększają realizm renderowanych scen, nadają im specyficzny charakter. Je- śli zachowamy ustawienia konfiguracyjne sceny, a zmienimy teksturę, to możemy uzy- skać ciekawy efekt, np. sceneria zmieni się z polarnej w pustynną. Dynamiczne zmie- nianie tekstur, różne sposoby ich łączenia, wyświetlanie kolejnych klatek tekstur na powierzchni obiektów, a nawet zaburzania współrzędnych tekstur — to zabiegi, które pozwalają wprowadzać coraz to nowe rozwiązania, efezkty. W przykładach przedstawimy różne rodzaje tekstur obsługiwanych przez DirectX oraz sposób ich stosowania. Tekstury płaskie Definicje struktur FVF dla obiektów zawierających teksturę zostały omówione w rozdziale „Bufory werteksów” na przykładzie projektu z katalogu PrimitivesFVFPositionTexCoord. Teraz pokażemy, w jaki sposób przygotować teksturę do zwyświetlenia. W deklaracji klasy /[#RR podajemy wskaźnik do interfejsu obsługującego tekstuzrę: RTKXCVG .2 +4 6 6 :674 OAR6GZVWTG W konstruktorze inicjalizujemy to pole wartością 07... Teksturę można załadować z pliku na kilka sposobów. My przedstawimy dwa z nich: KH (#+.   : TGCVG6GZVWTG(TQO(KNG OARFF GXKEGVGZDOROAR6GZVWTG   TGVWTP A(#+. KH (#+.   7VKNA TGCVG6GZVWTG OARFF GXKEGVGZDOROAR6GZVWTG   TGVWTP A(#+. W slocie 0 ustawiamy teksturę jako aktywną, wykorzysztywaną do renderingu: OARFF GXKEG 5GV6GZVWTG OAR6GZVWTG  Obiekty, które posiadają współrzędne u i v, będą wykorzystywały tę teksturę. Na koniec należy pamiętać o zwolnieniu zasobów tekstury: 5#( A4 . #5 OAR6GZVWTG  98 Aplikacje Direct3D Kolejnym krokiem będzie dynamiczna zmiana współrzędnych u i v tekstury. Projekt z kata- logu TextureTexRotate (rysunki 10.1a i 10.1b) implementuje obrót współrzędnych tekstury wokół osi Z:  :/#64+:OCV  :/CVTKZ4QVCVKQP OCVUKPH OAH6KOG  Rysunek 10.1a. Obrót współrzędnych tekstury wokół osi Z Rysunek 10.1b. Obrót współrzędnych tekstury wokół osi Z Macierz obrotu wokół osi Z jest umieszczana w zmiennejz OCV. Macierz obrotów wykorzystujemy do zmiany współrzędnych tekstury. W metodzie (TCOG /QXG blokujemy bufory werteksów i uaktualniamy pozycje u i v tekstury:  :8 614X (8 46 : R8GTVKEGU Rozdział 10.  Tekstury 99 KH 57 OAR8$ .QEM  UKGQH (8 46 :  $;6 R8GTVKEGU   ] R8GTVKEGU=?WX  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WX  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WX  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WX  :8GE6TCPUHQTO QQTF XOAXOCV  _ OAR8$ 7PNQEM  Funkcja  :8GE6TCPUHQTO QQTF przekształca wektor dwuelementowy, określony w dru- gim argumencie, przez macierz OCV. W przykładzie z katalogu TextureTexTranslate wykorzystaliśmy inną macierz prze- kształcenia współrzędnych. Jest to macierz translacjiz:  :/CVTKZ6TCPUNCVKQP OCVH UKPH H OAH6KOG H EQUH H OAH6KOG H  Rysunki 10.2a i 10.2b przedstawiają teksturę przemieszczazną na powierzchni obiektu. Rysunek 10.2a. Przemieszczanie tekstury na powierzchni obiektu W projekcie TextureTexAnim wykorzystaliśmy sekwencyjną zmianę tekstury. Kolejna tekstura jest wyświetlana z częstością trzydziestu klatek na sekundę, co sprawia wrażenie animacji tekstury na powierzchni obiektu. Dodatkowo tekstura jest przemieszczana. De- finiujemy tablicę tekstur: RTKXCVG .2 +4 6 6 :674 OAR6GZVWTGU=07/A6 :674 5? W tablicy tej będą przechowywane kolejne klatki tekstury. Inicjalizujemy wartością 07.. wszystkie tekstury: HQT KPVKK07/A6 :674 5K OAR6GZVWTGU=K?07.. 100 Aplikacje Direct3D Rysunek 10.2b. Przemieszczanie tekstury na powierzchni obiektu Pamiętamy o zwolnieniu zasobów zajmowanych przez teksztury: HQT KPVKK07/A6 :674 5K 5#( A4 . #5 OAR6GZVWTGU=K?  Ładujemy wszystkie tekstury z plików do tablicy: KH (#+.   : TGCVG6GZVWTG(TQO(KNG OARFF GXKEGVGZDOROAR6GZVWTGU=?   TGVWTP A(#+.  KH (#+.   : TGCVG6GZVWTG(TQO(KNG OARFF GXKEGVGZDOROAR6GZVWTGU=?   TGVWTP A(#+. Zanim rozpoczniemy renderowanie, wybieramy teksturę, która ma być wykorzystana i umieszczamy ją w slocie 0: OARFF GXKEG 5GV6GZVWTG OAR6GZVWTGU=OAP#EVKXG6GZVWTG?  Rysunek 10.3a przedstawia sekwencję animacji, którą uzyskaliśmy. Rysunek 10.3b poka- zuje pierwszą bitmapę, a rysunek 10.3c — piątą z sekwencji dziesięciu klatek. W analizowanych przykładach tekstury zostały umieszczone na czworokątach, lecz nic nie stoi na przeszkodzie, by animować tekstury na powierzchni złożonych obiektów trójwymiarowych. Tekstury otoczenia Współrzędne tekstury mogą być wygenerowane automatycznie, nie jest konieczne po- dawanie ich wartości w strukturach werteksów. Powstaje wtedy efekt odbijania się tek- stury na obiekcie, nazywany mapowaniem otoczenia (Environment Mapping). W podanych przykładach pokażemy sposób wykorzystania mzapowania. Rozdział 10.  Tekstury 101 Rysunek 10.3a. Wynik wyświetlania sekwencji tekstur na powierzchni obiektu Rysunek 10.3b. Pierwsza klatka animowanej tekstury Rysunek 10.3c. Piąta klatka animowanej tekstury Przykład (z katalogu TextureEnvMapping1) mapowania otoczenia został przedstawio- ny na rysunku 10.4a. Teksturę otoczenia pokazuje rysuznek 10.4b. Aby otrzymać taki efekt, należy wprowadzić w kodzie: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 64#05(14/(..#)5  66((A 1706  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 :  655A6 +A #/ 4#52# 014/#.  Flaga  655A6 : 114 +0 : informuje urządzenie o sposobie generowania współrzęd- nych tekstury (wybrane  655A6 +A #/ 4#52# 014/#.), zaś flaga  655A6 :674  64#05(14/(.#)5 informuje o liczbie współrzędnych tekstury, przekazywanych do urządze- nia renderującego. W tym przypadku są to dwie współrzędne u i v (  66((A 1706). Usta- wienia te wykonano dla poziomu 0 (pierwszy argument powyższych funkcji). Dodatkowo ustawiamy macierz przekształcenia współrzędnych tekstzury: 102 Aplikacje Direct3D Rysunek 10.4a. Tekstura powstała w wyniku mapowania otoczenia (generowanie współrzędnych tekstury — flaga D3DTSS_TCI_ CAMERASPACENORMAL). Do urządzenia przekazywane są dwie współrzędne tekstury Rysunek 10.4b. Tekstura otoczenia  :/#64+:OCV OCVAHOCVAHOCVAHOCVAH OCVAHOCVAHOCVAHOCVAH OCVAHOCVAHOCVAHOCVAH OCVAHOCVAHOCVAHOCVAH OARFF GXKEG 5GV6TCPUHQTO   65A6 :674 OCV  Zmieniając dynamicznie wartości tej macierzy, można także uzyskać efekt przemieszcza- nia się tekstury na powierzchni obiektu (np. odbijanie się otoczenia w szybie poruszającego się samochodu). Flaga  65A6 :674  oznacza, że ustawiana jest macierz przekształ- cająca teksturę dla poziomu 0. Rozdział 10.  Tekstury 103 Do urządzenia można przekazać trzy współrzędne, wartość dwóch pierwszych zostanie obliczona przez podzielenie ich przez wartość trzeciej współrzędnej. W efekcie końco- wym uzyskamy tylko dwie współrzędne do pobierania koloru z tekstury dwuwymiaro- wej. W tym przypadku ustawienia wyglądają tak: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 64#05(14/(..#)5  66((A 1706 ^  66((A241, 6  Jest to jedyna różnica w porównaniu do poprzedniego projektu. Efekt tego typu mapo- wania przedstawia rysunek 10.5a (projekt z katalogu TextureEnvMapping1p). Na ry- sunku 10.5b przedstawiono teksturę otoczenia. Mapowanie, w którym zastosowano flagi  66((A241, 6 , pomaga wyeliminować błędy, jakie powstają na powierzchni obiektów w kierunku osi Z (tekstura nie jest nałożona, lecz rozciągnięta). Rysunek 10.5a. Mapowanie tekstury otoczenia na obiekt (generowanie współrzędnych tekstury — flaga D3DTSS_TCI_ CAMERASPACENORMAL). Do urządzenia przekazywane są trzy współrzędne tekstury Rysunek 10.5b. Tekstura otoczenia 104 Aplikacje Direct3D Jeśli zastosujemy flagę  655A6 +A #/ 4#52# 215+6+10, to otrzymamy inny tryb gene- rowania współrzędnych tekstury. Ustawiamy wtedy: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 64#05(14/(..#)5  66((A 1706  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 :  655A6 +A #/ 4#52# 215+6+10  W tym przypadku będą również wykorzystane tylko dwie współrzędne tekstury. Wynik ma- powania oraz teksturę otoczenia przedstawiają kolejno rysunek 10.6a i b (projekt z ka- talogu TextureEnvMapping2). Rysunek 10.6a. Mapowanie tekstury otoczenia na obiekt (generowanie współrzędnych tekstury — flaga D3DTSS_TCI_ CAMERASPACEPOSITION). Do urządzenia przekazywane są dwie współrzędne tekstury Rysunek 10.6a. Tekstura otoczenia Ten sam zabieg mapowania, ale dla flagi  66((A241, 6 przedstawia rysunek 10.7 (projekt z katalogu TextureEnvMapping2p). Tryb generowania współrzędnych tekstury  655A6 +A #/ 4#52# 4 (. 6+108 614 sto- sujemy w przypadku tekstur typu sześciennego. Ustawienia są wtedy następujące: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 64#05(14/(..#)5  66((A 1706  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 : . 655A6 +A #/ 4#52# 4 (. 6+108 614  Rozdział 10.  Tekstury 105 Rysunek 10.7. Mapowanie tekstury otoczenia na obiekt (generowanie współrzędnych tekstury — flaga D3DTSS_TCI_ CAMERASPACEPOSITION). Do urządzenia przekazywane są trzy współrzędne tekstury W tym przypadku generowane są trzy współrzędne, które są przekazywane do urządzenia w celu indeksowania tekstury. Sposób generowania wektora odbicia, który właśnie służy do indeksowanie tekstury, może być modyfikowany za pomocą flagi  45A.1 #.8+ 9 4, która przyjmuje wartości typu $11.. Projekt (TextureEnvMapCube) przedstawia zastosowanie mapowania sześciennego. Tekstura ma postać sześcianu, na którego każdą ścianę można nałożyć inną płaską tek- sturę otoczenia. Definiujemy teksturę sześcienną: RTKXCVG .2 +4 6 7$ 6 :674 OAR6GZVWTG WDG Inicjalizujemy ją wartością 07.. w konstruktorze: OAR6GZVWTG WDG07.. Ładujemy z pliku .dds przygotowaną wcześniej teksturę sześcienną: KH (#+.   : TGCVG WDG6GZVWTG(TQO(KNG OARFF GXKEGVGZFFUOAR6GZVWTG WDG   TGVWTP A(#+. Tekstura została tak przygotowana, aby każda ściana była innego koloru. Efekt nałożenia jej na obiekt jest więc widoczny (rysunek 10.8). Tekstury .dds można wykonać w programie DxTex.exe z pakietu SDK 8.1. Ustawiamy tę teksturę jako aktywną w slocie 0: OARFF GXKEG 5GV6GZVWTG OAR6GZVWTG WDG  I dopiero teraz można wykonać rendering obiektu. Na koniec należy zwolnić zasoby tekstury. 5#( A4 . #5 OAR6GZVWTG WDG  106 Aplikacje Direct3D Rysunek 10.8. Mapowanie tekstury otoczenia na obiekt (generowanie współrzędnych tekstury — flaga D3DTSS_TCI_ CAMERASPACERE- FLECTIONVECTOR). Do urządzenia przekazywane są trzy współrzędne tekstury Przed rozpoczęciem działania aplikacja musi się upewnić, czy urządzenie obsługuje ten rodzaj tekstur: KH  R CRU 6GZVWTG CRU  26 :674 #25A 7$ /#2  TGVWTP A(#+. W bardziej skomplikowanym przykładzie można na teksturę otoczenia renderować obiekty zdefiniowanej sceny, a następnie wykorzystać tak przygotowaną teksturę do rysowania obiektów zapisywanych w buforze obrazu. Otrzymamy efekt wzajemnego odbijania się obiektów na swoich powierzchniach. Dwa etapy łączenia tekstur Jeden werteks może posiadać informacje o współrzędnych dla ośmiu tekstur. W tym pod- rozdziale przedstawimy sposób łączenia tekstur w dwóch etapach (dla dwóch tekstur). Każdy werteks będzie zawierał współrzędne dla dwóch teksztur WX i WX: UVTWEV (8 46 : ] (.1#6Z[   :8 614WX   :8 614WX _ Definicja FVF dla takiej struktury przybiera postać: FGHKPG  (8(A (8 46 :  (8(A:; ^  (8(A6 :^  (8(A6 : .114 5+   ^  (8(A 6 : 114 5+   Makro  (8(A6 : 114 5+  Z oznacza, że tekstura o indeksie x ma dwa parametry u i v. Tekstury ładujemy z plików i ustawiamy w odpowiedniczh slotach 0 i 1: OARFF GXKEG 5GV6GZVWTG OAR6GZVWTGU=OAP#EVKXG6GZVWTG?  OARFF GXKEG 5GV6GZVWTG OAR6GZVWTG  Rozdział 10.  Tekstury 107 Tekstura w slocie zerowym będzie się zmieniała, dlatego wybieramy z tablicy jedną z tek- stur (będą wyświetlane sekwencyjnie — animacja). Teraz wprowadzamy informacje na temat tego, co będzie się działo z teksturą w danym zslocie. Dla etapu 0: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 :  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14#4)  6#A6. :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.1412  612A.5 . 6#4)  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14#4)  6#A .+((75  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#12  612.A +5#$.  Flaga  655A6 : 114 +0 : ustawia indeks informujący, które współrzędne tekstury są przeznaczone dla tej tekstury w strukturze werteksa (indeks 0 to WX). Flaga  655A 1.1412 oznacza rodzaj operacji dla kolorów rgb, a flaga  655A#.2*#12 — operację dla kanału alfa. Flagi  655A 1.14#4) i  655A 1.14#4) oznaczają odpowiednio argumenty dla określonej operacji rgb. Operacja  612A5 . 6#4) to wybór argumentu pierwszego  6#A6 :674 , który oznacza teksturę. Argument drugi  6#A +((75 , oznaczający ko- lor, jest ignorowany. Dla kanału alfa operacja jest wyłączona  612A +5#$. . Wynikowe wartości są przekazywane do kolejnego slotu. W drugim etapie jako pierwszy argument wybieramy teksturę ze slotu 1 (  6#A6 :674 ) oraz jako drugi argument wynik poprzedniej operacjiz (  6#A 744 06) ze slotu 0:  6 :674 12OAG6GZ1R OAG6GZ1R  612A/1 7.#6   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 : . OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14#4)  6#A6. :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.1412OAG6GZ.1R  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14#4)  6#A .744 06  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#12  612.A +5#$.  Parametr wyliczeniowy OAG6GZ1R jest jedną z dostępnych operacji łączenia tekstur: Operacja Testowana flaga D3DTEXOPCAPS Opis  612A +5#$.  6 :12 #25A +5#$. wyłączenie  612A5 . 6#4)  6 :12 #25A5 . 6#4)  612A5 . 6#4)  6 :12 #25A5 . 6#4)  612A/1 7.#6  6 :12 #25A/1 7.#6  612A/1 7.#6 :  6 :12 #25A/1 7.#6 :  612A/1 7.#6 :  6 :12 #25A/1 7.#6 :  612A#  6 :12 #25A#  612A# 5+)0  6 :12 #25A# 5+)0  612A# 5+)0 :  6 :12 #25A# 5+)0 :  612A57$64# 6  6 :12 #25A57$64# 6  612A# 5/116*  6 :12 #25A# 5/116* wybór pierwszego argumentu wybór drugiego argumentu 1 Arg 2 Arg ⋅ ( Arg 1 ⋅ Arg 2 ( Arg 1 ⋅ Arg 2 Arg + 1 Arg 2 ) 2 ⋅ ) 4 ⋅ 1 Arg ( Arg + Arg 2 − 5.0 + Arg 2 − ) 25.0 ⋅ 1 Arg − 1 Arg 2 Arg 1 + Arg 2 ( 1 Arg −⋅ 1 ) 108 Aplikacje Direct3D Typ wyliczeniowy  6 :674 12 obejmuje znacznie większą liczbę operacji. W tabeli zo- stały podane tylko te, które zostały wykorzystane w opisywanej implementacji. W trzecim etapie nie będziemy wykonywali żadnych operzacji, więc wywołujemy funkcje: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12  612A +5#$.   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#E12  612A +5#$.   Sprawdzamy, czy urządzenie wykonuje określoną operazcję: KH OAFF CRU6GZVWTG1R CRU  6 :12 #25A/1 7.#6 : R$ PCDNG9KPFQY 647  GNUG R$ PCDNG9KPFQY (#.5  Należy także sprawdzić, czy są dostępne dwa sloty: KH R CRU /CZ6GZVWTG$NGPF5VCIGU D CRU#EEGRVCDNG(#.5  Przykład z katalogu TextureTexOp to aplikacja MFC, która pozwala przetestować wy- brane sposoby łączenia tekstur (rysunek 10.9a). Rysunek 10.9b pokazuje pierwszą tek- sturę z sekwencji dziesięciu tekstur, a rysunek 10.9cz — piątą. Rysunek 10.9a. Aplikacja MFC — różne sposoby łączenia tekstur Rysunek 10.9b. Pierwsza klatka animowanej tekstury Rozdział 10.  Tekstury 109 Rysunek 10.9c. Piąta klatka animowanej tekstury Różne tekstury można wykorzystać do symulowania oświetlania obiektów światłem mo- nochromatycznym lub wielobarwnym. Tekstura wichrująca i tekstura obiektu W tym podrozdziale przedstawimy zastosowanie tekstury wichrującej w slocie 0 oraz tek- stury obiektu w slocie 1. Tekstura wichrująca (Bump Texture) imituje nierówności po- wierzchni obiektów. W zależności od formatu tekstura wichrująca może nie tylko mo- dyfikować współrzędne tekstury obiektu, ale i regulowazć jasność pikseli. Przykład z katalogu TextureTexBumpTranslate pokazuje, jak oddziałuje tekstura wi- chrująca na teksturę obiektu (rysunek 10.10a). Dla porównania tekstura obiektu została przedstawiona na rysunku 10.10b. Na statycznych obrazach widać wyraźnie efekt, kiedy obserwuje się wieżę i dach (na lewo od wieży). Podczas dynamicznego działania progra- mu jest to łatwiejsze do zauważenia. Rysunek 10.10a. Tekstura obiektu modyfikowana przez teksturę wichrującą Tekstura wichrująca jest przemieszczana w poziomie,z co daje efekt falowania powierzchni obiektu. Oto operacje, które należy wykonać, jeśli chczemy zastosować teksturę wichrującą. 110 Aplikacje Direct3D Rysunek 10.10b. Tekstura obiektu Najpierw sprawdzamy, czy urządzenie obsługuje BumpMapping za pomocą flagi  6 :12 #25A$7/2 08/#2 oraz czy obsługuje określony format tekstury wichrującej  (/6A87: KH  R CRU 6GZVWTG1R CRU  6 :12 #25A$7/2 08/#2 TGVWTP A(#+. KH (#+. OAR   JGEM GXKEG(QTOCV R CRU #FCRVGT1TFKPCN R CRU GXKEG6[RG(QTOCV  46;2 A6 :674   (/6A87   TGVWTP A(#+. Ładujemy teksturę obiektu i umieszczamy ją w slocie 1. Załadowana tekstura wichrująca jest przekształcana, zapisywana w formacie V8U8 i umiezszczana w slocie 0: KH (#+.   : TGCVG6GZVWTG(TQO(KNG OARFF GXKEGVGZDOROAR6GZVWTG TGVWTP A(#+. OARFF GXKEG 5GV6GZVWTG OAR6GZVWTG  KH (#+. .QCF$WOR6GZVWTG(TQO(KNG VGZDOROAR6GZVWTG$WOR TGVWTP A(#+. OARFF GXKEG 5GV6GZVWTG OAR6GZVWTG$WOR  Tak wygląda kod funkcji, za pomocą której zamienia się format bitmapy z A8R8G8B8 na V8U8: Rozdział 10.  Tekstury 111 *4 57.6 /[#RR.QCF$WOR6GZVWTG(TQO(KNG 6 *#4 UVT6GZVWTG.2 +4 6 6 :674  RR6GZVWTG ] .2 +4 6 6 :674 R6GZVWTG KH (#+.   : TGCVG6GZVWTG(TQO(KNG OARFF GXKEGUVT6GZVWTGR6GZVWTG   ] 5#( A4 . #5 R6GZVWTG  TGVWTP A(#+. _   574(# A 5 R GUE KH (#+. R6GZVWTG )GV.GXGN GUE R GUE ] 5#( A4 . #5 R6GZVWTG  TGVWTP A(#+. _ KH (#+. OARFF GXKEG TGCVG6GZVWTG R GUE9KFVJR GUE*GKIJV  (/6A87  211.A/#0#) RR6GZVWTG   ] 5#( A4 . #5 R6GZVWTG  TGVWTP A(#+. _   .1 - A4 6NQEMTGEV R6GZVWTG .QEM4GEV NQEMTGEV   914 FY5TE2KVEJ 914 NQEMTGEV2KVEJ $;6 R5TE$KVU $;6 NQEMTGEVR$KVU  RR6GZVWTG  .QEM4GEV NQEMTGEV   914 FY GUV2KVEJ 914 NQEMTGEV2KVEJ $;6 R GUV$KVU $;6 NQEMTGEVR$KVU HQT  914 [[R GUE*GKIJV[  ] HQT  914 ZZR GUE9KFVJZ  ]  R GUV$KVU  Z   R5TE$KVU  Z  XI  R GUV$KVU  Z  R5TE$KVU  Z  WT _ R GUV$KVU FY GUV2KVEJ R5TE$KVU FY5TE2KVEJ _ R6GZVWTG 7PNQEM4GEV    RR6GZVWTG  7PNQEM4GEV   5#( A4 . #5 R6GZVWTG  TGVWTP5A1- _ 112 Aplikacje Direct3D Bajty odpowiadające kolorom są umieszczane w pamięci w następującej kolejności: B, G, R, A, B1, G1, R1, A1, B2, G2, R2, A2... Podobnie umieszczane są bajty odpowiadające parametrom wichrującym: dU, dV, dU1, dV1, dU2, dV2...Wartości dU i dV z przedziału 〈−128,127〉 odpowiadają parametrom wichrującym z przedziału od –1 do 1. Parametr dU odnosi się do kierunku X, zaś parametr dV do kierunku Y. Funkcja )GV.GXGN GUE zwraca w strukturze  574(# A 5 parametry tekstury wejściowej. Wykorzystujemy wysokość i szerokość tekstury załadowanej z pliku do utworzenia tekstury o tych samych wymiarach ( TGCVG6GZVWTG). Obydwie tekstury blokujemy funkcją .QEM4GEV, aby można było prze- pisać dane. Odpowiednio przepisujemy kolor czerwony do dU i kolor zielony do dV. Po zakończeniu operacji blokady są zwalniane (7PNQEM4GEV). Ustawiamy parametry macierzy 2×2 przekształcającej wartości dU i dV: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08/#6(.1#6VQ 9 H  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08/#6(.1#6VQ 9 H  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08/#6(.1#6VQ 9 H  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08/#6(.1#6VQ 9 H  Nowe współrzędne tekstury obliczane są według wzorów: Ud =′ MdU ⋅ Vd =′ MdU ⋅ + MdV ⋅ 10 + MdV ⋅ 11 00 01 gdzie M00, M01, M10, M11 są parametrami ustawionej poprzednio macierzy 2×2. Stosujemy operacje tekstury wichrującej dla slotu 0: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12  612A$7/2 08/#2  Na koniec można wykonać rendering. Rysunek 10.11 przedstawia teksturę wichrującą zastosowaną w przykładzie. Rysunek 10.11. Przykładowa tekstura wichrująca (format V8U8) Przykład z katalogu TextureTexBumpLTranslate dotyczy sposobu wykorzystania tek- stury wichrującej z luminancją o formacie L6V5U5 (rysunezk 10.12). Sprawdzamy, czy urządzenie obsługuje BumpMapping z luminancją (flaga  612A $7/2 08/#2.7/+0#0 ) oraz czy obsługuje określony format tekstury wichrującej  (/6A .87: Rozdział 10.  Tekstury 113 Rysunek 10.12. Zastosowanie tekstury wichrującej z luminancją KH  R CRU 6GZVWTG1R CRU  612A$7/2 08/#2.7/+0#0  TGVWTP A(#+. KH (#+. OAR   JGEM GXKEG(QTOCV R CRU #FCRVGT1TFKPCN R CRU GXKEG6[RG(QTOCV  46;2 A6 :674   (/6A.87   TGVWTP A(#+. Dane dla tekstury wichrującej ładujemy z pliku za pomocą przygotowanej wcześniej funkcji .QCF$WOR6GZVWTG(TQO(KNG. W kolorze czerwonym jest przechowywana wartość dU, w kolorze zielonym — dV, a w niebieskim — wartość luminancji. Dane te są zapisywane za pomocą 16 bitów, tak że 6 bitów jest przeznaczonych dla luminancji, 5 bitów — dla dU i 5 bitów — dla dV. Należy pamiętać, że w komputerach PC bity są ułożenie według zasady Little-Endian (tzn. młodszy bajt znajduje się przed starszym). Część kodu odpowiedzial- nego za pakowanie bitów w funkcji .QCF$WOR6GZVWTG(TQO(KNG wygląda w ten sposób: FGHKPG2# -$+65 NFXFW 914 N  ZH  ^ FX  ZEH  ^ FW  ZH  FW R5TE$KVU  Z  T FX R5TE$KVU  Z  I NWOKP R5TE$KVU  Z D 914 R GUV$KVU  Z 2# -$+65 NWOKPFXFW  Pozostała część kodu funkcji .QCF$WOR6GZVWTG(TQO(KNG jest taka sama jak w funkcji oma- wianej przy okazji projektu TextureTexBumpTranslate. Wartości luminancji odpowiadają poziomom 0 – 255. Teksturę wichrującą z luminancją przedstawia rysunek 10.13. Zanim przeprowadzimy renderowanie obiektu, tekstura wichrująca z luminancją wymaga dwóch dodatkowych parametrów: współczynnika skalowania (flaga  655A$7/2 08.5 #. ) i offsetu (flaga  655A$7/2 08.1((5 6) dla luminancji: 114 Aplikacje Direct3D Rysunek 10.13. Przykładowa tekstura wichrująca z luminancją (format L6V5U5) OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08.5 #. (.1#6VQ 9 H  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A$7/2 08.1((5 6(.1#6VQ 9 H  Natężenie piksela w tym przypadku jest obliczane wedłuzg wzoru: L ⋅=′ OSL L + L gdzie: L’ — luminancja wyjściowa, L — luminancja pobrana z tekstury wichrującej, SL — współczynnik skalujący, OL — offset. W slocie 0 należy jeszcze zaznaczyć, że wykorzystywanaz jest tekstura z luminancją: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.1412E  612A$7/2 08/#2.7/+0#0  i można wykonać rendering. Tekstura wichrująca i tekstura otoczenia Przykłady z poprzedniego podrozdziału zmodyfikujemy w ten sposób, że zamiast tek- stury obiektu będzie stosowana tekstura otoczenia. W slocie 0 pozostaje tekstura wi- chrująca, a w slocie 1 znajdzie się tekstura otoczenia. Należy ustawić urządzenie, aby generowało automatycznie współrzędne dla tekstury o izndeksie 1: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 6E4#05(14/(.#)5  66((A 1706^  66((A241, 6  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  655A6 +A #/ 4#52# 014/#.^  Struktura FVF zawiera teraz tylko jedną parę współrzędnych (dla tekstury wichrującej). Przykład z katalogu TextureEnvMappingBump1p pokazuje wynik działania tekstury wi- chrującej i otoczenia (rysunek 10.14). Rozdział 10.  Tekstury 115 Rysunek 10.14. Połączenie tekstury wichrującej i tekstury otoczenia (generowanie współrzędnych tekstury otoczenia — flaga D3DTSS_TCI_CAMERAS PACENORMAL). Do urządzenia przekazywane są trzy współrzędne tekstury otoczenia Przykład z katalogu TextureEnvMappingBump2 dotyczy następujących parametrów tek- stury otoczenia (rysunek 10.15): OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 6E4#05(14/(.#)5  66((A 1706  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  655A6 +A #/ 4#52# 215+6+10^  Rysunek 10.15. Połączenie tekstury wichrującej i tekstury otoczenia (generowanie współrzędnych tekstury otoczenia — flaga D3DTSS_TCI_CAMERAS PACEPOSITION). Do urządzenia przekazywane są dwie współrzędne tekstury otoczenia zaś przykład z katalogu TextureEnvMappingBump2p dotyczy parametrów (rysunek 10.16): OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 6E4#05(14/(.#)5  66((A 1706^  66((A241, 6  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  655A6 +A #/ 4#52# 215+6+10^  116 Aplikacje Direct3D Rysunek 10.16. Połączenie tekstury wichrującej i tekstury otoczenia (generowanie współrzędnych tekstury otoczenia — flaga D3DTSS_TCI_CAMERAS PACEPOSITION). Do urządzenia przekazywane są trzy współrzędne tekstury otoczenia Tekstura obiektu, wichrująca i otoczenia Łączenie trzech tekstur wymaga trzech slotów. Sprawdzzamy, czy są one dostępne: KH R CRU /CZ6GZVWTG$NGPF5VCIGU TGVWTP A(#+. W slocie 0 umieszczamy teksturę obiektu, w slocie 1 — teksturę wichrującą, a w slocie 2 — teksturę otoczenia. Wprowadzamy następujące ustawizenia we wszystkich trzech slotach: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12  612A/1 7.#6   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A +((75   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#12  612A5 . 6#4)  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*##E4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12  612A$7/2 08/#2  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A 744 06  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#1E2  612A5 . 6#4)  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*##4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12OAG6GZ1R  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A 744 06  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#E12  612A +5#$.   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 :674 E64#05(14/(.#)5  66((A 1706^  66((A241, 6  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 11E4 +0 :  655A6 +A #/ 4#52# 215+6+10^  Rozdział 10.  Tekstury 117 W slocie 2 wprowadziliśmy zmienną OAG6GZ1R, aby można było zmieniać operację łącze- nia tekstur. Projekt z katalogu TextureTexEnvMapBump, przedstawiony na rysunku 10.17, umożliwia podglądanie łączenia trzech tekstur. Użytkownik może wybrać jedną z dziewię- ciu tekstur (trzy możliwości dla tekstury obiektu, trzy dla tekstury otoczenia i trzy dla tek- stury wichrowania). Przełączniki trybu łączenia tekstur zmieniają operacje w slocie 2. Rysunek 10.17. Aplikacja MFC pozwala wybrać dowolną teksturę otoczenia, wichrującą, obiektu oraz sposób łączenia tekstur Tekstury przestrzenne Teksturę przestrzenna (Volume Map) tworzymy przez dodanie trzeciej współrzędnej do pła- skiej tekstury. Otrzymamy wtedy prostopadłościan o określonej szerokości, wysokości i głębokości. Elementem jednostkowym takiej figury jest teksel. Tekstury przestrzenne znajdują zastosowanie w medycynie, są wykorzystywane do przedstawiania kolejnych przekrojów, np. głowy. Taki obraz przestrzenny można ozglądać pod dowolnym kątem. W przykładzie z katalogu TextureTexVolume bryłę przestrzenną tekstury wypełniamy ko- lorami i będziemy ją wyświetlali, zmieniając trzecią współrzędną tekstury. Sprawdzamy, czy urządzenie obsługuje tekstury przestrzenne: KH  R CRU 6GZVWTG CRU  26 :674 #25A81.7/ /#2  TGVWTP A(#+. Struktura werteksa z trzema współrzędnymi tekstury W, X i Y wygląda w ten sposób: UVTWEV (8 46 : ] (.1#6Z[ (.1#6WXY _ Deklaracja FVF ma postać: FGHKPG  (8(A (8 46 :  (8(A:; ^  (8(A6 :^  (8(A6 : 114 5+   118 Aplikacje Direct3D Deklarujemy wskaźnik do struktury tekstury przestrzeznnej: RTKXCVG .2 +4 6 81.7/ 6 :674 OAR6GZVWTG i inicjalizujemy w konstruktorze wartością 07... Na końcu działania aplikacji zwalniamy zasoby interfejsu tekstury: 5#( A4 . #5 OAR6GZVWTG  Korzystając z funkcji TGCVG8QNWOG6GZVWTG, tworzymy teksturę przestrzenną: KH (#+. OARFF GXKEG TGCVG8QNWOG6GZVWTG   (/6A#4)$  211.A/#0#) OAR6GZVWTG TGVWTP A(#+. Funkcja ta utworzy teksturę o wymiarach 16×16×16 i formacie  (/6A#4)$. Wypeł- niamy teksturę, korzystając z wywołania funkcji: KH (#+.  :(KNN8QNWOG6GZVWTG OAR6GZVWTG(KNN/[6GZVWTG8QNWOG07.. TGVWTP A(#+. Drugim argumentem jest zdefiniowana wcześniej przez programistę funkcja wypełniająca teksturę. Oto przykład implementacji takiej funkcji: 81+ (KNN/[6GZVWTG8QNWOG  :8 614 R1WV  :8 614 R6GZ QQTFE  :8 614 R6GZGN5KG .281+ R CVC ] R1WV ZR6GZ QQTF Z R1WV [R6GZ QQTF [ R1WV R6GZ QQTF  _ Funkcja ta w pierwszym parametrze zawiera strukturę tekstury rgba do wypełnienia, o współrzędnej tekstury określonej w drugim parametrze. Trzeci parametr to wielkość teksela, czwarty to wartość, którą przekazał programista w trzecim parametrze wywołania funkcji  :(KNN8QNWOG6GZVWTG. W tym przypadku będzie to 07... Przykład przepisuje pozycje w teksturze do wartości kolorów. Ustawiamy teksturę w slocie 0. W metodzie (TCOG/QXG zmieniamy współrzędną w, w efek- cie wyświetlane będą kolejne przekroje tekstury na czworokącie: (8 46 : R8GTVKEGU KH 57 OAR8$ .QEM  UKGQH (8 46 :  $;6 R8GTVKEGU   ] HQT KPVKKK  R8GTVKEGU=K?YOAH6KOG OAR8$ 7PNQEM  _ Wynik działania programu przedstawia rysunek 10.18. W projekcie z katalogu TextureTexVolume1 zastosowaliśmy rotację współrzędnych tek- stury, tak że na czworokącie wyświetlane są różne przekroje tekstury przestrzennej. Kod pokazuje, jak zmieniają się współrzędne tekstury: Rozdział 10.  Tekstury 119 Rysunek 10.18. Na powierzchni obiektu wyświetlana jest tekstura o wymiarach 16×16×16, ze zmienną współrzędną w  :/#64+:OCV4QVOCV  :37#6 40+10S  :8 614X1WV  :/CVTKZ4QVCVKQP;CY2KVEJ4QNN OCV4QVOAH6KOG HOAH6KOGH   :/CVTKZ#HHKPG6TCPUHQTOCVKQP OCVH  :8 614 HHH   :3WCVGTPKQP4QVCVKQP/CVTKZ SOCV4QV   :8 614 HHH   :8 614X (8 46 : R8GTVKEGU KH 57 OAR8$ .QEM  UKGQH (8 46 :  $;6 R8GTVKEGU   ] R8GTVKEGU=?WXY  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WXY  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WXY  :8GE6TCPUHQTO QQTF XOAXOCV  R8GTVKEGU=?WXY  :8GE6TCPUHQTO QQTF XOAXOCV  _ Funkcja  :8GE6TCPUHQTO QQTF przekształca wektor trzyelementowy, określony w dru- gim argumencie, przez uprzednio przygotowaną macierz OCV. Rysunek 10.19 przedstawia wynik działania programu. Dot3 Natężenie oświetlenia Lambertowskiego danego punktu obliczamy przez iloczyn skalarny wektora normalnego i wektora w kierunku światła. Jeżeli dana powierzchnia ma teksturę, która zamiast wartości rgb ma współrzędne xyz wektora normalnego powierzchni i znamy pozycję światła (x, y, z), to możemy obliczyć mapę oświetlenia powierzchni. Przykład TextureTexDot3 pokazuje, jak to zrobić. Ładujemy teksturę zawierającą wektory nor- malne (rysunek 10.20a) i zwykłą teksturę (rysunek 10.20b), dla której zostały utworzone wektory normalne. 120 Aplikacje Direct3D Rysunek 10.19. Na powierzchni obiektu wyświetlana jest tekstura o wymiarach 16×16×16, ze zmiennymi współrzędnymi u, v i w Rysunek 10.20a. Tekstura zawierająca wektory normalne Sprawdzamy, czy urządzenie obsługuje operacje  6 :12 #25A 16241 7 6: KH  R CRU 6GZVWTG1R CRU  6 :12 #25A 16241 7 6 TGVWTP A(#+. W slocie 1 umieszczamy teksturę obiektu, która będzie łączona z teksturą wynikową oświe- tlenia ze slotu 0: OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114 +0 :  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E12  612A 16241 7 6  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6(# 614  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#1E2  612A +5#$.   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A6 : 114E +0 :  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A6 :674   OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.1412OAG6GZ1R  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A 1.14E#4)  6#A 744 06  OARFF GXKEG 5GV6GZVWTG5VCIG5VCVG   655A#.2*#1E2  612A +5#$.  Rozdział 10.  Tekstury 121 Rysunek 10.20b. Tekstura źródłowa dla tekstury z wektorami normalnymi W slocie 0 została umieszczona tekstura z wektorami normalnymi oraz zastosowana ope- racja  612A 16241 7 6. Flaga  6#A6(# 614 oznacza, że drugim argumentem jest wektor wskazujący kierunek świecenia światła. Zanim rozpoczniemy renderowanie, ustawiamy jeszcze ten współczynnik (flaga  45A6 :674 (# 614): 914 T 914 H X.KIJVZ H  914 I 914 H X.KIJV[ H  914 D 914 H X.KIJV H  914 FY(CEVQT T.   I.  D OARFF GXKEG 5GV4GPFGT5VCVG   45A6 :674 (# 614FY(CEVQT  Współczynnik ten jest zmienny w czasie, co oznacza przemieszczanie się światła. Wynik działania programu przedstawia rysunek 10.21. Użytkownik może dobrać za pomocą jed- nego z przełączników z okna dialogowego operację łączenia mapy oświetlenia z tekstu- rą obiektu. Rysunek 10.21. Wykorzystanie tekstury z wektorami normalnymi 122 Aplikacje Direct3D Mapy wektorów normalnych i wektorów wichrujących Teraz zajmiemy się sposobem generowania tekstur z wektorami normalnymi (NormalMap) oraz tekstur z wektorami wichrującymi (BumpMap). Wykorzystanie tekstur z wektorami normalnymi zostało omówione w części dotyczącej map z oświetleniem, zaś tekstur z wek- torami wichrującymi — podczas analizy zagadnień związanych z teksturami wichrującymi. Tekstury z wektorami normalnymi i wektorami wichrującymi będą generowane na podsta- wie zwykłej tekstury. W pierwszym etapie należy znaleźć gradient w kierunku X i w kie- runku Y w bitmapie. Teoria przetwarzania obrazów oferuje wiele masek do obliczania gra- dientu (rysunki 10.22a, b i c). Rysunek 10.22a. Maski Prewitta Rysunek 10.22b. Maski Sobela Rysunek 10.22c. Maski gradientu Y Y X − − −       101  101    101 X − − −      101 202 101                − 1 − 2 − 0 1 0 2 − 1 − 1 − 0 1 0 1  1     0 1  1     0 1 X − − −      1 1 1 1 − 1  1  12    1 Y − 1 1 1      − − 1 2 1 −  1     1 1 W projekcie TextureGenDotN wykorzystamy maskę Sobela. Stosując maskę dla kierun- ku X i Y, otrzymamy dwa wektory [1,0,dX] i [0,1,dY]. Obliczamy ich iloczyn wektorowy: [ ,0,1 dX ] × [ ,1,0 ] dY [ −= dX , dY − ]1, Otrzymany wektor jest gradientem dla danego punktu w obrazie. Jego składowe x i y wykorzystujemy jako dane dla wektora wichrującego, zaś trzy składowe jako wektor nor- malny. Dane te należy odpowiednio spakować do składowych r i g dla tekstury wichru- jącej (signed char) oraz do składowych r, g i b dla tekstury z wektorami normalnymi (BYTE). Fragment kodu przedstawia przygotowanie tekstury zwichrującej: HQT  914 [[R GUE*GKIJV[  ] HQT  914 ZZR GUE9KFVJZ  ] OCUM; [ R GUE*GKIJV OCUM: Z R GUE9KFVJ Rozdział 10.  Tekstury 123 T HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:    I HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:    D HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:   ITG[H T H I H D  OCUM; [  R GUE*GKIJV OCUM: Z  R GUE9KFVJ T HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:    I HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:    D HNQCV R5TE$KVU FY5TE2KVEJ OCUM; OCUM:   ITG[H T H I H D F:ITG[ H ITG[ ITG[ITG[H ITG[ITG[ F;ITG[ H ITG[ ITG[ITG[H ITG[ITG[   :8 614XGE F:HF;HH    :8GE0QTOCNKG XGEXGE   R GUV$KVU FY5TE2KVEJ [ Z   EJCT H XGEZ T  R GUV$KVU FY5TE2KVEJ [ Z   EJCT H XGE[ I  R GUV$KVU FY5TE2KVEJ [ Z  D  R GUV$KVU FY5TE2KVEJ [ Z   C _ _ Dla każdego punktu w obrazie, który pokrywa maska, obliczamy luminancję (zmienne ITG[::). Zastosowano zawijanie tekstury na krawędziach. Składowe wektora są skalowa- ne, wartość skalowania wynosi 127, następnie zapisywane do odpowiednich bajtów tek- stury wichrującej. W tym kodzie widać różnicę w porównaniu do kodu wykorzystanego do obliczenia tekstury z wektorami normalnymi. Zastosowana została ta sama zmaska jak do obliczania gradientu: R GUV$KVU FY5TE2KVEJ [ Z   $;6 XGEZ H H H T R GUV$KVU FY5TE2KVEJ [ Z   $;6 XGE[ H H H I R GUV$KVU FY5TE2KVEJ [ Z  $;6 XGE H H H D R GUV$KVU FY5TE2KVEJ [ Z   C Kody te wykorzystaliśmy w projekcie TextureGenDotN. Użytkownik może załadować tek- stury z pliku za pomocą komendy LoadTexture. Na podstawie tej tekstury tworzone są dwie tekstury, korzystające z zaprezentowanych wyżej kodów (scena 3. i 4.) (rysunek 10.23). Scena 2. przedstawia teksturę z wektorami normalnymi, obliczoną za pomocą funkcji Direct3D  : QORWVG0QTOCN/CR. Wywołanie tej funkcji jest następujące: KH (#+.  : QORWVG0QTOCN/CR OAR6GZVWTG0QTOCNOAR6GZVWTGE07..  :A *#00 .A.7/+0#0 H TGVWTP 124 Aplikacje Direct3D Rysunek 10.23. Aplikacja MFC generuje na podstawie tekstury załadowanej z pliku tekstury z wektorami normalnymi oraz teksturę wichrującą Wszystkie trzy obliczone tekstury można zachować w plikach, aby wykorzystać je we wła- snych programach. Wybieramy jedną z komend menu: SaveDuDvMap (zapisuje teksturę wichrującą), SaveNormalMap (zapisuje teksturę z wektorami normalnymi utworzoną komendą Direct3D  : QORWVG0QTOCN/CR) lub SaveNormalMapOwn (zapisuje teksturę z wektorami normalnymi utworzoną według własnego algzorytmu).
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Aplikacje Direct3D
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: