You are on page 1of 31

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

Aplikacje Direct3D

KATALOG KSIEK
KATALOG ONLINE

Autor: Robert Krupiski


ISBN: 83-7197-877-4
Format: B5, stron: 180

ZAMW DRUKOWANY KATALOG

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

Dziki Direct3D moesz tworzy nowoczesne gry, symulacje czy programy


multimedialne. Jest on podstawowym standardem programowania grafiki
trjwymiarowej w systemach operacyjnych zgodnych z Windows. Akceleracja
sprztowa, oferowana przez wikszo wspczesnych kart graficznych oraz bogaty
zbir narzdzi dostpnych w wersji 8.1 umoliwia programowanie zaskakujcej
i efektownej grafiki 3D. Direct3D dostarcza programicie gotowych interfejsw,
uwalniajc go jednoczenie od koniecznoci zaznajamiania si ze wewntrznymi
funkcjami sprztu.
Blisko 100 przykadowych projektw prezentujcych wiele praktycznych zastosowa
Direct3D wprowadzi Ci w wiat programowania grafiki 3D.
W ksice omwiono m.in.:

Podstawy programowania w Direct3D


Bufory werteksw
Zarzdzanie zoonymi obiektami (obiekt Mesh)
Przeksztacenia przestrzeni
wiato i materia, przeroczysto
Operowanie teksturami
Zarzdzanie obiektami lecymi na jednej paszczynie
Pisanie kodu niezalenego od rodzaju karty graficznej

Autor zakada, e Czytelnik potrafi posugiwa si pakietem Visual C++ i posiada


umiejtno programowania w tym jzyku, korzysta z klas MFC, a take jest
zaznajomiony z pojciami dotyczcymi grafiki komputerowej. Jeli speniasz te warunki
i chcesz kreowa wasne, trjwymiarowe wiaty na ekranie komputera, z pewnoci
pomoe Ci w tym ta ksika.

Spis treci
Wprowadzenie ..............................................................................................................7
Rozdzia 1. Aplikacje bazowe ....................................................................................11
Szkielet podstawowy .............................................................................................................................11
Kreator DirectX AppWizard .................................................................................................................14

Rozdzia 2. Bufory werteksw ...................................................................................17


Prymitywy .............................................................................................................................................17
FVF........................................................................................................................................................25
Bufory indeksw....................................................................................................................................30
Dynamiczna zmiana zawartoci buforw..............................................................................................32
czenie buforw ..................................................................................................................................34

Rozdzia 3. Obiekt Mesh ............................................................................................37


Obiekty podstawowe .............................................................................................................................37
Klasy pomocnicze..................................................................................................................................40
Teselacja ................................................................................................................................................41
Pliki .x....................................................................................................................................................44

Rozdzia 4. Przeksztacenia przestrzeni ...................................................................47


Okno widoku .........................................................................................................................................47
Macierz wiata .......................................................................................................................................48
Macierz widoku .....................................................................................................................................50
Macierz rzutowania ...............................................................................................................................53
Kwaterniony ..........................................................................................................................................54

Rozdzia 5. wiato i materia ....................................................................................59


Ustawienia kolorw...............................................................................................................................59
wiato kierunkowe ...............................................................................................................................63
wiato punktowe ..................................................................................................................................64
wiato rdowe ...................................................................................................................................65
Wiele rde wiata ..............................................................................................................................66
Materia..................................................................................................................................................68

Rozdzia 6. Blending werteksw................................................................................71


Tweening ...............................................................................................................................................71
Macierze deformujce ...........................................................................................................................76

Aplikacje Direct3D

Rozdzia 7. Alpha Blending .......................................................................................83


Rozdzia 8. Bufor szablonu ........................................................................................89
Rozdzia 9. Tekst.........................................................................................................93
Rozdzia 10. Tekstury.................................................................................................97
Tekstury paskie.....................................................................................................................................97
Tekstury otoczenia...............................................................................................................................100
Dwa etapy czenia tekstur ..................................................................................................................106
Tekstura wichrujca i tekstura obiektu ................................................................................................109
Tekstura wichrujca i tekstura otoczenia.............................................................................................114
Tekstura obiektu, wichrujca i otoczenia ............................................................................................116
Tekstury przestrzenne..........................................................................................................................117
Dot3 .....................................................................................................................................................119
Mapy wektorw normalnych i wektorw wichrujcych .....................................................................122

