Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
Aplikacje Direct3D
KATALOG KSIEK
KATALOG ONLINE
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Wprowadzenie ..............................................................................................................7
Rozdzia 1. Aplikacje bazowe ....................................................................................11
Szkielet podstawowy .............................................................................................................................11
Kreator DirectX AppWizard .................................................................................................................14
Aplikacje Direct3D
Rozdzia 10.
Tekstury
Tekstury zwikszaj realizm renderowanych scen, nadaj im specyficzny charakter. Jeli zachowamy ustawienia konfiguracyjne sceny, a zmienimy tekstur, to moemy uzyska ciekawy efekt, np. sceneria zmieni si z polarnej w pustynn. Dynamiczne zmienianie tekstur, rne sposoby ich czenia, wywietlanie kolejnych klatek tekstur na
powierzchni obiektw, a nawet zaburzania wsprzdnych tekstur to zabiegi, ktre
pozwalaj wprowadza coraz to nowe rozwizania, efekty.
W przykadach przedstawimy rne rodzaje tekstur obsugiwanych przez DirectX oraz
sposb ich stosowania.
Tekstury paskie
Definicje struktur FVF dla obiektw zawierajcych tekstur zostay omwione w rozdziale
Bufory werteksw na przykadzie projektu z katalogu \Primitives\FVFPositionTexCoord.
Teraz pokaemy, w jaki sposb przygotowa tekstur do wywietlenia.
W deklaracji klasy podajemy wskanik do interfejsu obsugujcego tekstur:
98
Aplikacje Direct3D
Kolejnym krokiem bdzie dynamiczna zmiana wsprzdnych u i v tekstury. Projekt z katalogu \Texture\TexRotate (rysunki 10.1a i 10.1b) implementuje obrt wsprzdnych tekstury
wok osi Z:
.
.)/'#0)((
Rysunek 10.1a.
Obrt wsprzdnych
tekstury wok osi Z
Rysunek 10.1b.
Obrt wsprzdnych
tekstury wok osi Z
99
, 15*+
"6 -# 74081(# 5944('1"0# - ( ( (
:
1"0;-<%=41"3)0!'#'-#'(
1"0;><%=41"3)0!'#'>#'(
1"0;3<%=41"3)0!'#'3#'(
1"0;<%=41"3)0!'#'#'(
?
15*+) "6(
Funkcja
przeksztaca wektor dwuelementowy, okrelony w drugim argumencie, przez macierz
.
W przykadzie z katalogu \Texture\TexTranslate wykorzystalimy inn macierz przeksztacenia wsprzdnych. Jest to macierz translacji:
.)0 )'#>%40)-%@4(# 3%4"0>%4(#-%-(
100
Aplikacje Direct3D
Rysunek 10.2b.
Przemieszczanie
tekstury na powierzchni
obiektu
Rysunek 10.3a przedstawia sekwencj animacji, ktr uzyskalimy. Rysunek 10.3b pokazuje pierwsz bitmap, a rysunek 10.3c pit z sekwencji dziesiciu klatek.
W analizowanych przykadach tekstury zostay umieszczone na czworoktach, lecz nic
nie stoi na przeszkodzie, by animowa tekstury na powierzchni zoonych obiektw
trjwymiarowych.
Tekstury otoczenia
Wsprzdne tekstury mog by wygenerowane automatycznie, nie jest konieczne podawanie ich wartoci w strukturach werteksw. Powstaje wtedy efekt odbijania si tekstury na obiekcie, nazywany mapowaniem otoczenia (Environment Mapping).
W podanych przykadach pokaemy sposb wykorzystania mapowania.
101
Rysunek 10.3a.
Wynik wywietlania
sekwencji tekstur
na powierzchni obiektu
Rysunek 10.3b.
Pierwsza klatka
animowanej tekstury
Rysunek 10.3c.
Pita klatka
animowanej tekstury
Przykad (z katalogu \Texture\EnvMapping1) mapowania otoczenia zosta przedstawiony na rysunku 10.4a. Tekstur otoczenia pokazuje rysunek 10.4b.
Aby otrzyma taki efekt, naley wprowadzi w kodzie:
!!"*+,,E, -# ,,A,2.
F,# 2A3 (
!!"*+,,E, -# ,,22
A#
,,
.,A2.
(
Flaga
informuje urzdzenie o sposobie generowania wsprzdnych tekstury (wybrane
), za flaga
! informuje o liczbie wsprzdnych tekstury, przekazywanych do urzdzenia renderujcego. W tym przypadku s to dwie wsprzdne u i v (
). Ustawienia te wykonano dla poziomu 0 (pierwszy argument powyszych funkcji). Dodatkowo
ustawiamy macierz przeksztacenia wsprzdnych tekstury:
102
Aplikacje Direct3D
Rysunek 10.4a.
Tekstura powstaa
w wyniku mapowania
otoczenia (generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACENORMAL).
Do urzdzenia
przekazywane s dwie
wsprzdne tekstury
Rysunek 10.4b.
Tekstura otoczenia
.
%>> = -%G %>3 = -%- %> = -%- %>7 = -%-
%3> = -%- %33 =*-%G %3 = -%- %37 = -%-
%> = -%- %3 = -%- % = >%- %7 = -%-
%7> = -%G %73 = -%G %7 = -%- %77 = >%-
!!"*+,)0 ,-# ' (
Zmieniajc dynamicznie wartoci tej macierzy, mona take uzyska efekt przemieszczania si tekstury na powierzchni obiektu (np. odbijanie si otoczenia w szybie poruszajcego
si samochodu). Flaga
" oznacza, e ustawiana jest macierz przeksztacajca tekstur dla poziomu 0.
103
Jest to jedyna rnica w porwnaniu do poprzedniego projektu. Efekt tego typu mapowania przedstawia rysunek 10.5a (projekt z katalogu \Texture\EnvMapping1p). Na rysunku 10.5b przedstawiono tekstur otoczenia. Mapowanie, w ktrym zastosowano flagi
#
, pomaga wyeliminowa bdy, jakie powstaj na powierzchni obiektw
w kierunku osi Z (tekstura nie jest naoona, lecz rozcignita).
Rysunek 10.5a.
Mapowanie tekstury
otoczenia na obiekt
(generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACENORMAL).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury
Rysunek 10.5b.
Tekstura otoczenia
104
Aplikacje Direct3D
Jeli zastosujemy flag
, to otrzymamy inny tryb generowania wsprzdnych tekstury. Ustawiamy wtedy:
!!"*+,,E, -# ,,A,2.
F,# 2A3 (
!!"*+,,E, -# ,,22
A#
,,
.,2,
2A (
W tym przypadku bd rwnie wykorzystane tylko dwie wsprzdne tekstury. Wynik mapowania oraz tekstur otoczenia przedstawiaj kolejno rysunek 10.6a i b (projekt z katalogu \Texture\EnvMapping2).
Rysunek 10.6a.
Mapowanie tekstury
otoczenia na obiekt
(generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACEPOSITION).
Do urzdzenia
przekazywane s dwie
wsprzdne tekstury
Rysunek 10.6a.
Tekstura otoczenia
105
Rysunek 10.7.
Mapowanie tekstury
otoczenia na obiekt
(generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACEPOSITION).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury
Tekstura zostaa tak przygotowana, aby kada ciana bya innego koloru. Efekt naoenia
jej na obiekt jest wic widoczny (rysunek 10.8).
Tekstury .dds mona wykona w programie DxTex.exe z pakietu SDK 8.1. Ustawiamy t
tekstur jako aktywn w slocie 0:
!!"*+, -#&(
I dopiero teraz mona wykona rendering obiektu. Na koniec naley zwolni zasoby
tekstury.
,
,&(
106
Aplikacje Direct3D
Rysunek 10.8.
Mapowanie tekstury
otoczenia na obiekt
(generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACEREFLECTIONVECTOR).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury
Przed rozpoczciem dziaania aplikacja musi si upewni, czy urzdzenie obsuguje ten
rodzaj tekstur:
- == 0*+0 ' ,5. ( (
)
Makro
%&'( oznacza, e tekstura o indeksie x ma dwa parametry u i v.
Tekstury adujemy z plikw i ustawiamy w odpowiednich slotach 0 i 1:
!!"*+, -# 0;)"< (
!!"*+, ># (
107
Tekstura w slocie zerowym bdzie si zmieniaa, dlatego wybieramy z tablicy jedn z tekstur (bd wywietlane sekwencyjnie animacja). Teraz wprowadzamy informacje na
temat tego, co bdzie si dziao z tekstur w danym slocie. Dla etapu 0:
!!"*+,,E, -# ,,22
A# - (
!!"*+,,E, -# ,,2
2F># (
!!"*+,,E, -# ,,2
22# 2,
F>(
!!"*+,,E, -# ,,2
2F3#
,(
!!"*+,,E, -# ,,
L2# 2
,5
(
Flaga
ustawia indeks informujcy, ktre wsprzdne tekstury s
przeznaczone dla tej tekstury w strukturze werteksa (indeks 0 to ). Flaga
oznacza rodzaj operacji dla kolorw rgb, a flaga
) operacj dla kanau
alfa. Flagi
!* i
! oznaczaj odpowiednio argumenty dla
okrelonej operacji rgb. Operacja
!* to wybr argumentu pierwszego
, ktry oznacza tekstur. Argument drugi
, oznaczajcy kolor, jest ignorowany. Dla kanau alfa operacja jest wyczona
+. Wynikowe
wartoci s przekazywane do kolejnego slotu.
W drugim etapie jako pierwszy argument wybieramy tekstur ze slotu 1 (
)
oraz jako drugi argument wynik poprzedniej operacji (
) ze slotu 0:
2 2
2=2.2
%%%%%%%%%%%%%
!!"*+,,E, ># ,,22
A# > (
!!"*+,,E, ># ,,2
2F># (
!!"*+,,E, ># ,,2
22# 2(
!!"*+,,E, ># ,,2
2F3# A (
!!"*+,,E, ># ,,
L2# 2
,5
(
Opis
wyczenie
Arg1 Arg 2
( Arg1 Arg2 ) 2
( Arg1 Arg2 ) 4
Arg1 + Arg 2
Arg1 Arg 2
108
Aplikacje Direct3D
Typ wyliczeniowy obejmuje znacznie wiksz liczb operacji. W tabeli zostay podane tylko te, ktre zostay wykorzystane w opisywanej implementacji.
W trzecim etapie nie bdziemy wykonywali adnych operacji, wic wywoujemy funkcje:
!"#
$
!"#
./53 !#
Przykad z katalogu \Texture\TexOp to aplikacja MFC, ktra pozwala przetestowa wybrane sposoby czenia tekstur (rysunek 10.9a). Rysunek 10.9b pokazuje pierwsz tekstur z sekwencji dziesiciu tekstur, a rysunek 10.9c pit.
Rysunek 10.9a.
Aplikacja MFC
rne sposoby
czenia tekstur
Rysunek 10.9b.
Pierwsza klatka
animowanej tekstury
109
Rysunek 10.9c.
Pita klatka
animowanej tekstury
Rne tekstury mona wykorzysta do symulowania owietlania obiektw wiatem monochromatycznym lub wielobarwnym.
110
Aplikacje Direct3D
Rysunek 10.10b.
Tekstura obiektu
Tak wyglda kod funkcji, za pomoc ktrej zamienia si format bitmapy z A8R8G8B8
na V8U8:
111
112
Aplikacje Direct3D
Bajty odpowiadajce kolorom s umieszczane w pamici w nastpujcej kolejnoci: B, G,
R, A, B1, G1, R1, A1, B2, G2, R2, A2... Podobnie umieszczane s bajty odpowiadajce
parametrom wichrujcym: dU, dV, dU1, dV1, dU2, dV2...Wartoci dU i dV z przedziau
128,127 odpowiadaj parametrom wichrujcym z przedziau od 1 do 1. Parametr dU
odnosi si do kierunku X, za parametr dV do kierunku Y. Funkcja zwraca
w strukturze
parametry tekstury wejciowej. Wykorzystujemy wysoko
i szeroko tekstury zaadowanej z pliku do utworzenia tekstury o tych samych wymiarach
(
). Obydwie tekstury blokujemy funkcj !, aby mona byo przepisa dane. Odpowiednio przepisujemy kolor czerwony do dU i kolor zielony do dV. Po
zakoczeniu operacji blokady s zwalniane (" !).
Ustawiamy parametry macierzy 22 przeksztacajcej wartoci dU i dV:
<
<
<
<
+*!78*<<310<'<@%""#
+*!78*<@310<'<%""#
+*!78*@<310<'<%""#
+*!78*@@310<'<@%""#
dU = dU M 00 + dV M 10
dV = dU M 01 + dV M 11
gdzie M00, M01, M10, M11 s parametrami ustawionej poprzednio macierzy 22.
Stosujemy operacje tekstury wichrujcej dla slotu 0:
<
+*!78*"#
Przykad z katalogu \Texture\TexBumpLTranslate dotyczy sposobu wykorzystania tekstury wichrujcej z luminancj o formacie L6V5U5 (rysunek 10.12).
Sprawdzamy, czy urzdzenie obsuguje BumpMapping z luminancj (flaga
#
) oraz czy obsuguje okrelony format tekstury wichrujcej
$%%:
113
Rysunek 10.12.
Zastosowanie tekstury
wichrujcej z luminancj
114
Aplikacje Direct3D
Rysunek 10.13.
Przykadowa tekstura
wichrujca z luminancj
(format L6V5U5)
<
+*!78
!310'J%""#
<
+*!7833
!310<',%""#
L = L S L + OL
gdzie:
L luminancja wyjciowa,
L luminancja pobrana z tekstury wichrujcej,
SL wspczynnik skalujcy,
OL offset.
W slocie 0 naley jeszcze zaznaczy, e wykorzystywana jest tekstura z luminancj:
<
+*!78*+*77!"#
Struktura FVF zawiera teraz tylko jedn par wsprzdnych (dla tekstury wichrujcej).
Przykad z katalogu \Texture\EnvMappingBump1p pokazuje wynik dziaania tekstury wichrujcej i otoczenia (rysunek 10.14).
115
Rysunek 10.14.
Poczenie tekstury
wichrujcej i tekstury
otoczenia (generowanie
wsprzdnych tekstury
otoczenia flaga
D3DTSS_TCI_CAMERAS
PACENORMAL).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury
otoczenia
Przykad z katalogu \Texture\EnvMappingBump2 dotyczy nastpujcych parametrw tekstury otoczenia (rysunek 10.15):
@
!)+!7
3*3E
33+7"#
@
!)7!)
*!
!
7L@"#
Rysunek 10.15.
Poczenie tekstury
wichrujcej i tekstury
otoczenia (generowanie
wsprzdnych tekstury
otoczenia flaga
D3DTSS_TCI_CAMERAS
PACEPOSITION).
Do urzdzenia
przekazywane s dwie
wsprzdne tekstury
otoczenia
116
Aplikacje Direct3D
Rysunek 10.16.
Poczenie tekstury
wichrujcej i tekstury
otoczenia (generowanie
wsprzdnych tekstury
otoczenia flaga
D3DTSS_TCI_CAMERAS
PACEPOSITION).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury
otoczenia
117
Tekstury przestrzenne
Tekstur przestrzenna (Volume Map) tworzymy przez dodanie trzeciej wsprzdnej do paskiej tekstury. Otrzymamy wtedy prostopadocian o okrelonej szerokoci, wysokoci
i gbokoci. Elementem jednostkowym takiej figury jest teksel. Tekstury przestrzenne
znajduj zastosowanie w medycynie, s wykorzystywane do przedstawiania kolejnych
przekrojw, np. gowy. Taki obraz przestrzenny mona oglda pod dowolnym ktem.
W przykadzie z katalogu \Texture\TexVolume bry przestrzenn tekstury wypeniamy kolorami i bdziemy j wywietlali, zmieniajc trzeci wsprzdn tekstury. Sprawdzamy,
czy urzdzenie obsuguje tekstury przestrzenne:
%<55&&(!)+!
8+*!*""
-!3#
118
Aplikacje Direct3D
Deklarujemy wskanik do struktury tekstury przestrzennej:
A
!8+*!!)+!>#
Korzystajc z funkcji
&, tworzymy tekstur przestrzenn:
%3!
81/@I@I@I@<
3*>>E> >*7E!("""
-!3#
Funkcja ta utworzy tekstur o wymiarach 161616 i formacie
. Wypeniamy tekstur, korzystajc z wywoania funkcji:
%3!)3 //81/3 //*;81/7+"""
-!3#
119
Rysunek 10.18.
Na powierzchni obiektu
wywietlana jest
tekstura o wymiarach
161616, ze zmienn
wsprzdn w
)*)1#
)R+!77S#
)8!#
)* 1 1-=2
91//(1% B@'J%% <'<%"#
)* %% --&%1 1-(@'<%()8!<'T<T@%<'J%<'<%"
)R- 1-1 1-* (S(1"()8!<'<T@<IT>%<'<%<'J%""#
)8!#
!38!!)B8
&#
%
+!!!8 1
:<,B& N1%!38!!)" =!BB"(8
&<"""
C
8
&P<Q'25B)8
-&%111((<("#
8
&P@Q'25B)8
-&%111((@("#
8
&PQ'25B)8
-&%111((("#
8
&PQ'25B)8
-&%111((("#
D
Dot3
Natenie owietlenia Lambertowskiego danego punktu obliczamy przez iloczyn skalarny
wektora normalnego i wektora w kierunku wiata. Jeeli dana powierzchnia ma tekstur,
ktra zamiast wartoci rgb ma wsprzdne xyz wektora normalnego powierzchni i znamy
pozycj wiata (x, y, z), to moemy obliczy map owietlenia powierzchni. Przykad
\Texture\TexDot3 pokazuje, jak to zrobi. adujemy tekstur zawierajc wektory normalne (rysunek 10.20a) i zwyk tekstur (rysunek 10.20b), dla ktrej zostay utworzone
wektory normalne.
120
Aplikacje Direct3D
Rysunek 10.19.
Na powierzchni obiektu
wywietlana jest
tekstura o wymiarach
161616,
ze zmiennymi
wsprzdnymi u, v i w
Rysunek 10.20a.
Tekstura zawierajca
wektory normalne
W slocie 1 umieszczamy tekstur obiektu, ktra bdzie czona z tekstur wynikow owietlenia ze slotu 0:
<
!)7!)<"#
<
E@!)+!"#
<
+"#
<
E3"#
<
$
!"#
@
!)7!)@"#
@
E@!)+!"#
@
"#
@
E+!7"#
@
$
!"#
121
Rysunek 10.20b.
Tekstura rdowa
dla tekstury z wektorami
normalnymi
W slocie 0 zostaa umieszczona tekstura z wektorami normalnymi oraz zastosowana operacja
. Flaga
oznacza, e drugim argumentem jest wektor
wskazujcy kierunek wiecenia wiata. Zanim rozpoczniemy renderowanie, ustawiamy
jeszcze ten wspczynnik (flaga
):
050"@T'<%B 9'G@>'<%"#
050"@T'<%B 9';G@>'<%"#
0.50"@T'<%B 9'NG@>'<%"#
023
1544@I"G44>"G.#
-
!)+!323
1"#
122
Aplikacje Direct3D
1 0 1
1 0 1
1 0 1
1 1 1
0 0 0
1 1 1
1 2 1
0
0
0
1
2
1
Rysunek 10.22b.
Maski Sobela
1 0 1
2 0 2
1 0 1
Rysunek 10.22c.
Maski gradientu
1 1 1
1 2 1
1 1 1
1 1 1
1 2 1
1
1
1
W projekcie \Texture\GenDotN wykorzystamy mask Sobela. Stosujc mask dla kierunku X i Y, otrzymamy dwa wektory [1,0,dX] i [0,1,dY]. Obliczamy ich iloczyn wektorowy:
123
5%/1"B
&G2
9B&:=G&:)B,G""#
5%/1"B
&G2
9B&:=G&:)B,G@""#
.5%/1"B
&G2
9B&:=G&:)B,""#
;@@5<'VV%BG<'J>T%BG<'@@,%B.#
'''''''''''''''
&:=5;G@"U&
'$ 9#
&:)5G@"U&
'0 9#
5%/1"B
&G2
9B&:=G&:)B,G""#
5%/1"B
&G2
9B&:=G&:)B,G@""#
.5%/1"B
&G2
9B&:=G&:)B,""#
;5<'VV%BG<'J>T%BG<'@@,%B.#
)5;@G'<%B;G;;@@'<%B;@;@#
=5;@@G'<%B;@G;@;@'<%B;;#
)8!
)HJJ'<%=HJJ'<%@'<%"#
)8
71/ N(
(
"#
B&
B&
B&
B&
D
D
&G2
9B;GB,G"5
9@T'<%B
'"#HH
&G2
9B;GB,G@"5
9@T'<%B
';"#HH
&G2
9B;GB,"5<#HH.
&G2
9B;GB,G"5<#HH
Dla kadego punktu w obrazie, ktry pokrywa maska, obliczamy luminancj (zmienne
). Zastosowano zawijanie tekstury na krawdziach. Skadowe wektora s skalowane, warto skalowania wynosi 127, nastpnie zapisywane do odpowiednich bajtw tekstury wichrujcej.
W tym kodzie wida rnic w porwnaniu do kodu wykorzystanego do obliczenia tekstury
z wektorami normalnymi. Zastosowana zostaa ta sama maska jak do obliczania gradientu:
B&
B&
B&
B&
&G2
9B;GB,G"5 =!
'G@'<%"H'<%BJJ'<%"#HH
&G2
9B;GB,G@"5 =!
';G@'<%"H'<%BJJ'<%"#HH
&G2
9B;GB,"5 =!
'NG@'<%"H'<%BJJ'<%"#HH.
&G2
9B;GB,G"5<#HH
Kody te wykorzystalimy w projekcie \Texture\GenDotN. Uytkownik moe zaadowa tekstury z pliku za pomoc komendy LoadTexture. Na podstawie tej tekstury tworzone s dwie
tekstury, korzystajce z zaprezentowanych wyej kodw (scena 3. i 4.) (rysunek 10.23).
Scena 2. przedstawia tekstur z wektorami normalnymi, obliczon za pomoc funkcji
Direct3D
&* &*. Wywoanie tej funkcji jest nastpujce:
%3!)171/*71/7+<
)$77!+*77!@'<%"""
-#
124
Aplikacje Direct3D
Rysunek 10.23.
Aplikacja MFC generuje
na podstawie tekstury
zaadowanej z pliku
tekstury z wektorami
normalnymi oraz
tekstur wichrujc
Wszystkie trzy obliczone tekstury mona zachowa w plikach, aby wykorzysta je we wasnych programach. Wybieramy jedn z komend menu: SaveDuDvMap (zapisuje tekstur
wichrujc), SaveNormalMap (zapisuje tekstur z wektorami normalnymi utworzon
komend Direct3D
&* &*) lub SaveNormalMapOwn (zapisuje tekstur
z wektorami normalnymi utworzon wedug wasnego algorytmu).