Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
OpenGL.
Programowanie gier
Autorzy: Kevin Hawkins, Dave Astle
Tumaczenie: Jaromir Senczyk
ISBN: 83-7361-035-9
Tytu oryginau: OpenGL Game Programming
Format: B5, stron: 630
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
List od wydawcy serii.............................................................................15
O Autorach............................................................................................17
Przedmowa............................................................................................19
Wprowadzenie .......................................................................................21
Cz I
Cz II
Korzystanie z OpenGL............................................................91
Spis treci
Spis treci
10
Spis treci
11
12
Spis treci
13
14
Dodatki ...............................................................................................597
Dodatek A Zasoby sieci Internet...........................................................................599
Programowanie gier..................................................................................................... 599
GameDev.net........................................................................................................ 599
Wyszukiwarka informacji zwizanych z programowaniem gier ................................. 600
flipCode ............................................................................................................... 600
Gamasutra ............................................................................................................ 600
OpenGL ..................................................................................................................... 600
NeHe Productions ................................................................................................. 600
OpenGL.org.......................................................................................................... 601
Inne strony powicone OpenGL ............................................................................ 601
DirectX ...................................................................................................................... 601
DirectX Developer Center ...................................................................................... 601
Lista mailingowa DirectX ...................................................................................... 601
Inne zasoby ................................................................................................................ 602
ParticleSystems.com.............................................................................................. 602
Real-Time Rendering............................................................................................. 602
Informacja techniczna dla programistw.................................................................. 602
Artykuy dotyczce efektu mgy.............................................................................. 602
Skorowidz............................................................................................605
Rozdzia 9.
Zaawansowane
odwzorowania tekstur
W rodziale tym przedstawione zostan zaawansowane techniki tworzenia tekstur, ktre
pozwol kolejny raz na zwikszenie realizmu tworzonej grafiki. Omwione zostan nastpujce zagadnienia:
tekstury wielokrotne;
mapy otoczenia;
macierz tekstur;
mapy owietlenia;
Tekstury wielokrotne
Dotychczas wykorzystywana bya pojedyncza tekstura dla kadego wielokta. OpenGL
umoliwia jednak pokrycie wielokta sekwencj tekstur, czyli tworzenie tekstur wielokrotnych. Moliwo ta stanowi obecnie jedynie rozszerzenie specyfikacji OpenGL. Rozszerzenia interfejsu programowego OpenGL zatwierdzane s przez rad ARB (Architectural Review Board) nadzorujc rozwj specyfikacji OpenGL. Tekstury wielokrotne
stanowi opcjonalne rozszerzenie OpenGL i nie s dostpne w kadej implementacji.
Tekstury wielokrotne tworzone s za pomoc sekwencji jednostek tekstury. Jednostki
tekstury omwione zostan szczegowo w dalszej czci rozdziau. Obecnie wystarczy
jedynie informacja dotyczca tego, e kada jednostka tekstury reprezentuje pojedyncz
tekstur, a take to, e podczas tworzenia tekstury wielokrotnej kada jednostka tekstury
przekazuje wynik jej zastosowania kolejnej jednostce tekstury a do utworzenia kocowej
tekstury wielokrotnej. Rysunek 9.1 ilustruje proces tworzenia tekstur wielokrotnych.
238
Cz II Korzystanie z OpenGL
Rysunek 9.1.
Tekstura wielokrotna
powstaje na skutek
naoenia na wielokt
wicej ni jednej
tekstury za pomoc
jednostek tekstur
tekstur wielokrotnych.
2. Uzyskanie wskanika funkcji rozszerzenia.
3. Tworzenie jednostki tekstury.
4. Okrelenie wsprzdnych tekstury.
Funkcja ta zwraca warto , jeli nazwa rozszerzenia znajduje si w acuchu
lub warto "# w przeciwnym razie.
acuch zwrcony przez funkcj
mona take przeszuka indywidualnie.
Oto przykad implementacji odpowiedniej funkcji:
239
Funkcja ta zwraca warto , jeli acuch zawiera acuch # przy zaoeniu, e skada si z podacuchw oddzielonych znakami spacji. Aby sprawdzi,
czy dana implementacja umoliwia stosowanie tekstur wielokrotnych, mona skorzysta
ostatecznie z poniszego fragmentu kodu:
"" ,+
%%%'
"" + , ,+
%%%'
(
6789 9
! 16:;<631
"" # . ,+
4
tekstur wielokrotnych;
240
Cz II Korzystanie z OpenGL
Po wykonaniu tego kodu mona tworzy tekstury wielokrotne za pomoc funkcji '
!!&(" i ).
D6?:76878@;6@986:;< 238@
241
:D8:;<6878@;)6:;<
6878@;6BA
:D8:;<6878@;56:;<
6878@;6BA
Powyszy fragment kodu tworzy najpierw dwa obiekty tekstur, a nastpnie kreuje za ich
pomoc dwie jednostki tekstur uywane do tworzenia tekstur wielokrotnych.
Inne wersje tej funkcji umoliwiaj okrelenie wsprzdnych tekstu jedno-, trj- oraz
czterowymiarowych take za pomoc wartoci innych typw ni "!#. Na przykad
funkcja ' !!&-& pozwala okreli wsprzdne tekstury trjwymiarowej za pomoc wartoci typu &!.. Korzystajc z tych funkcji naley poda najpierw
jednostk tekstury, a nastpnie jej wsprzdne. Oto przykad:
242
Cz II Korzystanie z OpenGL
okreli najpierw wsprzdne wszystkich uywanych jednostek tekstur, a dopiero potem zdefiniowa wierzchoek. Ilustruje to poniszy fragment kodu:
<
6O@:A
"" # #%
&
?8B!:;<6878@;)6:;< )G)! )G)!
?8B!:;<6878@;56:;< )G)! )G)!
CP!MQG)! MQG)! MQG)!
"" +# #%
&
?8B!:;<6878@;)6:;< 5G)! )G)!
?8B!:;<6878@;56:;< 5G)! )G)!
CP!QG)! MQG)! MQG)!
"" +#
L #%
&
?8B!:;<6878@;)6:;< 5G)! 5G)!
?8B!:;<6878@;56:;< 5G)! 5G)!
CP!QG)! QG)! MQG)!
"" #
L #%
&
?8B!:;<6878@;)6:;< )G)! 5G)!
?8B!:;<6878@;56:;< )G)! 5G)!
CP!MQG)! QG)! MQG)!
Fragment ten rysuje kwadrat pokryty dwiema teksturami. Dla kadego wierzchoka definiuje wsprzdne obu tekstur.
Naley pamita, e przy stosowaniu tekstur wielokrotnych funkcja !!&(" pozwala na zdefiniowanie wsprzdnych tekstury tylko dla pierwszej jednostki tekstury.
W takim przypadku wywoanie funkcji !!&(" jest wic rwnowane wywoaniu ' !!&("
+,01///.
243
R /
"
G
N "" # +
&L## +
R /
"
G
N "" +
&L## @
R 1
G
1 "" +
&L## %%%' +
"""""" 8+
+!
#
"" %TU
"" #TU
A ""
""
4 6
"""""" V3
WA
6WA ""
%.%
! ( ! "" ( +&#
"" ! ( #
=EBQIF "" +%T,U #%
!
( )G)! "" .
! ( )G)! "" . 3 #
"""""" V3 3% 3
37 3K "" #+L&%, 3%
! 37 3K 3V "" #+L&%, 3
! 7 K V "" + ## 3
"""""" V3
6 38
6
8
"""""" V3 %#.% % 3 #3
=>9?@887 ;AB>:;<=;
?8B!:;< ( 9@
=>9:8C878@;:;<=;
:D8:;< ( 9@
=>998:8C878@;:;<=;
:D8:;< ( 9@
38@ ( ) "" +%% % 0
Plik nagwkowy glext.h naley docza wtedy, gdy korzysta si z jakichkolwiek rozszerze OpenGL zatwierdzonych przez ARB. Plik ten zawiera definicje wszystkich rozszerze. Jego kopia umieszczona zostaa take na dysku CD.
Powyszy fragment kodu prezentuje take sposb wykorzystania struktur do przechowywania informacji o teksturze i jej danych. Typ umoliwia zapamitanie
obiektu tekstury, jej szerokoci i wysokoci oraz danych. Upraszcza to proces adowania
i stosowania tekstur w OpenGL.
Omawiany program bdzie umoliwia sterowanie kamer OpenGL w podobny sposb
do programu prezentujcego rzeb terenu, ktry przedstawiony zosta w rozdziale 8.
Gdy mysz bdzie porusza si poziomo, szecian bdzie obracany wok osi y. Natomiast przy wykonywaniu pionowych ruchw mysz, mona spowodowa oddalanie si
bd przyblianie kamery do szecianu.
Pierwsz z funkcji, ktr definiuje program, jest omwiona ju wczeniej funkcja
.
Zwraca ona warto , jeli acuch # zostanie odnaleziony wewntrz acucha , ktry zawiera wiele nazw oddzielonych znakami spacji.
244
Cz II Korzystanie z OpenGL
!"" #$
% &'
( )
! ( * "" % &'
"" +, ## - .
, ' &'
#
/ !
"" 00 +&- 0
% +0
( + 1 1
"" +#% % #%0 +%#. %#,
!
(( 22 3+
(( )
4
"" 0 +%# %# +%#3 #$ 00 %#
*( * 5
4
!
4
245
Jako e opanowana ju zostaa umiejtno adowania tekstury, mona zapozna si z kolejn funkcj, ktra moe zaadowa wszystkie tekstury uywane w programie i skonfigurowa je tak, by moliwe byo ich wykorzystanie do tworzenia tekstur wielokrotnych.
Funkcja
!#& aduje wszystkie tekstury, okrela ich parametry, tworzy mipmapy i wie obiekty tekstur z jednostkami tekstur.
:8
"" &0 +#%. ,
38 ( 8>13G3+1
! 38 (( 9@
!
"" &0
. ,
8 ( 8>1
G3+1
!
8 (( 9@
!
"" #% 3+3+ % !#3 #3 +#%0
<86878@;6BA 38MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
246
Cz II Korzystanie z OpenGL
8D6878@;69C 6878@;69C6? A 6;=:
<BA?+3+6878@;6BA 6;< 38MN#
38MN
6;< 6@99A6<K8 38MN
"" #% 3+3+ % !#3 #3
0
<86878@;6BA
8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8=36878@;6BA 6878@;6H;:=6 6;=:8
8=36878@;6BA 6878@;6H;:=68 6;=:8
8D6878@;69C 6878@;69C6? A 6? A@:8
<BA?+3+6878@;6BA 6;<
8MN#
8MN
6;< 6@99A6<K8
8MN
"" # +#%. 0,
:D8:;<6878@;)6:;<
6878@;6BA
<86878@;6BA 38MNA "" #.- 0, % +#%. .
"" #
. 0,
:D8:;<6878@;56:;<
6878@;6BA
<86878@;6BA
8MNA "" #.- 0, %
. .
4
Funkcja
# 4 inicjuje dane programu:
D %
)G)! )G)! )G)! )G)! "" & # %3 %
?6? 8W "" #
&
6A=8W688 "" #
+#%
6@6>: "" %' #%
#.L#
>>6H "" #% +0. +%. #%
&L#
"" +%#
#%L# %
6878@;6BA "" #&.% ##3#
?8
:8
4
247
248
Cz II Korzystanie z OpenGL
?8B!:;<6878@;)6:;< 5G)! 5G)!
?8B!:;<6878@;56:;< 5G)! 5G)!
CP!M)GQ! )GQ! )GQ!
?8B!:;<6878@;)6:;< )G)! 5G)!
?8B!:;<6878@;56:;< )G)! 5G)!
CP!M)GQ! )GQ! M)GQ!
?8B!:;<6878@;)6:;< )G)! )G)!
?8B!:;<6878@;56:;< )G)! )G)!
CP!M)GQ! M)GQ! M)GQ!
?8B!:;<6878@;)6:;< 5G)! )G)!
?8B!:;<6878@;56:;< 5G)! )G)!
CP!M)GQ! M)GQ! )GQ!
<
6O@:A
93P!)G)! M5G)! )G)! "" T
?8B!:;<6878@;)6:;< 5G)! )G)!
?8B!:;<6878@;56:;< 5G)! )G)!
CP!M)GQ! M)GQ! )GQ!
?8B!:;<6878@;)6:;< 5G)! 5G)!
?8B!:;<6878@;56:;< 5G)! 5G)!
CP!M)GQ! M)GQ! M)GQ!
?8B!:;<6878@;)6:;< )G)! 5G)!
?8B!:;<6878@;56:;< )G)! 5G)!
CP!)GQ! M)GQ! M)GQ!
?8B!:;<6878@;)6:;< )G)! )G)!
?8B!:;<6878@;56:;< )G)! )G)!
CP!)GQ! M)GQ! )GQ!
<
6O@:A
93P!)G)! )G)! M5G)! "" T
?8B!:;<6878@;)6:;< )G)! )G)!
?8B!:;<6878@;56:;< )G)! )G)!
CP!)GQ! M)GQ! M)GQ!
?8B!:;<6878@;)6:;< 5G)! )G)!
?8B!:;<6878@;56:;< 5G)! )G)!
CP!M)GQ! M)GQ! M)GQ!
?8B!:;<6878@;)6:;< 5G)! 5G)!
?8B!:;<6878@;56:;< 5G)! 5G)!
CP!M)GQ! )GQ! M)GQ!
?8B!:;<6878@;)6:;< )G)! 5G)!
?8B!:;<6878@;56:;< )G)! 5G)!
CP!)GQ! )GQ! M)GQ!
=+?
4
249
Po umieszczeniu omwionych funkcji w szkielecie standardowej aplikacji systemu Windows uzyskany zostanie program, ktrego dziaanie ilustruje rysunek 9.3.
Rysunek 9.3.
Przykad
zastosowania
tekstury wielokrotnej
250
Cz II Korzystanie z OpenGL
Odwzorowanie otoczenia
Odwzorowanie otoczenia polega na stworzeniu obiektu, ktrego powierzchnia wydaje
si odbiciem jego otoczenia. Na przykad doskonale wypolerowana srebrna kula odbija
bdzie na swojej powierzchni elementy otaczajcego j wiata. Wanie taki efekt mona
uzyska stosujc odwzorowanie otoczenia. W tym celu nie trzeba jednak wcale tworzy
obrazu odbicia otoczenia na powierzchni efektu. W OpenGL wystarczy jedynie utworzy tekstur reprezentujc otoczenie obiektu, a OpenGL automatycznie wygeneruje
odpowiednie wsprzdne tekstury. Zmiana pooenia obiektu wymaga wyznaczenia
nowych wsprzdnych tekstury, by mona byo uzyska efekt odbicia zmieniajcego si
razem z poruszajcym si obiektem.
Najlepszy efekt zastosowania odwzorowania otoczenia uzyska mona uywajc tekstur
utworzonych za pomoc rybiego oka. Zastosowanie takich tekstur nie jest absolutnie
konieczne, ale znacznie zwiksza realizm odwzorowania otoczenia. Wsprzdne tekstury mona te oblicza indywidualnie, jednak zmniejsza to zwykle efektywno tworzenia grafiki.
Aby skorzysta w OpenGL z moliwoci odwzorowania otoczenia, niezbdny jest poniszy fragment kodu:
6878@;696
6878@;6968
"" ,+ # , % 0
Torus na niebie
Omwiony teraz zostanie przykad zastosowania moliwoci odwzorowania otoczenia
w programie, ktry rysowa bdzie torus pokryty tekstur otoczenia. Rysunek 9.4 przedstawia kocowy efekt dziaania programu.
Tekstur otoczenia utworzy mona na podstawie tekstury nieba, do ktrej zastosowany
zostanie efekt rybiego oka za pomoc dowolnego edytora obrazw dysponujcego tak
moliwoci. Rysunek 9.5 przedstawia otrzyman tekstur otoczenia.
251
Rysunek 9.4.
Torus pokryty
tekstur otoczenia
Rysunek 9.5.
Tekstura otoczenia
uzyskana
na podstawie
tekstury nieba
Teraz naley przyjrze si kodowi programu. Poniej przedstawione zostay jego fragmenty zwizane z tworzeniem tekstur i rysowaniem grafiki:
+!
#
"" %TU
"" #TU
A ""
""
4 6
GGG
!
( )G)! "" .
6 D8 "" %
6 8 ""
GGG
:8
"" &0 % %
D8 ( 8>1M+
G3+1
! D8 (( 9@
!
8 ( 8>1G3+1
! 8 (( 9@
!
252
Cz II Korzystanie z OpenGL
"" #% 3+3+ % !#3 #3 %
<86878@;6BA D8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8=36878@;6BA 6878@;6H;:=6 6;=:8
8=36878@;6BA 6878@;6H;:=68 6;=:8
<BA?+3+6878@;6BA 6;< D8MN#
D8MN
6;< 6@99A6<K8 D8MN
"" #% 3+3+ % !#3 #3
<86878@;6BA 8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8=36878@;6BA 6878@;6H;:=6 6;=:8
8=36878@;6BA 6878@;6H;:=68 6;=:8
<BA?+3+6878@;6BA 6;< 8MN#
8MN
6;< 6@99A6<K8 8MN
4
GGG
D ;
"" %#,% .
!
N PI)G)!
( )G)!
(
* )GB!
"" +L- !
&,
6 ;6<@>>;6<8 Y 6A=8W6<@>>;6<8
<86878@;6BA 8MNA
<
6O@:A
8B!)G)! )G)!
CP!MB))G)! MB))G)! M5B)G)!
8B!5G)! )G)!
CP!B))G)! MB))G)! M5B)G)!
8B!5G)! 5G)!
CP!B))G)! B))G)! M5B)G)!
8B!)G)! 5G)!
CP!MB))G)! B))G)! M5B)G)!
"" #
#%
,3 #%
& #+L&%,
8!)G)! )G)! M5))G)!
;!
5G)! )G)! )G)!
;!
)G)! 5G)! )G)!
;!
)G)! )G)! 5G)!
"" !
0 #%# %
8!6 6878@;696? A 6=W;6?:=
8!68 6878@;696? A 6=W;6?:=
6878@;696
6878@;6968
253
Macierze tekstur
W rozdziale 5. omwione zostay sposoby wykonywania przeksztace wierzchokw,
takich jak przesunicie, obrt i skalowanie za pomoc macierzy modelowania. Przedstawiona zostaa take koncepcja stosu macierzy umoliwiajca hierarchiczne tworzenie
grafiki.
Takie same moliwoci w przypadku tekstur OpenGL udostpnia za pomoc macierzy
tekstur i stosu macierzy tekstur. Na przykad funkcj #
#" mona zastosowa
do przesunicia tekstury na odpowiedni powierzchni. Podobnie funkcj !#"
mona wykorzysta do obrotu ukadu wsprzdnych tekstury i uzyska w efekcie obrt
tekstury. Gra American McGees Alice firmy Electronic Arts and Rogue Entertainment jest najlepszym przykadem niezwykych efektw, jakie mona osign poprzez
manipulacje macierz tekstur.
Wykonywanie operacji na macierzach tekstur jest bardzo atwe. Stosuje si w tym celu
udostpniane przez OpenGL funkcje ''# , % '# , %!3'#
oraz funkcje przeksztace. Najpierw jednak trzeba poinformowa maszyn OpenGL,
e wykonywane bd operacje na macierzy tekstur:
??6878@;
Od tego momentu na macierzy tekstur i stosie macierzy tekstur mona wykonywa dowolne operacje. Po ich zakoczeniu naley poleci maszynie OpenGL powrt do macierzy modelowania, aby zamiast tekstur przeksztaca obiekty.
Poniej zaprezentowany zosta fragment kodu ilustrujcy sposb wykonywania obrotu
tekstury:
"" +L- !
&,
"" # +0 3%
??6878@;
254
Cz II Korzystanie z OpenGL
;!
)G)! )G)! 5G)! "" ,
"" +%# +0 3% 3#
??6? ACH
<
6O@:A
8B!)G)! )G)!
CP!MB)G)! MB)G)! MJ)G)!
8B!5G)! )G)!
CP!B)G)! MB)G)! MJ)G)!
8B!5G)! 5G)!
CP!B)G)! B)G)! MJ)G)!
8B!)G)! 5G)!
CP!MB)G)! B)G)! MJ)G)!
Kod ten wybiera najpierw macierz tekstury jako biec macierz. Nastpnie aduje do
niej macierz jednostkow, zanim zastosuje do biecej macierzy funkcj obrotu !#
". Na skutek jej uycia tekstura zostaje obrcona o pewien kt wzgldem osi z. Po
wykonaniu obrotu wybiera macierz modelowania jako biec macierz i rysuje czworokt pokryty obrcon tekstur. Proste, prawda?
Gdyby po czworokcie zostay narysowane kolejne obiekty, to take zostayby one pokryte obrcon tekstur. Rozwizanie tego problemu zaprezentowane zostao poniej:
"" +L- !
&,
"" # +0 3%
??6878@;
;!
)G)! )G)! 5G)! "" ,
"" +%# +0 3% 3#
??6? ACH
<
6O@:A
8B!)G)! )G)!
CP!MB)G)! MB)G)! MJ)G)!
8B!5G)! )G)!
CP!B)G)! MB)G)! MJ)G)!
8B!5G)! 5G)!
CP!B)G)! B)G)! MJ)G)!
8B!)G)! 5G)!
CP!MB)G)! B)G)! MJ)G)!
"" 0 3% ,+
L#
??6878@;
??6? ACH
"" 0 ,+
GGG
255
Mapy owietlenia
Zadaniem map owietlenia jest symulacja statycznego owietlenia powierzchni. Mapa
owietlenia jest tekstur, ktra opisuje sposb owietlenia powierzchni. Mapy owietlenia znajduj coraz powszechniejsze zastosowanie dziki wprowadzeniu sprztowej obsugi tekstur wielokrotnych. Cho mapy owietlenia stosowane s gwnie w celu uzyskania efektu statycznego owietlenia, mona je wykorzysta take do tworzenia cieni.
Rysunek 9.6 przedstawia map owietlenia symulujc efekt strumienia wiat padajcego na powierzchni pod ktem prostym. Jeli pokryty ni zostanie wielokt, to uzyskany
zostanie efekt owietlenia strumieniem wiata prostopadym do jego powierzchni.
Rysunek 9.6.
Przykad mapy
owietlenia
Mapy owietlenia s teksturami wykorzystujcymi jedynie odcienie szaroci. Aby uzyska efekt owietlenia, map tak naley poczy z tekstur pokrywajc wielokt.
256
Cz II Korzystanie z OpenGL
adujc map owietlenia z pliku naley zadba o to, by jej piksele opisane byy za pomoc odcieni szaroci. Poniej zamieszczona zostaa zmodyfikowana wersja funkcji
!
#& #32 adujcej map owietlenia z 24-bitowego pliku BMP jako obraz w odcieniach szaroci:
<3+
!3 <8?:=9> W:A; 3+!W
> != "" #$ +%0 +
<8?:=>W:A;3+>W ""
&L# +
3+3
"" %
3
( ) "" % +
3+;< "" %3 %3 &#
3
"" % #
%T
"" % + #
%T
"" # + # 1 1
!= ( !+!3 11
! != (( 9@
9@
"" #%0
&L# +
!23+>W %!<8?:=>W:A; 5 !=
"" +#% % 0 + !3 <?=
! 3+>WG!8+ Z( <8?:=6A
!!=
9@
4
"" #%0
&L# %
!3+!W %!<8?:=9> W:A; 5 !=
"" # #$ +%0 + +%.
%
!!= 3+>WG! !!< [68
"" +%% +3,U !# %
3+3
(
33+!WMN%3
257
83
BA 6878@;6BA ) 6@?9:9 #
) 6@?9:9
6@99A6<K8
3+A
Aby zastosowa map owietlenia, naley posuy si mechanizmem tekstur wielokrotnych i wczy tryb nakadania tekstury
'5+
. Trzeba zatem przyjrze si najistotniejszym fragmentom kodu tego programu:
+!
#
"" %TU
"" #TU
A ""
""
4 6
""
6
8 "" 3+ T#
6
3+8 "" %
#
"" !0 #% #
=>9?@887 ;AB>:;<=;
?8B!:;< ( 9@
=>9:8C878@;:;<=;
:D8:;< ( 9@
=>998:8C878@;:;<=;
:D8:;< ( 9@
38@ ( )
?8
"" ,+
%%%'
258
Cz II Korzystanie z OpenGL
(
6789 9
! (( 9@
!
! 16:;<631
"" + +%%. %, 0
D6?:76878@;6@986:;< 238@
"" + !0 #% #
?8B!:;< ( =>9?@887 ;AB>:;<=;
#
=:1
?8B!:;<1
:D8:;< ( =>9:8C878@;:;<=;
#
=:1
:D8:;<1
:D8:;< ( =>998:8C878@;:;<=;
#
=:1
:D8:;<1
4
!
4
Funkcja
' sprawdza dostpno mechanizmu tworzenia tekstur wielokrotnych dla danej implementacji OpenGL. Tym razem wykorzystuje ona funkcj ,
ktra zwraca warto +
, jeli drugi z jej parametrw nie jest podacuchem pierwszego.
Kolejn z funkcji jest omwiona wczeniej funkcja adowania mapy owietlenia z pliku:
<3+
!3 <8?:=9> W:A; 3+!W
> != "" #$ +%0 +
<8?:=>W:A;3+>W ""
&L# +
3+3
"" %
3
( ) "" % +
3+;< "" %3 %3 &#
3
"" % #
%T
"" % + #
%T
"" # + # 1 1
!= ( !+!3 11
! != (( 9@
9@
"" #%0
&L# +
!23+>W %!<8?:=>W:A; 5 !=
"" +#% % 0 + !3 <?=
! 3+>WG!8+ Z( <8?:=6A
!!=
9@
4
259
"" #%0
&L# %
!3+!W %!<8?:=9> W:A; 5 !=
"" # #$ +%0 + +%.
%
!!= 3+>WG! !!< [68
"" +%% +3,U !# %
3+3
(
33+!WMN%3
Nastpna funkcja,
!#&
#3, przypomina funkcj
!#&2 z poprzednich przykadw, ale korzysta z usug funkcji adowania mapy owietlenia
!#
#3:
6 8>
!3
<8?:=9> W:A; !
6
8
260
Cz II Korzystanie z OpenGL
"" +%% +3,U % + 6
8 ( 63%!6
!
8 (( 9@
9@
"" &0 % +#% ++# # 0 +0
8MN ( <3+!3 2!
!
8MN (( 9@
!
8
9@
4
"" 3%% !30 %T #T
8MN#
( !GH
8MN
( !GW
"" #%
85 2
8MNA
8
4
Rwnie funkcja
!#& , ktra prezentowana jest poniej, zostaa zmodyfikowana pod ktem uycia mapy owietlenia, dla ktrej w odrnieniu od zwykych
tekstur naley zastosowa wartoci
+' i
'5+
:
:8
"" &0 , %
#
8 ( 8>1
G3+1
!
8 (( 9@
!
"" &0 3+, T#
3+8 (
3+13+G3+1
!
3+8 (( 9@
!
"" #% , %
#
<86878@;6BA
8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8=36878@;6BA 6878@;6H;:=6 6;=:8
8=36878@;6BA 6878@;6H;:=68 6;=:8
8D6878@;69C 6878@;69C6? A 6;=:
<BA?+3+6878@;6BA 6;<
8MN#
8MN
6;< 6@99A6<K8
8MN
"" #% 3+, T#
<86878@;6BA
3+8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8D6878@;69C 6878@;69C6? A 6? A@:8
<BA?+3+6878@;6BA 6@?9:9
3+8MN#
3+8MN
6@?9:9 6@99A6<K8
3+8MN
261
Pozostaa cz kodu jest identyczna z pierwszym przykadem programu tworzenia tekstur wielokrotnych.
A+ ?68;@
A6<9A
Poprzez zmian sposobu czenia kolorw uzyska mona efekt tekstury wielokrotnej.
Ponisze fragmenty kodu pokazuj, w jaki sposb mona uzyska w wielu przebiegach
taki sam efekt jak w przypadku pierwszego przykadu tekstur wielokrotnych:
262
Cz II Korzystanie z OpenGL
:8
"" &0 % +#%0
38 ( 8>13G3+1
! 38 (( 9@
!
"" &0 %
0
8 ( 8>1
G3+1
!
8 (( 9@
!
"" #% +#%. ,
<86878@;6BA 38MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8D6878@;69C 6878@;69C6? A 6;=:
<BA?+3+6878@;6BA 6;< 38MN#
38MN
6;< 6@99A6<K8 38MN
"" #%
. ,
<86878@;6BA
8MNA
8=36878@;6BA 6878@;6?:6>8; 69:;
8=36878@;6BA 6878@;6?96>8; 69:;
8=36878@;6BA 6878@;6H;:=6 6;=:8
8=36878@;6BA 6878@;6H;:=68 6;=:8
8D6878@;69C 6878@;69C6? A 6? A@:8
<BA?+3+6878@;6BA 6;<
8MN#
8MN
6;< 6@99A6<K8
8MN
4
D A#8! = ! = ! %=
=
?
8!= = %=
<
6O@:A
93P!)G)! 5G)! )G)! ""
L T
8B!5G)! )G)!
CP!)GQ! )GQ! )GQ!
8B!5G)! 5G)!
CP!)GQ! )GQ! M)GQ!
8B!)G)! 5G)!
CP!M)GQ! )GQ! M)GQ!
8B!)G)! )G)!
CP!M)GQ! )GQ! )GQ!
<
6O@:A
93P!)G)! )G)! 5G)! "" +% T
8B!5G)! 5G)!
CP!)GQ! )GQ! )GQ!
263
264
Cz II Korzystanie z OpenGL
8B!)G)! )G)!
CP!)GQ! M)GQ! M)GQ!
8B!5G)! )G)!
CP!M)GQ! M)GQ! M)GQ!
8B!5G)! 5G)!
CP!M)GQ! )GQ! M)GQ!
8B!)G)! 5G)!
CP!)GQ! )GQ! M)GQ!
=+?
4
D ;
( !=
MS)G)!"5X)G)!
"" #%% +&- 3
37 ( 7 * 3K
3V ( V * 3K
3K ( K * 3K " BG)!
"" ##0 3, # + )))
7 ( )G)!
K ( )G)!
V ( )G)!
"" +L- !
&,
6 ;6<@>>;6<8 Y 6A=8W6<@>>;6<8
"" 3%% 3,
:37 3K 3V 7 K V )G) 5G) )G)
"" 0 %T %3L# 5Q5Q5Q
!5QG)! 5QG)! 5QG)!
"" +#% +%
#
<86878@;6BA 38MNA
A#8)G)! )G)! )G)!
""
+%
#
6<9A "" #&.% &.% L#
A+
?6>: "" #&.% %+ !
&,
A+
>6O@:
<>6V; 6;6 ;
<86878@;6BA
8MNA
A#8)G)! )G)! )G)!
"" +%# ++% 3% +
A+
?68;@
A+
>6
A6<9A
>
#+<!!
6WA"" +%&.% !
4
265
Podsumowanie
OpenGL umoliwia pokrycie powierzchni wielokta sekwencj tekstur tworzc tekstur
wielokrotn.
W procesie tworzenia tekstur wielokrotnych wyrni mona cztery etapy: sprawdzenie
dostpnoci tekstur wielokrotnych, uzyskanie wskanikw funkcji rozszerzenia, stworzenie jednostki tekstury i okrelenie wsprzdnych tekstur.
Odwzorowanie otoczenia pozwala rysowa obiekty odbijajce otaczajcy je wiat na podobiestwo wypolerowanej srebrnej kuli.
Stos macierzy tekstur umoliwia wykonywanie przesuni, obrotw i skalowa tekstur.
Przeksztacenia tekstur umoliwiaj uzyskanie ciekawych efektw.
Mapy owietlenia su do symulacji statycznego owietlenia obiektu za pomoc odpowiedniej tekstury reprezentujcej wiato padajce na dan powierzchni.