Rozdzia 11. Potoki ...................................................................................................125


VertexShader .......................................................................................................................................125
PixelShader..........................................................................................................................................136
Program uruchomieniowy ...................................................................................................................141

Rozdzia 12. Z-bufor.................................................................................................143


Rozdzia 13. Efekty...................................................................................................145
Rozdzia 14. Paszczyzny tnce................................................................................153
Rozdzia 15. Mga .....................................................................................................155
Rozdzia 16. Sprajty .................................................................................................159
Rozdzia 17. Punkty..................................................................................................163
Rozdzia 18. Wygaszacz ekranu ..............................................................................167
Rozdzia 19. Interakcja ............................................................................................171
Zawarto CD-ROM-u.............................................................................................177
Skorowidz..................................................................................................................181

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:


  

W konstruktorze inicjalizujemy to pole wartoci . Tekstur mona zaadowa z pliku


na kilka sposobw. My przedstawimy dwa z nich:
 
    !! "# $%&$#'( ( (
) 

 
    !! "# # $%&$#'( ( (
) 


W slocie 0 ustawiamy tekstur jako aktywn, wykorzystywan do renderingu:


!! "*+, -#(

Obiekty, ktre posiadaj wsprzdne u i v, bd wykorzystyway t tekstur. Na koniec


naley pamita o zwolnieniu zasobw tekstury:
,
,(

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

Macierz obrotu wok osi Z jest umieszczana w zmiennej


.
Macierz obrotw wykorzystujemy do zmiany wsprzdnych tekstury. W metodzie 

  blokujemy bufory werteksw i uaktualniamy pozycje u i v tekstury:


 123 
14 1"0

Rozdzia 10.  Tekstury

99

,   15*+
"6 -# 7408 1(# 5944('1"0# - ( ( (
:
1"0;-<%=4  1"3)0!'#'-#'(
1"0;><%=4  1"3)0!'#'>#'(
1"0;3<%=4  1"3)0!'#'3#'(
1"0;<%=4  1"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(#-%-(

Rysunki 10.2a i 10.2b przedstawiaj tekstur przemieszczan na powierzchni obiektu.


Rysunek 10.2a.
Przemieszczanie
tekstury na powierzchni
obiektu

W projekcie \Texture\TexAnim wykorzystalimy sekwencyjn zmian tekstury. Kolejna


tekstura jest wywietlana z czstoci trzydziestu klatek na sekund, co sprawia wraenie
animacji tekstury na powierzchni obiektu. Dodatkowo tekstura jest przemieszczana. Definiujemy tablic tekstur:


  0;A.,<

W tablicy tej bd przechowywane kolejne klatki tekstury. Inicjalizujemy wartoci 


wszystkie tekstury:
) =-BA.,CC(
0;<=A

100

Aplikacje Direct3D

Rysunek 10.2b.
Przemieszczanie
tekstury na powierzchni
obiektu

Pamitamy o zwolnieniu zasobw zajmowanych przez tekstury:


) =-BA.,CC(
,
, 0;< (

adujemy wszystkie tekstury z plikw do tablicy:


 
     !! "# $-%&$# '0;-< ( ( (
) 

%%%%%%%%%%%%%%%
 
     !! "# $D%&$# '0;D< ( ( (
) 


Zanim rozpoczniemy renderowanie, wybieramy tekstur, ktra ma by wykorzystana


i umieszczamy j w slocie 0:
!! "*+, -# 0;)"< (

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.

Rozdzia 10.  Tekstury

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.

Rozdzia 10.  Tekstury

103

Do urzdzenia mona przekaza trzy wsprzdne, warto dwch pierwszych zostanie


obliczona przez podzielenie ich przez warto trzeciej wsprzdnej. W efekcie kocowym uzyskamy tylko dwie wsprzdne do pobierania koloru z tekstury dwuwymiarowej. W tym przypadku ustawienia wygldaj tak:
!! "*+,,E, -#  ,,A,2.
F,#  2A
H   2I (

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

Ten sam zabieg mapowania, ale dla flagi



#
przedstawia rysunek 10.7
(projekt z katalogu \Texture\EnvMapping2p).
Tryb generowania wsprzdnych tekstury

  stosujemy w przypadku tekstur typu szeciennego. Ustawienia s wtedy nastpujce:
!! "*+,,E, -#  ,,A,2.
F,#  2A (
!! "*+,,E, -#  ,,22 A #  ,, 
., 
 2A12 (

Rozdzia 10.  Tekstury

105

Rysunek 10.7.
Mapowanie tekstury
otoczenia na obiekt
(generowanie
wsprzdnych tekstury
flaga D3DTSS_TCI_
CAMERASPACEPOSITION).
Do urzdzenia
przekazywane s trzy
wsprzdne tekstury

W tym przypadku generowane s trzy wsprzdne, ktre s przekazywane do urzdzenia


w celu indeksowania tekstury. Sposb generowania wektora odbicia, ktry wanie suy
do indeksowanie tekstury, moe by modyfikowany za pomoc flagi

 $,
ktra przyjmuje wartoci typu .
Projekt (\Texture\EnvMapCube) przedstawia zastosowanie mapowania szeciennego.
Tekstura ma posta szecianu, na ktrego kad cian mona naoy inn pask tekstur otoczenia.
Definiujemy tekstur szecienn:


 5 &

Inicjalizujemy j wartoci  w konstruktorze:


&=A

adujemy z pliku .dds przygotowan wczeniej tekstur szecienn:


 
   & !! "# $%!!0$# '&( ( (
) 


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. ( (
) 


W bardziej skomplikowanym przykadzie mona na tekstur otoczenia renderowa obiekty


zdefiniowanej sceny, a nastpnie wykorzysta tak przygotowan tekstur do rysowania
obiektw zapisywanych w buforze obrazu. Otrzymamy efekt wzajemnego odbijania si
obiektw na swoich powierzchniach.

Dwa etapy czenia tekstur


Jeden werteks moe posiada informacje o wsprzdnych dla omiu tekstur. W tym podrozdziale przedstawimy sposb czenia tekstur w dwch etapach (dla dwch tekstur).
Kady werteks bdzie zawiera wsprzdne dla dwch tekstur  i :
0" 1
:

2 # J# 8
 123 
 123 >
?

Definicja FVF dla takiej struktury przybiera posta:


K!)  1 1   19/H  13H  122 , /3-(H  1
22 , /3>((

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;)"< (
!! "*+, ># (

Rozdzia 10.  Tekstury

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
(

Parametr wyliczeniowy   jest jedn z dostpnych operacji czenia tekstur:


Operacja

Testowana flaga D3DTEXOPCAPS

Opis



  


wyczenie

  

    

wybr pierwszego argumentu

  

    

wybr drugiego argumentu

 

   

Arg1 Arg 2

  

    

  

    

( Arg1 Arg2 ) 2
( Arg1 Arg2 ) 4

 

   

Arg1 + Arg 2

  

    

Arg1 + Arg 2 0.5

  

    

( Arg1 + Arg 2 0.5) 2


 

  


 

Arg1 Arg 2

 

   

Arg1 + Arg 2 (1 Arg1 )

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:

      !"#

    $  !"#

Sprawdzamy, czy urzdzenie wykonuje okrelon operacj:


%&'&(!) *+!)"
 , !-./0 -12+!"#
/&
 , !-./0 -123 !"#

Naley take sprawdzi, czy s dostpne dwa sloty:


%& * /- &4"
.&

./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

Rozdzia 10.  Tekstury

109

Rysunek 10.9c.
Pita klatka
animowanej tekstury

Rne tekstury mona wykorzysta do symulowania owietlania obiektw wiatem monochromatycznym lub wielobarwnym.

Tekstura wichrujca i tekstura obiektu


W tym podrozdziale przedstawimy zastosowanie tekstury wichrujcej w slocie 0 oraz tekstury obiektu w slocie 1. Tekstura wichrujca (Bump Texture) imituje nierwnoci powierzchni obiektw. W zalenoci od formatu tekstura wichrujca moe nie tylko modyfikowa wsprzdne tekstury obiektu, ale i regulowa jasno pikseli.
Przykad z katalogu \Texture\TexBumpTranslate pokazuje, jak oddziauje tekstura wichrujca na tekstur obiektu (rysunek 10.10a). Dla porwnania tekstura obiektu zostaa
przedstawiona na rysunku 10.10b. Na statycznych obrazach wida wyranie efekt, kiedy
obserwuje si wie i dach (na lewo od wiey). Podczas dynamicznego dziaania programu jest to atwiejsze do zauwaenia.
Rysunek 10.10a.
Tekstura obiektu
modyfikowana przez
tekstur wichrujc

Tekstura wichrujca jest przemieszczana w poziomie, co daje efekt falowania powierzchni


obiektu. Oto operacje, ktre naley wykona, jeli chcemy zastosowa tekstur wichrujc.

110

Aplikacje Direct3D

Rysunek 10.10b.
Tekstura obiektu

Najpierw sprawdzamy, czy urzdzenie obsuguje BumpMapping za pomoc flagi



  oraz czy obsuguje okrelony format tekstury wichrujcej
 :
%6& &(!)  +*!78*""
-!3#
%3! 9
:
31&  -/
& 
;31<=!!)+!3*8>+>"""
-!3#

adujemy tekstur obiektu i umieszczamy j w slocie 1. Zaadowana tekstura wichrujca


jest przeksztacana, zapisywana w formacie V8U8 i umieszczana w slocie 0:
%3!)313 /
?'.?("""
-!3#

 @"#
%3!1 313 /?@'.?( """
-!3#

 < "#

Tak wyglda kod funkcji, za pomoc ktrej zamienia si format bitmapy z A8R8G8B8
na V8U8:

Rozdzia 10.  Tekstury

111

$! +*;AA1 313 /$B&!!)+!>B"


C
!!)+!>#
 %3!)313 /
&("""
C
 3!!! !"#
-!3#
D
 +3!! &
#
 %3! E/&
<(&
"""
C
 3!!! !"#
-!3#
D
 %3!
 &
'0 9&
'$ 9@<
3*8>+>*7E!"""
C
 3!!! !"#
-!3#
D
F!!/1
:
#
 1
:
<(/1
:
<<"#
02 
 
950"/1
:
' 
9#
 =!B 
&5 =!B"/1
:
' &#
B" 1
:
<(/1
:
<<"#
02& 
950"/1
:
' 
9#
 =!B& &5 =!B"/1
:
' &#
%10;5<#;4&
'$ 9#;GG"
C
%105<#4&
'0 9#GG"
C
B& &GBG@"5B 
&G,BG@"#HH5
B& &GB"5B 
&G,BG"#HH5
D
& &G52& 
9#
 
&G52 
 
9#
D
 +-/1
:
<"#
B" +-/1
:
<"#
 3!!! !"#
- F#
D

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<'<@%""#

Nowe wsprzdne tekstury obliczane s wedug wzorw:

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*"#

Na koniec mona wykona rendering. Rysunek 10.11 przedstawia tekstur wichrujc


zastosowan w przykadzie.
Rysunek 10.11.
Przykadowa
tekstura wichrujca
(format V8U8)

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 
$%%:

Rozdzia 10.  Tekstury

113

Rysunek 10.12.
Zastosowanie tekstury
wichrujcej z luminancj

%6& &( +*!78*+*77!""


-!3#
%3! 9
:
31&  -/
& 
;31<=!!)+!3*I8J+J"""
-!3#

Dane dla tekstury wichrujcej adujemy z pliku za pomoc przygotowanej wczeniej


funkcji 

 
. W kolorze czerwonym jest przechowywana warto dU,
w kolorze zielonym dV, a w niebieskim warto luminancji. Dane te s zapisywane
za pomoc 16 bitw, tak e 6 bitw jest przeznaczonych dla luminancji, 5 bitw dla dU
i 5 bitw dla dV. Naley pamita, e w komputerach PC bity s uoenie wedug zasady
Little-Endian (tzn. modszy bajt znajduje si przed starszym). Cz kodu odpowiedzialnego za pakowanie bitw w funkcji 

 
wyglda w ten sposb:
K% -F  /"0"/" "(<%"44@<"L" "(<@%"44J"L
" "(<@%"""
''''''''''''
5B 
&G,BG"#HH
5B 
&G,BG@"#HH
/ -5B 
&G,B"#HH.
B0B"& &GB"5F  / -"#

Pozostaa cz kodu funkcji 



 
jest taka sama jak w funkcji omawianej przy okazji projektu \Texture\TexBumpTranslate.
Wartoci luminancji odpowiadaj poziomom 0 255. Tekstur wichrujc z luminancj
przedstawia rysunek 10.13.
Zanim przeprowadzimy renderowanie obiektu, tekstura wichrujca z luminancj wymaga
dwch dodatkowych parametrw: wspczynnika skalowania (flaga   
)
i offsetu (flaga    ) dla luminancji:

114

Aplikacje Direct3D

Rysunek 10.13.
Przykadowa tekstura
wichrujca z luminancj
(format L6V5U5)


   <  +*!78 !310'J%""#

   <  +*!7833 !310<',%""#

Natenie piksela w tym przypadku jest obliczane wedug wzoru:

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!"#

i mona wykona rendering.

Tekstura wichrujca i tekstura otoczenia


Przykady z poprzedniego podrozdziau zmodyfikujemy w ten sposb, e zamiast tekstury obiektu bdzie stosowana tekstura otoczenia. W slocie 0 pozostaje tekstura wichrujca, a w slocie 1 znajdzie si tekstura otoczenia. Naley ustawi urzdzenie, aby
generowao automatycznie wsprzdne dla tekstury o indeksie 1:

   @ !)+!7 3*3E 33+7L
33M!!"#

   @ !)7!) 
*! !7*L@"#

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).

Rozdzia 10.  Tekstury

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

za przykad z katalogu \Texture\EnvMappingBump2p dotyczy parametrw (rysunek 10.16):



   @ !)+!7 3*3E 33+7L
33M!!"#

   @ !)7!) 
*! ! 7L@"#

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

Tekstura obiektu, wichrujca i otoczenia


czenie trzech tekstur wymaga trzech slotw. Sprawdzamy, czy s one dostpne:
%& * /- &4"
-!3#

W slocie 0 umieszczamy tekstur obiektu, w slocie 1 tekstur wichrujc, a w slocie 2


tekstur otoczenia. Wprowadzamy nastpujce ustawienia we wszystkich trzech slotach:

   < !)7!)<"#

   < *+!"#

   < E@!)+!"#

   < E33+ !"#

   < $ !!E@"#

   < $E@!)+!"#

   @ !)7!)@"#

   @  +*!78*"#

   @ E@!)+!"#

   @ E+!7"#

   @ $ !!E@"#

   @ $E@!)+!"#

    "#

    E@!)+!"#

    E+!7"#

    $  !"#

    !)+!7 3*3E 33+7L
33M!!"#

    !)7!) 
*! ! 7L"#

Rozdzia 10.  Tekstury

117

W slocie 2 wprowadzilimy zmienn 



, aby mona byo zmienia operacj czenia tekstur. Projekt z katalogu \Texture\TexEnvMapBump, przedstawiony na rysunku 10.17,
umoliwia podgldanie czenia trzech tekstur. Uytkownik moe wybra jedn z dziewiciu tekstur (trzy moliwoci dla tekstury obiektu, trzy dla tekstury otoczenia i trzy dla tekstury wichrowania). Przeczniki trybu czenia tekstur zmieniaj operacje w slocie 2.
Rysunek 10.17.
Aplikacja MFC
pozwala wybra
dowoln tekstur
otoczenia,
wichrujc, obiektu
oraz sposb
czenia tekstur

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#

Struktura werteksa z trzema wsprzdnymi tekstury ,  i  wyglda w ten sposb:


&
!38!!)
C
3;N#
32#
D#

Deklaracja FVF ma posta:


K% -383!38!!)383)=OL383!)@L383!) O!<""

118

Aplikacje Direct3D
Deklarujemy wskanik do struktury tekstury przestrzennej:
 A
!8+*!!)+!>#

i inicjalizujemy w konstruktorze wartoci . Na kocu dziaania aplikacji zwalniamy


zasoby interfejsu tekstury:
3!!! !"#

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#

Drugim argumentem jest zdefiniowana wczeniej przez programist funkcja wypeniajca


tekstur. Oto przykad implementacji takiej funkcji:
83 //*;81/)8!,B)8!B11)8!B/ N
8"
C
 511 #
 ;511 ;#
 N511 N#
D

Funkcja ta w pierwszym parametrze zawiera struktur tekstury rgba do wypenienia,


o wsprzdnej tekstury okrelonej w drugim parametrze. Trzeci parametr to wielko
teksela, czwarty to warto, ktr przekaza programista w trzecim parametrze wywoania
funkcji ' &. W tym przypadku bdzie to . Przykad przepisuje
pozycje w teksturze do wartoci kolorw.
Ustawiamy tekstur w slocie 0. W metodzie &  zmieniamy wsprzdn w, w efekcie wywietlane bd kolejne przekroje tekstury na czworokcie:
!38!!)B8
&#
% +!!!8 1
:<,B& N1%!38!!)" =!BB"(8
&<"""
C
%1 - 5<# 4,# GG"
8
&P Q'25% #
8 +-/1
:"#
D

Wynik dziaania programu przedstawia rysunek 10.18.


W projekcie z katalogu \Texture\TexVolume1 zastosowalimy rotacj wsprzdnych tekstury, tak e na czworokcie wywietlane s rne przekroje tekstury przestrzennej. Kod
pokazuje, jak zmieniaj si wsprzdne tekstury:

Rozdzia 10.  Tekstury

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

Funkcja "( &


) przeksztaca wektor trzyelementowy, okrelony w drugim argumencie, przez uprzednio przygotowan macierz  .
Rysunek 10.19 przedstawia wynik dziaania programu.

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

Sprawdzamy, czy urzdzenie obsuguje operacje 


 
:
%6& &(!) +""
-!3#

W slocie 1 umieszczamy tekstur obiektu, ktra bdzie czona z tekstur wynikow owietlenia ze slotu 0:

   < !)7!)<"#

   < E@!)+!"#

   < +"#

   < E3"#

   < $  !"#

   @ !)7!)@"#

   @ E@!)+!"#

   @ "#

   @ E+!7"#

   @ $  !"#

Rozdzia 10.  Tekstury

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"#

Wspczynnik ten jest zmienny w czasie, co oznacza przemieszczanie si wiata. Wynik


dziaania programu przedstawia rysunek 10.21. Uytkownik moe dobra za pomoc jednego z przecznikw z okna dialogowego operacj czenia mapy owietlenia z tekstur obiektu.
Rysunek 10.21.
Wykorzystanie
tekstury z wektorami
normalnymi

122

Aplikacje Direct3D

Mapy wektorw normalnych


i wektorw wichrujcych
Teraz zajmiemy si sposobem generowania tekstur z wektorami normalnymi (NormalMap)
oraz tekstur z wektorami wichrujcymi (BumpMap). Wykorzystanie tekstur z wektorami
normalnymi zostao omwione w czci dotyczcej map z owietleniem, za tekstur z wektorami wichrujcymi podczas analizy zagadnie zwizanych z teksturami wichrujcymi.
Tekstury z wektorami normalnymi i wektorami wichrujcymi bd generowane na podstawie zwykej tekstury. W pierwszym etapie naley znale gradient w kierunku X i w kierunku Y w bitmapie. Teoria przetwarzania obrazw oferuje wiele masek do obliczania gradientu (rysunki 10.22a, b i c).
Rysunek 10.22a.
Maski Prewitta

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:

[1,0, dX ] [0,1, dY ] = [ dX ,dY ,1]


Otrzymany wektor jest gradientem dla danego punktu w obrazie. Jego skadowe x i y
wykorzystujemy jako dane dla wektora wichrujcego, za trzy skadowe jako wektor normalny. Dane te naley odpowiednio spakowa do skadowych r i g dla tekstury wichrujcej (signed char) oraz do skadowych r, g i b dla tekstury z wektorami normalnymi
(BYTE). Fragment kodu przedstawia przygotowanie tekstury wichrujcej:
%10;5<#;4&
'$ 9#;GG"
C
%105<#4&
'0 9#GG"
C
&:=5; @"U&
'$ 9#
&:)5 @"U&
'0 9#

Rozdzia 10.  Tekstury

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).

You might also like