Professional Documents
Culture Documents
3
kozdz|o 5. Ko|or, moIer|oy | ow|eI|en|e. FodsIowy..............................
Punkt 3
kozdz|o 5. Ko|or, moIer|oy | ow|eI|en|e. FodsIowy.............................. 221
................. 222 Czym jest kolor?...............................................................................................................
wiato jest fal ........................................................................................................................... 222
wiato jako czsteczka............................................................................................................... 222
Nasz osobisty wykrywacz fotonw............................................................................................. 224
Komputer generatorem fotonw.................................................................................................. 224
Sprzt komputerw PC...................................................................................................................... 225
Tryby graficzne komputerw PC....................................................................................................... 227
Rozdzielczo ekranu.................................................................................................................. 227
Gbia kolorw............................................................................................................................ 227
Uywanie kolorw w OpenGL.......................................................................................................... 229
Szecian kolorw......................................................................................................................... 229
Ustalanie koloru rysowania ......................................................................................................... 230
Cieniowanie................................................................................................................................. 231
Ustalanie modelu cieniowania..................................................................................................... 233
Kolory w wiecie rzeczywistym........................................................................................................ 234
wiato otaczajce ....................................................................................................................... 235
wiato rozproszone .................................................................................................................... 235
wiato odbite.............................................................................................................................. 235
A teraz wszystko razem............................................................................................................... 236
Materiay w wiecie rzeczywistym.................................................................................................... 237
Waciwoci materiaw.............................................................................................................. 237
Dodawanie wiata do materiaw............................................................................................... 237
Wyliczanie efektw owietlenia otoczenia.................................................................................. 238
Efekty wiata rozproszenia i odbitego........................................................................................ 238
Dodawanie wiate do sceny.............................................................................................................. 239
Wczenie owietlenia................................................................................................................. 239
Konfigurowanie modelu owietlenia........................................................................................... 239
Ustalanie waciwoci materiaw............................................................................................... 240
Uywanie rde wiata.................................................................................................................... 243
Gdzie jest gra?........................................................................................................................... 244
Normalne powierzchni ................................................................................................................ 244
Definiowanie normalnej .............................................................................................................. 245
Normalne jednostkowe................................................................................................................ 247
Znajdowanie normalnej ............................................................................................................... 248
Konfigurowanie rda................................................................................................................ 249
Ustalanie waciwoci materiaw............................................................................................... 250
Definiowanie wieloktw............................................................................................................ 251
Efekty wietlne .................................................................................................................................. 252
Odbyski ...................................................................................................................................... 253
wiato odbite.............................................................................................................................. 253
Wspczynnik odbicia ................................................................................................................. 254
Wykadnik odbysku ................................................................................................................... 255
Urednianie normalnych.............................................................................................................. 256
A teraz wszystko razem..................................................................................................................... 258
Tworzenie reflektora ................................................................................................................... 259
Rysowanie reflektorw................................................................................................................ 261
Spis treci
Cienie ................................................................................................................................................ 265
Czym jest cie? ........................................................................................................................... 266
Kod prasujcy.............................................................................................................................. 267
Przykad z cieniem...................................................................................................................... 268
Ponowna wizyta w wiecie kul.................................................................................................... 271
Podsumowanie................................................................................................................................... 271
Opisy funkcji ..................................................................................................................................... 272
Spis treci
Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania ................. 241
GLSL 101 ..................................................................................................................................... 242
Zmienne i typy danych ...................................................................................................... 243
Kwalifikatory zmiennych .................................................................................................. 246
Prawdziwy shader ............................................................................................................... 248
Kompilowanie, wizanie i konsolidowanie .................................................................... 252
Praktyczne wykorzystanie shadera .................................................................................. 258
Wierzchoek prowokujcy ................................................................................................ 259
Dane uniform shadera .............................................................................................................. 259
Znajdowanie danych uniform .......................................................................................... 260
Zmienne uniform skalarne i wektorowe ......................................................................... 260
Tablice uniform .................................................................................................................. 261
Macierze uniform ............................................................................................................... 262
Paski shader ........................................................................................................................ 262
Funkcje standardowe ................................................................................................................ 265
Funkcje trygonometryczne ............................................................................................... 265
Funkcje wykadnicze .......................................................................................................... 266
Funkcje geometryczne ....................................................................................................... 267
Funkcje macierzowe ........................................................................................................... 267
Funkcje porwnywania wektorw ................................................................................... 267
Inne czsto uywane funkcje ............................................................................................ 267
Symulowanie wiata ................................................................................................................. 272
wiato rozproszone ........................................................................................................... 272
Shader wiata rozproszonego .......................................................................................... 274
Model owietlenia ADS ..................................................................................................... 278
Cieniowanie Phonga .......................................................................................................... 281
Korzystanie z tekstur ................................................................................................................. 285
Nic, tylko teksele ................................................................................................................. 285
Owietlanie tekseli .............................................................................................................. 287
Anulowanie przetwarzania fragmentw ......................................................................... 289
Teksturowanie w stylu kreskwkowym teksele w roli wiata ................................ 292
Podsumowanie ........................................................................................................................... 294
Rozdzia 9. Zaawansowane odwzorowania tekstur.................................................. 237
Tekstury wielokrotne................................................................................................... 237
Sprawdzanie dostpnoci tekstur wielokrotnych ....................................................... 238
Dostp do funkcji rozszerze.................................................................................. 239
Tworzenie jednostek tekstury................................................................................. 240
Okrelanie wsprzdnych tekstury ......................................................................... 241
Przykad zastosowania tekstur wielokrotnych........................................................... 242
Odwzorowanie otoczenia ............................................................................................. 250
Torus na niebie...................................................................................................... 250
Macierze tekstur.......................................................................................................... 253
Mapy owietlenia ........................................................................................................ 255
Stosowanie map owietlenia................................................................................... 255
Wieloprzebiegowe tekstury wielokrotne........................................................................ 261
Podsumowanie............................................................................................................ 265
74
Rozdzia 4. Obiekty podstawowe
Punkt
Punkt stanowi najwaniejszy element kadej rysowanej sceny.
Wszystkie obiekty rysowane za pomoc procedur OpenGL s
zbudowane z punktw. Punkty te mog wyznacza wierzchoki
obiektw (linia, trjkt) lub stanowi wypenienie tych obiektw.
Za pomoc punktw mona rwnie rysowa wykresy funkcji
matematycznych czy te dowolne figury uoone z kolejnych
punktw. Aby wyznaczy pooenie punktu i jego wielko,
wykorzystuje si specjalne procedury OpenGL. Bardzo wanym
zagadnieniem jest wzajemna zaleno pomidzy punktem ry-
sowanym w OpenGL a pikselem. Piksel jest najmniejszym ob-
szarem ekranu, jaki moe przy rozdzielczoci okrelonej para-
metrami danej karty graficznej w danej chwili by zapalony
(zgaszony). Na rozmiar piksela programista nie ma adnego
wpywu (poza zmian rozdzielczoci ekranu). Punkt natomiast
posiada rozmiar okrelony wielkoci paszczyzny rzutowania
i zadeklarowan wielkoci. Domyln wielkoci punktu jest 1
(jeden), co nie oznacza wcale, e na ekranie bdzie on odpo-
wiada jednemu pikselowi. W przypadku zmiany rozmiaru
paszczyzny rzutowania zmieni si rwnie rozmiar wywie-
tlanego punktu o wielkoci jednostkowej (moe wynosi kilka
lub kilkanacie pikseli). Zagadnienie to jest szczeglnie istotne
przy imporcie obrazkw, jak rwnie podczas wykorzystywa-
nia bitmap, ktrych wymiary s okrelane w pikselach. Rezultat
nieskorelowania wymiarw okna grafiki i paszczyzny rzuto-
wania przedstawia rysunek 4.1.
Rozdzia 4. Obiekty podstawowe | 75
Rysunek 4.1. Zaleno wymiarw wywietlania obiektu, ktrego
wymiary okrelane s w pikselach i w punktach
Obrazek z lewej strony zosta wykonany z wykorzystaniem
procedury glDrawPixels(), tzn. narysowano go pikselami, na-
tomiast ten z prawej strony jest tekstur naoon na kwadrat
o takich samych wymiarach, ale okrelonych w punktach. Wy-
miary obrazka wynosz 128 na 128 pikseli, wymiary kwadratu
128 na 128 punktw. Okno grafiki okrelone procedur
glViewPort() ma wymiary 600 na 600 pikseli, a wymiary pasz-
czyzny rzutowania zdefiniowane procedur glOrtho() wyno-
sz 400 na 400 punktw. Jak wynika z przedstawionego rysunku,
proporcje pomidzy rzeczywistymi rozmiarami rysunku a obiek-
tem o tych samych wymiarach, ale wyraonych w innych jed-
nostkach, s oczywiste. Z powyszego wywodu wynika wic
jasno, e piksel to nie to samo co punkt.
glPointSize()
Deklaracja: procedure glPointSize(Grubo : GLFloat);
Dziaanie: ustala now wielko rysowanych punktw.
76 | OpenGL. Leksykon kieszonkowy
Uwaga
Nowa wielko rysowanych punktw bdzie taka sama
dla wszystkich punktw rysowanych po jej ustaleniu. Aby
przywrci domyln wielko punktu 1 (jeden), naley po-
nownie wywoa procedur glPointSize(), z parametrem
Grubo rwnym 1 (jeden).
glPointSize(5); // Punkt o wielkoci 5 jednostek
glPointSize(1); // Powrt do wielkoci domylnej
glVertex*()
Deklaracja: procedure glVertex2*(x, y, z, w : GL**[PGL**]);
lub procedure glVertex3*(x, y, z, w : GL**[PGL**]);
lub procedure glVertex4*(x, y, z, w : GL**[PGL**]);
Uwaga
Znak * (gwiazdka) to jedno z: d, f, i, s, dv, fv, iv lub sv.
Dwuznak ** (dwie gwiazdki) to odpowiednio: Double, Float,
Int lub Short.
Dziaanie: rysuje wierzchoek (punkt) na paszczynie rzutowania,
w miejscu okrelonym parametrami wywoania. Tworzenie takich
obiektw jak linie, wielokty itp. odbywa si za pomoc okre-
lenia pooenia ich wierzchokw w przestrzeni. Cyfra przy-
rostka okrela liczb wymiarw w przestrzeni, w ktrej bdzie
umieszczony wierzchoek. Litera v oznacza, e parametry do
procedury bd przekazane w postaci tablicy (wektora). Najcz-
ciej procedura ta jest wywoywana w postaci: glVertex3f().
Naley w tym miejscu wspomnie, e liczby typu Double
(GLDouble) i Single (GLFloat) s bez konwersji akceptowane
przez koprocesor matematyczny (CPU) i z tego te wzgldu
naley z nich korzysta, oczywicie jeeli inne wzgldy nie
Rozdzia 4. Obiekty podstawowe | 77
wymuszaj stosowania innego typu liczb. W powyszym przy-
kadzie uwzgldniono procedur glPointSize(), ktra okrela
wielko rysowanych punktw na ekranie. Jeeli nie wywoamy
tej procedury, to wszystkie punkty bd miay domyln wiel-
ko rwn 1 (jeden). Dla punktw, podobnie jak dla innych
obiektw, mona wykorzysta narzdzie do wygadzania kra-
wdzi, czyli tzw. antialiasing. W razie zwikszenia rozmiarw
punktu okae si, e ma on ksztat kwadratu, co nie zawsze jest
podane. Aby tego unikn, wystarczy wywoa procedur
glEnable() z parametrem GL_POINT_SMOOTH, co spowoduje, e
naroniki zostan zaokrglone. Naley pamita o wywoaniu
procedury glDisable(GL_POINT_SMOOTH), jeeli kolejne punkty
maj by rysowane bez wygadzania. Wczanie wygadzania
dla punktw o domylnej wielkoci 1.0 jest bezcelowe i nie na-
ley go stosowa. Poniej przedstawiono fragment kodu, ktrego
wykonanie powoduje narysowanie punktu bez wygadzania
i z wygadzaniem:
// Punkt
glColor3f(0.0, 0.0, 1.0); // Kolor niebieski
// Punkt bez wygadzania
glPointSize(95); // Wielko punktu(95 pikseli);
glBegin(GL_POINTS); // Rysowanie punktw
glVertex3f(0, 0, 0); // Pooenie punktu(rodek okna
grafiki OpenGL)
glEnd; // Koniec rysowania
// Punkt wygadzony
glEnable(GL_POINT_SMOOTH); // Wczenie wygadzania
(antialiasing) punktu
glPointSize(95);
glTranslatef(100, 0, 0);
glBegin(GL_POINTS);
glVertex3f(0, 0, 0);
glEnd;
glDisable(GL_POINT_SMOOTH); // Wyczenie wygadzania
punktu
Rezultat dziaania powyszego fragmentu kodu ilustruje ry-
sunek 4.2.
78 | OpenGL. Leksykon kieszonkowy
Rysunek 4.2. Punkt o wielkoci 95 jednostek bez wygadzania i po wczeniu
wygadzania
Uwaga
Domylnie wygadzanie jest wyczone, a to ze wzgldu na
bardzo znaczce spowolnienie pracy programu. Przed w-
czeniem wygadzania naley przeanalizowa konieczno jego
uycia i wyczy, jeeli przestaje by faktycznie niezbdne.
4Q\F\KC
-QNQTOCVGTKC[KQYKGVNGPKG
2QFUVCY[
#WVQT4KEJCTF59TKIJV,T
%\GIQPCWE\[O[UKYV[OTQ\F\KCNG!
Jok Funkcje, z ktrych bqdz|emy korzystoc
Ustala kolor na podstawie skadowych RGB _!Co!or
Ustala model cieniowania _!ShaceMoce!
Ustala model owietlenia _!|:_h!Moce!
Ustala parametry owietlenia _!|:_h!
Skonfigurowa odblaskowe waciwoci materiaw _!Co!orMa!er:a!/_!Ma!er:a!
Stosowa normalne powierzchni _!Norma!
W niniejszym rozdziale grafika trjwymiarowa w kocu zacznie wyglda interesujco
(chyba e kto bardzo lubi modele szkieletowe), a w kadym nastpnym bdzie coraz lepiej.
Do tej pory uczylimy si biblioteki OpenGL od jej podstaw jak mona budowa
programy, jak w przestrzeni trjwymiarowej skada obiekty z obiektw podstawo-
wych, jak manipulowa tymi obiektami w trzech wymiarach. Cay czas kadlimy tylko
fundamenty, ale nadal nie wiemy, jak bdzie wyglda cay budynek! Parafrazujc fraz:
Gdzie jest arcie?.
Krtko mwic arcie zaczyna si tutaj. W wikszoci pozostaej czci tej ksiki
nauka zostanie odsunita na plan dalszy, a wadz przejmie magia. Zgodnie ze sowami
Arthura C. Clarkea kada wystarczajco rozwinita technologia jest nie do odrnienia
od magii. Oczywicie w kolorach i owietleniu nie ma adnej magii, cho czasami mona
odnie inne wraenie. Jeeli ktokolwiek jest zainteresowany t wystarczajco rozwinit
technologi, czyli matematyk, to odsyamy do dodatku A.
Alternatywn nazw tego rozdziau mogoby by Dodawane do sceny realizmu. W wie-
cie rzeczywistym na kolor obiektu wpywa duo wicej czynnikw ni proste naoenie
koloru znane z biblioteki OpenGL. Obiekty, poza tym, e maj jaki kolor, mog by ma-
towe lub byszczce, a nawet wieci wasnym wiatem. Widziany kolor obiektu moe
224 Cz I Klasyka OpenGL
by inny w jasnym owietleniu ni w wietle przytumionym. Znaczenie ma te kolor
padajcego na obiekt wiata. Owietlony obiekt moe mie te cieniowane powierzchnie,
jeeli owietlany bdzie pod odpowiednim ktem.
%\[OLGUVMQNQT!
Pomwmy przez chwil o samych kolorach. W jaki sposb widzimy kolory? Jak s one
tworzone w naturze? Teoria kolorw i metody odbierania kolorw przez ludzkie oko
bardzo uatwi nam zrozumienie programowych metod tworzenia barw. Jeeli kto ju
doskonale zna tajniki teorii kolorw, spokojnie moe pomin ten podrozdzia.
YKCVQLGUVHCN
Kolor jest po prostu fal wietln o pewnej dugoci, widoczn dla ludzkiego oka. Kady,
kto w szkole uwaa na lekcjach fizyki, zapewne pamita, e wiato jest jednoczenie
zarwno fal, jak i czsteczk. wiato modelowane jest jako fala przemieszczajca si
przez przestrze, jak fale na wodzie, ale take jako czsteczki, padajce na ziemie jak
krople deszczu. Jeeli komu ta koncepcja wydaje si pogmatwana, to chyba ju rozumie,
dlaczego tak niewiele osb studiuje fizyk kwantow.
wiato, jakie widzimy, tak naprawd jest mieszank wielu rnych rodzajw wiata.
Kady rodzaj wiata identyfikowany jest dugoci fali. Dugo fali wiata mierzona
jest odlegoci pomidzy dwiema kolejnymi wartociami szczytowymi, tak jak pokazano
to na rysunku 5.1.
kysunek 5.1.
Pomiar dugoci
fali wietlnej
wiato widzialne mieci si w zakresie dugoci fal od 390 nanometrw (miliardowych
czci metra) dla wiata fioletowego, do 720 nanometrw dla wiata czerwonego. Ten
zakres nazywany jest czsto spektrum wiata widzialnego. Z ca pewnoci kady sysza
ju okrelenia ultrafiolet i podczerwie opisuj one wiato niewidzialne dla ludzkiego
oka, lece tu poza podanym powyej spektrum. Cae spektrum widzialne zawiera w sobie
wszystkie kolory tczy (tak jak na rysunku 5.2).
YKCVQLCMQE\UVGE\MC
Mona sobie pomyle: Dobra, panie mdrala, jeeli kolor jest tylko dugoci fali wiata,
a wszystkie moliwe kolory widoczne s w tczy, to gdzie w takim razie podzia si
brz z czekolady, czer mojej porannej kawy albo biel kartki papieru? Odpowied na te
pytania zaczniemy od stwierdzenia, e czer nie jest kolorem, podobnie jak i biel. Tak
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 225
kysunek 5.2. Spektrum wiat widzialnego
naprawd czer jest barkiem jakiegokolwiek koloru, a biel to rwnomierna kombinacja
wszystkich kolorw. Oznacza to, e biay obiekt odbija wszystkie kolory w jednakowy spo-
sb, natomiast obiekt czarny tak samo rwno pochania wszystkie dugoci fali wietlnej.
Jeeli chodzi o brz czekolady, jak rwnie inne kolory, z jakimi spotykamy si w yciu,
to rzeczywicie jest on kolorem. Kolory rzeczywiste skadaj si one z rnych mieszanek
czystych kolorw widzialnego spektrum, w zwizku z czym pod wzgldem fizycznym s
one kolorami zoonymi. eby zrozumie, jak dziaa takie mieszanie kolorw, trzeba myle
o wietle jako o czsteczkach. Kady owietlony obiekt bombardowany jest miliardami, mi-
liardami (tutaj musz przeprosi Carla Sagana) fotonw, czyli malekich czsteczek wiata.
Przypomnijmy sobie ten fizyczny hokus-pokus, o ktrym mwilimy wczeniej kady
foton jest rwnie fal posiadajc pewn dugo, czyli konkretny kolor ze spektrum.
Kady obiekt fizyczny skada si z atomw. Sposb odbicia fotonw od obiektu uzaleniony
jest od rodzaju atomw, z jakich si on skada, liczby kadego rodzaju atomw, a take
ich uoenia (razem z elektronami) wewntrz obiektu. Cz fotonw jest odbijana, a cz
pochaniana (pochaniane fotony s zamieniane w ciepo). Kady materia lub mieszanka
materiaw lepiej odbija pewne dugoci fal ni inne. Zasada ta zostaa przedstawiona
na rysunku 5.3.
kysunek 5.3.
Kady obiekt odbija
cz fotonw, a cz
z nich pochania
226 Cz I Klasyka OpenGL
0CU\QUQDKUV[Y[MT[YCE\HQVQPY
wiato odbite od naszej tabliczki czekolady wpada do naszego oka, gdzie jest interpreto-
wane jako kolor. Miliardy fotonw wpadajcych do naszego oka skupiane s w jego czarnej
czci, gdzie siatkwka dziaa na zasadzie podobnej do kliszy fotograficznej. Miliony
komrek siatkwki pobudzanych jest przez uderzajce w nie fotony, co powoduje, e do
mzgu zaczynaj wdrowa sygnay nerwowe, ktre s nastpnie interpretowane jako wia-
to i kolor. Im wicej fotonw uderza w siatkwk, tym bardziej pobudzone s jej komrki.
Poziom pobudzenia interpretowany jest w mzgu jako jasno wiata. Wynika to z prostej
zalenoci im janiejsze jest wiato, tym wicej fotonw wpada do naszego oka.
W naszym oku znajduj si trzy rodzaje komrek. Wszystkie reaguj na uderzenia foto-
nw, ale kady rodzaj najmocniej reaguje na fale o okrelonej dugoci. Jedne komrki
pobudzane s wiatem czerwonym, drugie wiatem zielonym, a trzecie wiatem nie-
bieskim. Tak wic wiato skadajce si gwnie z czerwonych dugoci fal najbardziej
pobudza w siatkwce komrki reagujce na wiato czerwone, a mniej pozostae. Nasz
mzg przetwarza takie sygnay, stwierdzajc, e widziane wiato jest przede wszystkim
czerwone. A teraz prosta matematyka czenie rnych dugoci fal wietlnych o od-
miennych intensywnociach da nam w wyniku rne mieszanki kolorw. Jeeli wszyst-
kie fale bd miay identyczn intensywno, to takie wiato bdziemy odbiera jako
biae. Jeeli natomiast nie zobaczymy adnych fal wietlnych, to zinterpretujemy ten
stan jako czer.
Jak wida, kady odbierany przez nasze oczy kolor jest w rzeczywistoci mieszanin
wiata z caego widzialnego spektrum. Sprztowe elementy naszego oka wykrywaj
obrazy na podstawie wzgldnego skupienia i natenia wiata czerwonego, zielonego
i niebieskiego. Na rysunku 5.4 przedstawiono sposb, w jaki nasze oko odbiera kolor
brzowy, czyli mieszank 60% fotonw czerwonych, 40% fotonw zielonych i 10%
niebieskich.
kysunek 5.4.
Jak nasze oko widzi
kolor brzowy
-QORWVGTIGPGTCVQTGOHQVQPY
Skoro wiemy ju, jak ludzkie oko rozpoznaje kolory, cakiem rozsdnym wydaje si
pomys komputerowego generowania kolorw poprzez definiowanie oddzielnych inten-
sywnoci skadowych czerwonej, zielonej i niebieskiej. Tak si akurat skada, e moni-
tory komputerw zaprojektowane s w sposb pozwalajcy im emitowa trzy rodzaje
wiata (zgadnijcie jakie), z ktrych kady moe mie inn intensywno. W tylnej czci
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 227
monitora znajduje si dziao elektronowe wyrzucajce elektrony na tyln cz ekranu
monitora. Na powierzchni tego ekranu znajduj si materiay fosforyzujce, ktre w czasie
bombardowania strumieniem elektronw zaczynaj emitowa wiato czerwone, zielone
lub niebieskie. (No dobra, ale jak w takim razie dziaaj wywietlacze LCD? Znalezienie
odpowiedzi na to pytanie pozostawimy Czytelnikowi jako prac domow). Te trzy fos-
foryzujce materiay uoone s bardzo blisko siebie, tak e razem tworz jedn barwn
plamk na ekranie (rysunek 5.5).
kysunek 5.5.
Jak monitor
komputerowy generuje
kolory
Prosz sobie przypomnie, jak w rozdziale 2., Uywanie OpenGL, opisywalimy po-
lecenie Cccr pozwalajce na definiowanie kolorw poprzez podanie intensywnoci
skadowych czerwonej, zielonej i niebieskiej.
5RT\VMQORWVGTY2%
By taki czas, kiedy najnowoczeniejsz kart graficzn dla komputerw PC bya karta
Hercules. Karta pozwalaa na tworzenie bitmapowych obrazw o rozdzielczoci 720348
punktw. Jej wad byo to, e kady z punktw mg mie tylko dwa stany: zapalony
lub zgaszony. W tym czasie tworzenie bitmapowej grafiki na komputerach PC nie byo
zadaniem atwym, cho tworzone byy wspaniae monochromatyczne obrazy nawet
trjwymiarowe!
Jeszcze przed powstaniem kart Hercules dostpne byy karty CGA (ang. Color Graphics
Adapter). Karta powstaa razem z pierwszymi komputerami IBM PC moga obsugiwa
rozdzielczo 320200 pikseli i wywietla na ekranie 4 lub 16 kolorw naraz. Dostpna
bya te wysza rozdzielczo (640200) z dwoma kolorami, ale nie bya ona tak efek-
towna, jak w znacznie taszej karcie Hercules (monitory kolorowe oznaczay znacznie
wysze koszty). Jak na dzisiejsze standardy karta CGA wyglda mizernie. Jej graficzne
moliwoci prezentoway si nie najlepiej nawet w porwnaniu z moliwociami tanich
komputerw Commodore 64 i Atari. Ze wzgldu na brak wystarczajcych rozdzielczoci
228 Cz I Klasyka OpenGL
obrazu karta nie nadawaa si do tworzenia grafiki biznesowej ani nawet modelowania.
Najczciej znajdowaa zastosowanie w prostych grach i aplikacjach biznesowych, ktre
mogy najwicej skorzysta na moliwoci wywietlania kolorowego tekstu. Mwic ogl-
nie, trudno byo znale dobry powd, eby kupi t nietani wtedy kart.
Nastpna rewolucja w grafice komputerw PC nastpia, gdy firma IBM zaprezentowaa
kart EGA (ang. Enhanced Graphic Adapter). Udostpniaa ona dodatkowe tryby tekstowe,
w ktrych moliwe byo wywietlanie wikszej liczby ni 25 linii kolorowego tekstu,
a w trybie graficznym mona byo uzyska rozdzielczo 640350 pikseli w 16 kolorach!
Inne poprawki techniczne wyeliminoway problemy z migotaniem obrazu w karcie CGA
i umoliwiy tworzenie lepszej i pynniejszej animacji. Od tego momentu gry platformowe,
graficzne aplikacje biznesowe, a nawet proste grafiki trjwymiarowe stay si czym
normalnym w wiecie komputerw PC. By to ogromny krok w stosunku do kart CGA, ale
grafika w komputerach PC nadal pozostawaa w powijakach.
Ostatnim wanym standardem, jaki wrd komputerw PC wyznaczya firma IBM bya
karta VGA (skrt ten oznacza Vector Graphics Array, a nie, jak si powszechnie uwaa,
Video Graphics Adapter). Karta bya o wiele szybsza ni EGA, pozwalaa stosowa 16
kolorw w wysokich rozdzielczociach (640480), a w mniejszych (320200) nawet
265 kolorw, ktre byy wybierane z palety obejmujcej ponad 16 milionw kolorw.
W ten sposb otwarty zosta worek z graficznymi aplikacjami dla komputerw PC nagle
moliwe stao si tworzenie niemal fotorealistycznych obrazw, a na rynku pojawiy si
programy do ledzenia promieni (ray trace), gry trjwymiarowe, oprogramowanie do
obrbki zdj i inne.
Firma IBM posiadaa jeszcze inn, znacznie bardziej zaawansowan kart graficzn dla
swoich stacji roboczych 8514. Moga ona wywietla obraz o rozdzielczoci 1024768
w 256 kolorach. Wedug firmy IBM ta karta miaa by uywana wycznie w aplikacjach
CAD i naukowych, jednak klienci zawsze bd chcieli czego wicej. Bya to krtko-
wzroczno, ktra firm IBM kosztowaa pozycj ustanawiajcego standardy rynku graficz-
nego komputerw PC. Inni dostawcy zaczli tworzy karty Super-VGA, ktre mogy
wywietla obraz w rozdzielczoci 1024768 i wikszej w coraz szerszej palecie kolorw.
Na pocztku byo to 800600, pniej 1024768 i wicej, pocztkowo w 256, a pniej
w 32 000 i 65 000 kolorw. Dzisiejsze karty graficzne wywietlaj obrazy o rozdziel-
czoci 1024768 i wikszej, stosujc 24-bitow palet kolorw. Takie karty graficzne
dostpne s ju nawet w najprostszych konfiguracjach komputerw.
To wszystko daje nam naprawd ogromne moliwoci na przykad tworzenie fotoreali-
stycznej grafiki trjwymiarowej, eby wymieni tylko jedno zastosowanie. Gdy Microsoft
przenis bibliotek OpenGL na system Windows, umoliwi w ten sposb tworzenie
wysokiej jakoci aplikacji graficznych dla komputerw PC. Jeeli poczymy wydajno
dzisiejszych procesorw z moliwociami kart graficznych wyposaonych w akceleratory
grafiki trjwymiarowej, to uzyskamy moliwoci, jakie jeszcze kilka lat temu dostpne
byy wycznie na stacjach roboczych wartych setki tysicy dolarw. A to wszystko za
promocyjn cen komputera w supermarkecie. Dzisiejsze domowe komputery mog
tworzy zaawansowane symulacje naukowe, gry i duo, duo wicej. Ju dzisiaj termin
rzeczywisto wirtualna wydaje si przestarzay jak rakieta Bucka Rogersa, a grafika
trjwymiarowa wydaje si nam czym absolutnie oczywistym.
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 229
6T[D[ITCHKE\PGMQORWVGTY2%
Systemy operacyjne Microsoft Windows i Apple Macintosh pod dwoma wzgldami zre-
wolucjonizoway wiat grafiki komputerw PC. Po pierwsze, utworzyy najwaniejsze
graficzne rodowiska systemw operacyjnych wykorzystywanych w biznesie, a wkrtce
potem rwnie na rynku konsumenckim. Po drugie, znaczco uatwiy prac programistw
grafiki. Sprzt graficzny poddany zosta wirtualizacji na poziomie sterownikw. Pro-
gramici nie musz ju wysya polece rysujcych bezporednio do kart graficznych.
Korzystaj ze specjalnych interfejsw programistycznych (takich jak OpenGL), a sprawami
komunikacji ze sprztem zajmuje si ju system operacyjny.
4Q\F\KGNE\QGMTCPW
W dzisiejszych komputerach stosowane s rozdzielczoci ekranw od 640480 do
16001200, a nawet wicej. Najnisze rozdzielczoci, takie jak 640480 uznawane s
za odpowiednie dla pewnych zada graficznych, a osoby z problemami ze wzrokiem sto-
suj te rozdzielczoci (czsto w poczeniu z duymi monitorami), co uatwia im prac
z komputerem. Zawsze trzeba mie na uwadze wielko okna i ustawienia widoku (roz-
dzia 2.), w ktrym wywietlana bdzie przestrze ograniczajca. Zrwnujc wielko
rysunku z wielkoci okna, bardzo atwo mona dostosowywa si do rnych kombinacji
wielkoci okna i rozdzielczoci ekranu. Dobrze napisane aplikacje wywietlaj mniej
wicej taki sam obraz niezalenie od rozdzielczoci ekranu. Oczywicie im wiksza bdzie
rozdzielczo, tym dokadniejszy obraz powinien zobaczy uytkownik.
)DKCMQNQTY
Jeeli powikszenie rozdzielczoci ekranu, czyli liczby dostpnych do rysowania pikseli
wpywa na popraw dokadnoci i ostroci obrazu, to w podobny sposb zwikszenie
liczby dostpnych kolorw powinno poprawia przejrzysto generowanego obrazu. Obraz
wywietlany przez komputer, ktry moe posugiwa si milionami kolorw, powinien
wyglda o wiele lepiej ni ten sam obraz wywietlany za pomoc zaledwie 16 kolorw.
Pod wzgldem programowym zajmowa bdziemy si zaledwie trzema gbiami kolorw:
4-bitow, 8-bitow i 24-bitow.
Iryb ko|oru 4-b|towego
W najgorszym przypadku nasz program bdzie musia dziaa w zaledwie 16 kolorach
ten tryb nazywany jest 4-bitowym, poniewa kolor kadego piksela reprezentowany jest
za pomoc czterech bitw. Mona w nich zapisa wartoci od 0 do 15, ktre bd in-
deksem w 16-elementowym zbiorze predefiniowanych kolorw (taki ograniczony zbir
kolorw, do ktrych mona odwoywa si za pomoc indeksw, nazywany jest palet
kolorw). Posiadajc zaledwie 16 kolorw, nie mamy zbyt wielkich moliwoci two-
rzenia dokadnego i ostrego obrazu. Najczciej zupenie bezpiecznie mona cakowicie
zignorowa tryb 4-bitowy w naszych programach, tym bardziej, e wikszo najnowszych
kart graficznych nie obsuguje ju adnego trybu 4-bitowego koloru.
230 Cz I Klasyka OpenGL
Iryb ko|oru 8-b|towego
Tryb koloru 8-bitowego pozwala wywietla na ekranie 256 kolorw. Nadal jest to do
powane ograniczenie, cho poprawa w stosunku do trybu 4-bitowego jest znaczca.
Wikszo akceleratorw graficznych wsppracujcych z bibliotek OpenGL nie przy-
spiesza dziaa na 8-bitowych kolorach, ale stosujc rendering programowy mona w pew-
nych warunkach uzyska satysfakcjonujce wyniki. Najwikszym problemem jest tutaj
zbudowanie prawidowej palety kolorw. Ten temat bdziemy krtko omawia w rozdziale
13., Wiggle. OpenGL w systemie Windows.
Iryb ko|oru 24-b|towego
Dzisiaj moliwie najlepszy obraz uzyskiwany jest w trybie koloru 24-bitowego. W tym try-
bie kolor kadego piksela definiowany jest za pomoc penych 24 bitw, w ktrych kade
8 bitw opisuje intensywno skadowej czerwonej, zielonej i niebieskiej (8+8+8 = 24).
Na ekranie moemy umieci piksel w dowolnym z ponad 16 milionw kolorw. Do
oczywist wad tego trybu jest ilo pamici, jaka jest potrzebna do zapisania wygldu
ekranw o wikszych rozdzielczociach (dla rozdzielczoci 1024768 bdzie to nieco
ponad 2 MB). Poza tym przenoszenie duych wycinkw pamici rwnie jest woln ope-
racj, szczeglnie jeeli pracujemy nad szybk animacj. Na cae szczcie dzisiejsze
akceleratory graficzne optymalizowane s do dziaania w tych wanie trybach kolorw
i dostarczane s z wystarczajc iloci wbudowanej pamici, eby sprosta rosncemu
zapotrzebowaniu na pami.
Iryby ko|oru 1- | 32-b|towego
Ze wzgldu na oszczdno pamici i popraw wydajnoci w wielu kartach graficznych
stosowane s rwnie rne inne tryby kolorw. W celu poprawy wydajnoci czsto uy-
wany jest tryb 32-bitowy, ktry czasami nazywany jest trybem true color (prawdziwy
kolor). Tak naprawd w tym trybie nie jest wywietlanych wicej kolorw ni w trybie
24-bitowym, a poprawa wydajnoci uzyskiwana jest poprzez ustawianie danych kadego
piksela do granicy adresw 32-bitowych. Niestety, w zwizku z tym marnowanych jest
osiem bitw (jeden bajt) dla kadego piksela. W dzisiejszych 32-bitowych komputerach PC
budowanych z wykorzystaniem procesorw firmy Intel stosowanie adresw pamici po-
dzielnych przez 32 pozwala na uzyskanie znacznie lepszych wynikw dostpu do pamici.
Nowoczesne akceleratory graficzne rwnie stosuj tryb 32-bitowy, w ktrym pierwsze
24 bity wykorzystane s na zapisanie kolorw RGB, a kocowe 8 bitw stosowane jest
do przechowywania wartoci kanau alfa. Na temat kanau alfa bdziemy mwi wicej
w nastpnym rozdziale.
Innym popularnym trybem jest tryb 16-bitowy, ktry czasami obsugiwany jest w celu
poprawienia efektywnoci wykorzystania pamici. Pozwala on nada kademu pikselowi
jeden z 65 536 kolorw. Ten tryb jest niemal tak samo skuteczny jeeli chodzi o odwzo-
rowywanie obrazw fotograficznych jak tryb 24-bitowy. Praktycznie trudno odrni od
siebie obraz wywietlany w obu tych trybach. To wanie poprawa wykorzystania pamici
i wzrost prdkoci wywietlania obrazw spowodoway, e tryb ten by bardzo popularny
w pierwszych akceleratorach grafiki trjwymiarowej przeznaczonych do gier. Jednak do-
datkowe kolory w trybie 24-bitowym bardzo podnosz jako obrazu, jeeli do jego gene-
rowania wykorzystywane s operacje cieniowania i mieszania kolorw.
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 231
7[YCPKGMQNQTYY1RGP).
Wiemy ju, e biblioteka OpenGL definiuje kolory, okrelajc intensywnoci skadowych:
czerwonej, zielonej i niebieskiej. Wiemy te, e nowoczesny sprzt jest w stanie wywie-
tli niemal wszystkie moliwe kombinacje tych skadowych albo zaledwie kilka. Jak
w takim razie moemy okreli potrzebny nam kolor, podajc wspomniane trzy skadowe?
5\GEKCPMQNQTY
Kady kolor moemy zdefiniowa trzema dodatnimi wartociami, dlatego wszystkie
dostpne kolory mona przedstawi jako pewn przestrze nazywan przestrzeni kolorw
RGB. Na rysunku 5.6 przedstawiono, jak wyglda taka przestrze kolorw w pocztku
ukadu wsprzdnych z osiami kolorw czerwonego, zielonego i niebieskiego. Wsp-
rzdne poszczeglnych kolorw okrelane s na tej samej zasadzie jak wsprzdne x, y
i z. W pocztku ukadu wsprzdnych intensywno kadej skadowej jest rwna zero,
co oznacza kolor czarny. W komputerach PC wszystkie informacje o kolorze musza zmie-
ci si w 24 bitach, co daje 8 bitw na kad skadow. Mona wic powiedzie, e w ka-
dej skadowej warto 255 oznacza pene nasycenie tej skadowej koloru. Oznacza to, e
nasz szecian bdzie mia boki o dugoci 255 jednostek. Dokadnie na przeciwko rogu,
w ktrym panuje czer (0,0,0), znajduje si rg biay o wsprzdnych (255, 255, 255).
Wzdu kadej z osi, przy wartoci 255 znajduj si pene nasycenia kadego koloru
skadowego: czerwonego, zielonego i niebieskiego.
kysunek 5..
Pocztek ukadu
wsprzdnych
koloru RGB
Przedstawiony na rysunku 5.7 szecian kolorw, na swojej powierzchni jak i w swoim
wntrzu zawiera wszystkie moliwe kolory. Na przykad wszystkie moliwe odcienie
szaroci le wewntrz szecianu, na linii ukonej czcej punkty (0, 0, 0) i (255, 255, 255).
Rysunek 5.8 przedstawia gadko cieniowany szecian kolorw rysowany w przykadowym
programie CCUBE. Na powierzchni szecianu zobaczy mona przejcia kolorw od
czerni w jednym rogu, do bieli w przeciwlegym. W trzech rogach, odlegych od czarnego
o 255 jednostek, mona zobaczy kolory czerwony, zielony i niebieski w ich penych
intensywnociach. Dodatkowo w trzech rogach zobaczy mona kolory ty, zielono-nie-
bieski (cyan) i fuksyna (magenta), bdce kombinacjami kolorw podstawowych. Szecian
kolorw mona obraca, aby zobaczy wszystkie jego strony.
232 Cz I Klasyka OpenGL
kysunek 5.7.
Przestrze
kolorw RGB
kysunek 5.8.
Wynik dziaania
programu CCUBE
7UVCNCPKGMQNQTWT[UQYCPKC
Przyjrzyjmy si krtko funkcji Cccr. Jest ona prototypowana nastpujco:
XQKF _!Co!orx!rec _reen o!ue a!pha|,
W nazwie funkcji znak x oznacza liczb parametrw. Mog to by trzy parametry ozna-
czajce skadowe czerwon, zielon i niebiesk lub cztery parametry, w ktrych czwarty
oznacza skadow alfa koloru. Skadowa alfa okrelajca przezroczysto koloru opisana
jest dokadniej w dalszej czci rozdziau. Na razie bdziemy uywali trjparametrowej
wersji tej funkcji.
Symbol ' w nazwie funkcji okrela typ parametrw przyjmowanych przez funkcj.
Mog to by okrelenia | (|,'e), c (ccu|e), ' ('c.'), (n'), s (s|cr'), u| (unsnec
|,'e), u (unsnec n') lub us (unsnec s|cr'). Kolejna wersja funkcji ma na kocu
liter v. Oznacza ona, e ta wersja funkcji pobiera tablic zawierajc wszystkie para-
metry (litera v oznacza vector, czyli wektor). W podrozdziale Opisy funkcji znajduje si
duo dokadniejszy opis funkcji Cccr.
Wikszo programw, z jakimi przyjdzie nam si spotyka, wykorzystuje funkcj Cc
cro', w ktrej intensywno kadej skadowej okrelana jest liczb z zakresu od 00 do
`0. Jednak dla osb z dowiadczeniem w programowaniu w systemie Windows znacznie
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 233
atwiejsze moe by uycie funkcji Cccrou|. Ta wersja pobiera trzy bajty bez znaku,
czyli wartoci od 0 do bb. Stosowanie tej funkcji jest bardzo podobne do stosowania
makra systemu Windows:
_!Co!or:uo0 55 18| RB0 55 18|
Rzeczywicie, ta metoda moe uatwi dopasowanie kolorw w bibliotece OpenGL do kolo-
rw wykorzystywanych w programie w czasie rysowania niezwizanego z OpenGL. Mimo
to trzeba zaznaczy, e wewntrznie biblioteka OpenGL przechowuje dane kolorw jako
wartoci zmiennoprzecinkowe, wic stosowanie wartoci innego typu moe spowodowa
spadek wydajnoci z powodu koniecznych przeksztace wykonywanych w czasie dziaa-
nia programu. Poza tym w przyszoci moe si okaza, e powstan znacznie pojem-
niejsze bufory kolorw (tak naprawd to ju zaczynaj si pojawia bufory zapamitujce
wartoci zmiennoprzecinkowe), w ktrych przechowywane wartoci zmiennoprzecinkowe
najdokadniej odwzoruj stosowane kolory.
%KGPKQYCPKG
Poprzednio podawana definicja funkcji Cccr mwia, e ustala ona aktywny kolor
rysujcy, ktrym pokrywane s wszystkie obiekty rysowane po wywoaniu tej funkcji.
Po omwieniu w poprzednim rozdziale wszystkich obiektw podstawowych biblioteki
OpenGL moemy teraz nieco uszczegowi t definicj funkcja Cccr ustala ak-
tualny kolor rysujcy dla wszystkich wierzchokw definiowanych po wywoaniu tej
funkcji. W dotychczasowych przykadach rysowalimy obiekty tylko w postaci szkieletw,
a w ewentualnie wypenionych obiektach kada powierzchnia miaa inny kolor. Jeeli
jednak dla kadego wierzchoka obiektu podstawowego (punktu, linii lub wielokta) zdefi-
niujemy inny kolor, to jakiego koloru bdzie jego wntrze?
Odpowied na to pytanie zaczniemy od punktw. Kady punkt definiowany jest tylko
jednym wierzchokiem, dlatego jakikolwiek kolor zostanie przydzielony wierzchokowi,
bdzie to aktywny kolor punktu. Proste.
Ju jednak linia definiowana jest dwoma wierzchokami, z ktrych kady moe mie inny
kolor. Kolor samej linii tworzony jest przez model cieniowania. Cieniowanie definio-
wane jest po prostu jako pynne przejcie od jednego koloru do drugiego. W przestrzeni
kolorw RGB (musimy wrci do rysunku 5.7) dowolne dwa punkty mog by poczone
lini prost.
Pynne cieniowanie sprawia, e wzdu linii kolory zmieniaj si w taki sam sposb jak
kolory linii czcej dwa punkty wewntrz szecianu kolorw. Na rysunku 5.9 przed-
stawiony zosta szecian kolorw z zaznaczonymi punktami kolorw biaego i czarnego.
Poniej znajduje si linia definiowana dwoma wierzchokami jednym biaym, a drugim
czarnym. Kolory wybierane w czasie rysowania tej linii pokrywaj si dokadnie z kolo-
rami lecymi na prostej czcej w szecianie kolorw punkty biay i czarny. W ten
sposb powstaje linia, ktra na pocztku jest czarna, a w dalszej czci jej kolor zmienia si
w coraz janiejszy szary, a na kocu osiga biel.
234 Cz I Klasyka OpenGL
kysunek 5..
Rysowanie linii
z kolorami
zmieniajcymi si
od czerni do bieli
Moemy sami wykona cieniowanie linii, znajdujc matematyczne rwnanie linii czcej
dwa punkty wewntrz trjwymiarowej przestrzeni kolorw RGB. Pniej wystarczy
przej w ptli od jednego koca linii do drugiego, sprawdzajc po drodze odpowiednie
wsprzdne w przestrzeni kolorw wyznaczajce kolor kadego piksela linii. W wielu
dobrych ksikach opisujcych grafik komputerow podawane jest wyjanienie algo-
rytmu pozwalajcego na uzyskanie doskonaych efektw cieniowania, przeniesienia
kolorw linii z szecianu kolorw na ekran komputera i tym podobne. Na szczcie ca
t prac wykona za nas biblioteka OpenGL.
W przypadku wieloktw zadanie cieniowania staje si znacznie trudniejsze. Na przy-
kad trjkt moe by rwnie przedstawiony jako paszczyzna wewntrz szecianu
kolorw. Na rysunku 5.10 przedstawiono trjkt, ktrego wierzchokom nadano kolory
o penym nasyceniu skadowych czerwonej, zielonej i niebieskiej. Kod wywietlajcy
taki trjkt podany zosta na listingu 5.1. Pochodzi on z programu TRIANGLE znajdujcego
si na pycie CD doczonej do tej ksiki.
I|st|ng 5.1. Rysowanie trjkta cieniowanego kolorami czerwonym, zielonym i niebieskim
// Wczenie gadkiego cieniowania
_!ShaceMoce!|SMJJT'|,
// Rysowanie trjkta
_!Be_:n|TRT/N|FS|,
// Wierzchoek czerwony
_!Co!or:uo|uo,!e|55|uo,!e|0|uo,!e|0|,
_!Ver!ex:f00f000f00f|,
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 235
kysunek 5.10.
Trjkt w przestrzeni
kolorw RGB
// Wierzchoek zielony - na dole po prawej stronie
_!Co!or:uo|uo,!e|0|uo,!e|55|uo,!e|0|,
_!Ver!ex:f000f-700f00f|,
// Wierzchoek niebieski - na dole po lewej stronie
_!Co!or:uo|uo,!e|0|uo,!e|0|uo,!e|55|,
_!Ver!ex:f-000f -700f 00f|,
_!Fnc|,
7UVCNCPKGOQFGNWEKGPKQYCPKC
W pierwszej linii listingu 5.1 ustalamy, e modelem cieniowania stosowanym przez biblio-
tek OpenGL bdzie cieniowanie gadkie, czyli model omawiany wczeniej. Co prawda
jest to ustawienie domylne, ale i tak lepiej wywoywa t funkcj upewniamy si w ten
sposb, e wszystko bdzie dziaao zgodnie z zaoeniami.
Drugim modelem cieniowania, jaki mona wczy funkcj S|.ceMcce, jest O|_||AT,
czyli cieniowanie paskie. Cieniowanie paskie oznacza, e wewntrz obiektw podstawo-
wych nie s wykonywane adne obliczenia zwizane z cieniowaniem. Mwic oglnie,
przy wczonym cieniowaniu paskim kolor caego obiektu podstawowego definiowany jest
kolorem ostatniego wierzchoka definiujcego ten obiekt. Jedynym wyjtkiem s obiekty
podstawowe O|_PO|YOON. Tutaj kolor obiektu definiuje kolor pierwszego wierzchoka.
Nastpnie, kod z listingu 5.1 nadaje grnemu wierzchokowi kolor czerwony, dolnemu
prawemu wierzchokowi kolor zielony, a dolnemu lewemu kolor niebieski. Wczone
jest cieniowanie gadkie, dlatego wntrze trjkta wypenione jest pynnym przejciem
pomidzy kolorami wierzchokw.
Wynik dziaania programu TRIANGLE pokazany zosta na rysunku 5.11. Wida na nim
paszczyzn przedstawion graficznie na rysunku 5.10.
Wielokty znacznie bardziej zoone od trjktw rwnie mog mie definiowane rne
kolory w poszczeglnych wierzchokach. Jednak w ich przypadku logika cieniowania
moe by ju bardzo skomplikowana. Na cae szczcie dziki bibliotece OpenGL nigdy
nie bdziemy musieli si o to martwi. Niezalenie od tego, jak zoony wielokt zdefiniu-
jemy, OpenGL doskonale wycieniuje jego wntrze, stosujc kolory nadane wierzchokom.
236 Cz I Klasyka OpenGL
kysunek 5.11.
Wynik dziaania
programu TRIANGLE
-QNQT[YYKGEKGT\GE\[YKUV[O
W rzeczywistoci kolory obiektw nie s niezmienne, nie s te cieniowaniem pomidzy
kilkoma wartociami RGB. Rysunek 5.12 przedstawia wynik dziaania programu JET znaj-
dujcego si na pycie CD. Jest to prosty samolot odrzutowy, poskadany rcznie z trjktw
za pomoc tych metod, ktre opisywalimy do tej pory. Tak jak i w innych programach
z tego rozdziau, moliwe jest obracanie samolotu poprzez naciskanie klawiszy strzaek.
kysunek 5.12.
Prosty samolot
odrzutowy, zbudowany
z rnokolorowych
trjktw
Kolory samolotu zostay tak dobrane, eby podkrela jego trjwymiarow struktur.
Nawet pomijajc dziwaczn struktur trjktw tworzcych samolot, mona zauway,
e nie wyglda on tak jak obiekty rzeczywiste. Zamy, e zbudowalimy model tego
samolotu i kad z powierzchni pomalowalimy odpowiednim kolorem. W zalenoci od
uytej farby model sprawiaby wraenie byszczcego lub matowego, a kolor kadej pa-
skiej powierzchni zmieniaby si wraz ze zmianami kta patrzenia i padania wiata.
Biblioteka OpenGL cakiem dobrze radzi sobie z jak najlepszym odwzorowywaniem rze-
czywistego wygldu obiektw pod wzgldem warunkw owietlenia. Kady obiekt, o ile nie
generuje wasnego wiata, owietlany jest trzema rodzajami wiata: otaczajcym (ambient),
rozproszonym (diffuse) i odbitym (specular).
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 237
YKCVQQVCE\CLEG
wiato otaczajce nie pochodzi z adnego konkretnego kierunku. Posiada ono co prawda
rdo, ale promienie wiata odbijay si ju po caej scenie tyle razy, e wiato to ca-
kowicie stracio jakikolwiek kierunek. Wszystkie powierzchnie obiektw znajdujcych si
w wietle otaczajcym s owietlone rwnomiernie, niezalenie od kierunku. We wszyst-
kich poprzednich przykadach mona zauway, e prezentowane obiekty owietlone s
wanie takim wiatem s pokryte jednakowym kolorem niezalenie od ich pooenia
i naszego kta patrzenia. Rysunek 5.13 przedstawia obiekt owietlony wiatem otaczajcym.
kysunek 5.13.
Obiekt owietlony
wycznie wiatem
otaczajcym
YKCVQTQ\RTQU\QPG
wiato rozproszone pada na obiekt z okrelonego kierunku, ale jest na nim rozpraszane
we wszystkich kierunkach. Mimo to powierzchnie obiektu owietlone bezporednio bd
janiejsze od powierzchni ustawionych w stosunku do kierunku padania wiata pod pew-
nym ktem. Dobrym przykadem takiego wiata bdzie wiato jarzeniowe albo wiato
soneczne wpadajce w poudnie przez okna. Obiekt pokazany na rysunku 5.14 owietlany
jest wiatem rozproszonym.
kysunek 5.14.
Obiekt owietlony
wycznie wiatem
rozproszonym
YKCVQQFDKVG
Jeeli wiato pada na obiekt z pewnego kierunku (podobnie jak wiato rozproszone), ale
odbijane jest w jednym konkretnym kierunku, to mamy do czynienia ze wiatem odbitym.
Mocno odbite wiato najczciej powoduje wystpienie na powierzchni owietlanej jasnej
plamy nazywanej odbyskiem (ang. specular highlight). Przykadami wiata odbitego
mog by latarka lub soce. Na rysunku 5.15 mona zobaczy obiekt owietlony wycz-
nie wiatem odbitym.
238 Cz I Klasyka OpenGL
kysunek 5.15.
Obiekt owietlony
wiatem odbitym
#VGTC\YU\[UVMQTC\GO
Nie istnieje rdo wiata, ktre skadaoby si wycznie z jednego z opisanych wyej
rodzajw wiata. Niemal kade wiato skada si natomiast z rnych kombinacji tych
rodzajw. Na przykad promie czerwonego lasera laboratoryjnego skada si niemal
w caoci z czerwonego wiata odbitego. Jednak czsteczki kurzu lub dymu mog rozpra-
sza ten promie tak, e bdzie on widoczny na caej swojej dugoci. W ten sposb
uwidacznia si skadowa wiata rozproszenia. Dodatkowo, jeeli promie bdzie jasny,
a w pokoju nie bd dziaay adne inne rda wiata, to na wszystkich obiektach bdzie
mona zobaczy delikatn czerwon powiat. Jest ona spowodowana bardzo ma ska-
dow wiata otaczajcego obecn w promieniu lasera.
Jak wida, kade rdo wiata obecne na scenie musi skada si z trzech skadowych
owietlenia: otaczajcego, rozproszenia i odbitego. Podobnie jak zwyke kolory kada ska-
dowa owietlenia rwnie definiowana jest skadowymi RGBA opisujcymi wzgldne
intensywnoci wiata czerwonego, zielonego i niebieskiego w kadym rodzaju wiata
(w opisie koloru wiata skadowa alfa jest ignorowana). Na przykad, wiato wspo-
mnianego czerwonego lasera moe by opisywane wartociami skadowych podanymi
w tabeli 5.1.
Iobe|o 5.1. Rozkad skadowych wiata w promieniu czerwonego lasera
Czerwony I|e|ony N|eb|esk| A|fo
Odbite 099 00 00 10
Rozproszone 010 00 00 10
Otoczenia 005 00 00 10
Prosz zauway, e promie czerwonego lasera nie posiada skadowej wiata zielonego
ani niebieskiego. Wane jest rwnie to, e kada skadowa wiata (odbitego, rozpro-
szonego i otoczenia) moe przyjmowa wartoci od 00 do `0. Mona to interpretowa
w ten sposb, e wiato lasera czerwonego bdzie miao w pewnych scenach bardzo wy-
sok warto skadowej wiata odbitego, niewielk warto skadowej wiata rozproszo-
nego i bardzo ma warto skadowej wiata otoczenia. Tam, gdzie bdzie pada pro-
mie lasera, z pewnoci zobaczymy czerwon plamk. Poza tym w wyniku panujcych
w pokoju warunkw (dym, kurz itp.), skadowa rozproszenia z pewnoci pozwoli nam
dojrze w powietrzu promie lasera. W kocu skadowa owietlenia otoczenia (rwnie
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 239
z powodu wystpujcych w powietrzu czsteczek dymu lub kurzu) niewielk cz wiata
skieruje na elementy wyposaenia pokoju. Bardzo czsto czy si skadowe owietlenia
rozproszonego i otoczenia ze wzgldu na ich podobn natur.
/CVGTKC[YYKGEKGT\GE\[YKUV[O
wiato jest tylko jedn czci rwnania. W wiecie rzeczywistym obiekty maj swoje
wasne kolory. Wczeniej opisywalimy kolor obiektu jako kolor odbitego przez niego
wiata. Niebieska pika odbija wikszo niebieskich fotonw, a pochania wikszo
pozostaych. Zakadalimy wtedy, e wiato padajce na pik zawiera w sobie niebieskie
fotony, ktre mogyby by odbite i odebrane przez obserwatora. Najczciej, sceny owie-
tlane s wiatem biaym, ktre jest rwnomiern mieszank wszystkich kolorw. Dla-
tego w wietle biaym obiekty ujawniaj swoje naturalne kolory. Niestety, nie zawsze
mamy tak doskonae warunki. Jeeli nasza niebiesk pik umiecimy w ciemnym po-
koju i owietlimy j wiatem tym, to dla obserwatora pika bdzie czarna, poniewa
cae te wiato zostanie pochonite przez pik, a z braku niebieskich fotonw nic
nie bdzie si od niej odbijao.
9CEKYQEKOCVGTKCY
Korzystajc z owietlenia, nie definiujemy wieloktw, nadajc im jaki kolor, ale raczej
przypisujc im materia posiadajcy pewne waciwoci odblaskowe. Nie mwimy, e
wielokt jest czerwony, ale e jest zbudowany z materiau odbijajcego gwnie czerwone
wiato. Nadal moemy powiedzie, e obiekt ma czerwon powierzchni, ale teraz mu-
simy okreli jego waciwoci odblaskowe dla wiata otoczenia, rozproszenia i odbi-
tego. Materia moe by byszczcy i doskonale odbija wiato odbite, ale jednoczenie
pochania wiksz cz wiata rozproszenia lub otoczenia. Z drugiej strony materiay
matowe mog pochania wszelkie wiato odbite i w adnych okolicznociach nie mie
byszczcego wygldu. Inn waciwoci, jak musimy okreli, jest informacja o waci-
wociach emisji obiektw generujcych wasne wiato, takich jak tylne wiata samo-
chodw albo zegarki wiecce w ciemnociach.
&QFCYCPKGYKCVCFQOCVGTKCY
Takie ustawienie parametrw owietlenia i materiau, eby uzyska podane efekty,
wymaga pewnej praktyki. Nie ma adnych doskonaych porad, ani oglnych zasad, do
jakich naleaoby si stosowa. W tym miejscu analiza musi ustpi miejsca sztuce,
a nauka magii. Biblioteka OpenGL w czasie rysowania kadego obiektu decyduje
o kolorze, w jakim bdzie rysowany kady piksel tego obiektu. Sam obiekt ma kolor
odblasku, a i rdo wiata dysponuje wasnymi kolorami. W jaki sposb biblioteka okre-
la kolor nadawany pikselom? Stosowane tu zasady nie s trudne, cho wymaga to uycia
choby najprostszego mnoenia (a nauczyciele mwili, e kiedy si przyda!).
240 Cz I Klasyka OpenGL
Kademu wierzchokowi obiektu podstawowego przepisywana jest warto koloru RGB
wynikajca z iloczynu poczonych efektw owietlenia obiektu wiatem otoczenia,
rozproszenia i odbitym przez waciwoci odblaskowe materiau dla wiata otoczenia,
rozproszenia i odbitego. Efekt penego owietlenia obiektu uzyskiwany jest pniej po-
przez zastosowanie pynnego cieniowania wntrza wieloktw.
9[NKE\CPKGGHGMVYQYKGVNGPKCQVQE\GPKC
Wyliczajc efekty owietlenia otoczenia, musimy odoy na bok pojcie koloru i zacz
myle wycznie o intensywnociach skadowych czerwonej, zielonej i niebieskiej. Dla
rda wiata otoczenia o poowicznej intensywnoci wszystkich skadowych koloru
wartoci RGB tego rda wynosz (0.5, 0.5, 0.5). Jeeli to rdo owietla obiekt, ktrego
waciwoci odblaskowe dla wiata otoczenia wynosz (0.5, 1.0, 0.5), to wynikowy
kolor skadowych tego wiata wynosi:
05 ' 05 05 ' 10 05 ' 05| 05 05 05|
Jest to wynik mnoenia kadej skadowej rda wiata otoczenia przez odpowiadajce
im waciwoci odblaskowe materiau (rysunek 5.16).
kysunek 5.1.
Wyliczanie koloru
owietlenia otoczenia
dla obiektu
Wynika z tego, e skadowe koloru okrelaj tylko procent iloci wiata, jakie bdzie
odbijane od obiektu. W naszym przykadzie skadowa czerwona wiata miaa warto 0b,
a waciwoci materiau obiektu powodoway, e bya ona odbijana tylko w poowie
swojej poowicznej intensywnoci. Prosta matematyka mwi nam, e p razy p to
wier, czyli 0b.
'HGMV[YKCVCTQ\RTQU\GPKCKQFDKVGIQ
Wyliczenia dla wiata otoczenia s jednak wyjtkowo proste. wiato rozproszone rwnie
opisywane jest wartociami intensywnoci RGB, ktre w taki sam sposb cz si z wa-
ciwociami materiau obiektu. Jednak w tym przypadku wiato ma pewien kierunek,
dlatego jego intensywno na powierzchni obiektu bdzie rna w zalenoci od kta
padania wiata, odlegoci obiektu od rda, dowolnego czynnika tumicego (na przy-
kad mgy znajdujcej si midzy obiektem a rdem wiata) itp. Dokadnie te same
zalenoci dotycz rwnie rde i intensywnoci wiata odbitego. Efekt netto wartoci
RGB wyliczany jest w ten sam sposb co dla wiata otoczenia, czyli intensywno rda
wiata (zmodyfikowana przez kt padania) mnoona jest przez wspczynnik odblasku
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 241
materiau. Na kocu wszystkie trzy skadowe koloru czone s ze sob, tworzc kocowy
kolor obiektu. Jeeli ktrakolwiek ze skadowych bdzie miaa w wyniku tych wylicze
warto wiksz od `0, to zostanie ograniczona do tej wartoci. Nie mona przecie
mie intensywnoci wikszej od maksymalnej.
Oglnie, skadowe wiata otoczenia i rozproszonego maj prawie takie samo dziaanie
w rdach wiata i materiaach, dlatego najbardziej wpywaj na efektywny kolor obiek-
tw. wiato odbite i odpowiadajce mu waciwoci materiau najczciej s koloru
szarego lub biaego. Skadowa wiata odbitego najbardziej zaley od kta padania, wic
miejsca padania wiata odbitego najczciej s biae.
&QFCYCPKGYKCVGFQUEGP[
Moe si wydawa, e powysze wywody s ogromn iloci nagle podanej teorii. Zwol-
nimy wic i spokojnie przeanalizujemy przykady kodu koniecznego, jeeli chcemy stoso-
wa owietlenie sceny. W ten sposb utrwalimy sobie wszystkie podane wyej informacje,
a na dodatek zademonstrujemy kilka nowych funkcji i wymaga mechanizmu wiate
w bibliotece OpenGL. Nastpnych kilka przykadw opiera si bdzie na programie JET.
Pierwotna wersja nie stosuje adnych mechanizmw zwizanych z owietleniem i rysuje
po prostu trjkty z wczonym mechanizmem usuwania niewidocznych powierzchni
(testowanie gbi). Gdy zakoczymy wprowadza do niego poprawki i zaczniemy obraca
samolot, metaliczne powierzchnie naszego odrzutowca bd wspaniale lni w socu.
9E\GPKGQYKGVNGPKC
Aby nakaza bibliotece OpenGL przeprowadzanie oblicze zwizanych z owietleniem,
wystarczy wywoa funkcj ln.|e z parametrem O|_|1OHT1NO:
_!Fnao!e||T'TTN|,
Ju to proste wywoanie spowoduje, e biblioteka OpenGL w czasie okrelania kolorw
wszystkich wierzchokw sceny bdzie stosowaa waciwoci materiaw i parametry
owietlenia. Niestety, bez sprecyzowania tych waciwoci i parametrw nasz obiekt pozo-
staby ciemny i nieowietlony tak jak nasz przykadowy samolot z rysunku 5.17. Jeeli spoj-
rzymy na kod dowolnego z przykadowych programw wywodzcych si z programu JET,
to zobaczymy, e funkcj Se'u,RC wywoujemy zaraz po utworzeniu kontekstu renderowa-
nia. W tym wanie miejscu wykonywane s wszystkie inicjalizacje parametrw owietlenia.
-QPHKIWTQYCPKGOQFGNWQYKGVNGPKC
Pierwsz rzecz, jak musimy wykona zaraz po wczeniu obliczania owietlenia, to skon-
figurowanie modelu owietlenia. Trzy parametry wpywajce na model owietlenia usta-
wiane s za pomoc funkcji ||'Mcce.
242 Cz I Klasyka OpenGL
kysunek 5.17.
Nieowietlony samolot
nie odbija adnego
wiata
Pierwszym parametrem owietlenia uywanym w naszym nastpnym przykadzie (pro-
gram AMBIENT) jest O|_|1OHT_MODl|_AMB1lNT. Pozwala on okreli globalne wiato
otoczenia owietlajce wszystkie obiekty w ten sam sposb ze wszystkich stron. Podany
poniej kod definiuje jasne, biae wiato:
// Jasne biae wiato - pena intensywno wszystkich wartoci RGB
|f!oa! amo:en!|:_h! 10f 10f 10f 10f ,
// Wczenie owietlenia
_!Fnao!e||T'TTN|,
// Konfigurujemy model owietlenia tak, eby stosowa
// wiato otoczenia zdefiniowane tablic ambientLight[]
_!|:_h!Moce!fv||T'TMJOF|/MBTFNTamo:en!|:_h!|,
Podana tutaj wersja funkcji ||'Mcce ||'Mcce'v w pierwszym parametrze
pobiera informacj o typie owietlenia, jakie poddajemy modyfikacjom, a w drugim para-
metrze pobiera tablic wartoci RGBA opisujc wiato. Domylne wartoci RGBA dla
globalnego wiata otoczenia wynosz 0, 0, 0, `0), co oznacza bardzo przy-
ciemnione wiato. Pozostae parametry modelu owietlenia pozawalaj okreli, czy
owietlane maj by przednie, tylnie czy moe obie strony wieloktw oraz metody obli-
czania owietlenia wiatem odbitym. Wicej informacji o tych parametrach znajduje si
w podrozdziale Opisy funkcji.
7UVCNCPKGYCEKYQEKOCVGTKCY
Mamy ju rdo wiata otoczenia. Musimy teraz ustali waciwoci materiaw, tak eby
nasze wielokty mogy odbija to wiato, a my zobaczy samolot. Istniej dwie metody
ustalania waciwoci materiaw. Pierwsza z nich polega na uyciu funkcji M.'er.
przed zdefiniowaniem kadego wielokta lub zbioru wieloktw. Przyjrzymy si poni-
szemu fragmentowi kodu:
|f!oa! _ra, 075f 075f 075f 10f,
_!|:_h!fv||T'T0|PJSTTTJN!:_h!Pos|,
W powyszych wierszach w tablicy |'Pcs zapisywana jest pozycja rda wiata.
Ostatnia warto w tej tablicy to `0, co oznacza, e rdo wiata zlokalizowane jest
w podanych wsprzdnych. Gdybymy podali tam warto 00, oznaczaoby to, e rdo
wiata znajduje si w nieskoczonej odlegoci od sceny, a w tablicy podany jest wektor
kierunku, z ktrego bd paday promienie. Pniej powiemy nieco wicej na ten temat.
wiata s podobne do obiektw geometrycznych pod tym wzgldem, e moemy je prze-
mieszcza za pomoc macierzy model-widok. Umiejscawiajc wiato w momencie wyko-
nywania przeksztacenia punktu widzenia, zyskujemy pewno, e bdzie ono ustawione
prawidowo, niezalenie od pniejszych przeksztace geometrii.
7UVCNCPKGYCEKYQEKOCVGTKCY
Prosz zauway, e na listingu 5.3 wczany jest mechanizm ledzenia kolorw. Jest on
te konfigurowany tak, e ledzeniu podlegaj waciwoci odblasku wiata otoczenia
i rozproszenia dla przednich powierzchni wieloktw. Dokadnie tak samo postpowalimy
w przykadowym programie AMBIENT:
Rozdzia 5. Kolor, materiay i owietlenie. Podstawy 253
// Wczenie ledzenia kolorw
_!Fnao!e|CJ|JRM/TFRT/||,
// Waciwoci owietlenia otoczenia i rozproszenia
// bd ledzi wartoci podawane funkcji glColor
_!Co!orMa!er:a!|FRJNT |/MBTFNT/NOOTFFUSF|,
&GHKPKQYCPKGYKGNQMVY
W zwizku z obsug nowego modelu owietlenia kod renderujcy znany z dwch pierw-
szych przykadowych programw JET musia zosta znaczco przebudowany. Na listingu
5.4 przedstawiono wycinek kodu pochodzcy z funkcji RencerScene z programu LITJET.
I|st|ng 5.4. Przykadowy kod ustalajcy kolor oraz wyliczajcy wektory normalne wieloktw
|TVec!or vNorma!, // Przechowuje wyliczone wektory normalne
// Wczenie owietlenia
_!Fnao!e||T'TTN|,
// Konfiguracja i wczenie wiata numer 0
_!|:_h!fv||T'T0|/MBTFNTamo:en!|:_h!|,
_!|:_h!fv||T'T0|OTFFUSFc:ffuse|:_h!|,
_!|:_h!fv||T'T0|SPFCU|/Rspecu!ar|,
_!Fnao!e||T'T0|,
W tablicy s,ecu.r zdefiniowana zostaa bardzo jasna skadowa biaego wiata odbitego.
Chcemy w ten sposb zasymulowa jasne wiato soneczne. Ponisz lini dodajemy
do rda wiata O|_|1OHT0 przygotowan wczeniej skadow wiata odbitego:
_!|:_h!fv||T'T0|SPFCU|/Rspecu!ar|,
Jeeli byaby to jedyna zmiana, jak wprowadzilibymy do programu LITJET, to wygld
wywietlanego samolotu nie zmieniby si ani troch. Po prostu nie zdefiniowalimy
jeszcze adnych waciwoci odblaskowych materiau samolotu.
256 Cz I Klasyka OpenGL
9URE\[PPKMQFDKEKC
Uzupenienie waciwoci materiau o wspczynnik odbicia jest niemal tak proste jak
uzupenienie rda wiata o skadow wiata odbitego. Poniszy fragment kodu pochodzi
z programu LITJET i ponownie zosta zmodyfikowany tak, aby doda do waciwoci
materiau informacj o wspczynniku odbicia wiata odbitego:
// Wsprzdne i wartoci owietlenia
|f!oa! specref 10f 10f 10f 10f ,
glUseProgram(myShader);
glUniform1f(locTime, 45.2f);
glUniform1i(locIndex, 42);
glUniform4f(locColor, 1.0f, 0.0f, 0.0f, 1.0f);
glUniform1i(locFlag, GL_FALSE);
Zwrmy uwag, e do przekazania wartoci logicznej uylimy cakowitoliczbowej wersji
funkcji glUniform. Wartoci logiczne mona rwnie przekazywa jako wartoci zmiennoprze-
cinkowe, gdzie 0.0 oznacza fasz, a 1.0 prawd.
Tablice uniform
Istniej rwnie wersje funkcji glUniform pobierajce jako parametr wskanik, ktry moe wska-
zywa tablic wartoci.
void glUniform1fv(GLint location, GLuint count, GLfloat* v);
void glUniform2fv(GLint location, GLuint count, Glfloat* v);
void glUniform3fv(GLint location, GLuint count, GLfloat* v);
void glUniform4fv(GLint location, GLuint count, GLfloat* v);
void glUniform1iv(GLint location, GLuint count, GLint* v);
void glUniform2iv(GLint location, GLuint count, GLint* v);
void glUniform3iv(GLint location, GLuint count, GLint* v);
void glUniform4iv(GLint location, GLuint count, GLint* v);
Parametr count okrela liczb elementw w tablicy zawierajcej x skadnikw, gdzie x oznacza
liczb na kocu nazwy funkcji. Jeli np. mamy zmienn uniform zawierajc cztery skadniki:
uniform vec4 vColor;
W C i C++ moglibymy j zdefiniowa jako tablic liczb zmiennoprzecinkowych:
GLfloat vColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
262
Cz I Podstawy
Poniewa jest to pojedyncza tablica czterech wartoci, do przekazania jej do shadera wykorzy-
stalibymy nastpujc konstrukcj:
glUniform4fv(iColorLocation, 1, vColor);
Gdybymy jednak mieli w shaderze tak tablic wartoci kolorw:
uniform vec4 vColors[2];
Wwczas w C++ dane te moglibymy zdefiniowa i przekaza nastpujco:
GLfloat vColors[2][4] = {{ 1.0f, 1.0f, 1.0f, 1.0f },
{ 1.0f, 0.0f, 0.0f, 1.0f }};
...
glUniform4fv(iColorLocation, 2, vColors);
Najprostsze ustawienie jednej zmiennoprzecinkowej wartoci uniform moe wyglda tak:
GLfloat fValue = 45.2f;
glUniform1fv(iLocation, 1, &fValue);
Macierze uniform
Na zakoczenie pokaemy, jak si ustawia macierz uniform. W shaderach typy macierzowe
przechowuj tylko wartoci zmiennoprzecinkowe, przez co mamy znacznie mniej rnych wer-
sji. Ponisze funkcje aduj odpowiednio macierze 22, 33 oraz 44.
glUniformMatrix2fv(GLint location, GLuint count, GLboolean transpose,
const GLfloat *m);
glUniformMatrix3fv(GLint location, GLuint count, GLboolean transpose,
const GLfloat *m);
glUniformMatrix4fv(GLint location, GLuint count, GLboolean transpose,
const GLfloat *m);
Zmienna count okrela liczb macierzy we wskaniku m (tak, mona tworzy tablice macierzy!).
Znacznik logiczny transpose zostaje ustawiony na warto true, jeli macierz jest ustawiona
w porzdku kolumnowym (ustawienie to jest preferowane w OpenGL). Ustawienie tej wartoci
na GL_FALSE powoduje transpozycj macierzy podczas jej kopiowania do shadera. Moe to by
przydatne, gdybymy korzystali z biblioteki macierzowej stosujcej porzdek wierszowy macierzy
(np. Direct3D).
Paski shader
Zobaczmy przykadowy shader wykorzystujcy zmienne uniform. W zestawie shaderw stan-
dardowych mamy paski shader, ktry tylko przeksztaca geometri i ustawia jej jaki pojedynczy
kolor. Uywane s w nim atrybuty pooenia wierzchokw i dwie zmienne uniform macierz
przeksztacenia i warto koloru.
263
Rozdzia 6. Mylenie niekonwencjonalne programy do cieniowania
Program FlatShader rysuje obracajcy si torus i ustawia jego kolor na niebieski. Renderujemy
go w trybie szkieletowym za pomoc funkcji glPolygonMode, aby byo wyranie wida, e jest
trjwymiarowy. Wikszo zastosowanego kodu klienckiego OpenGL jest ju nam dobrze
znana, dlatego nie zamieszczamy tu penego kodu programu. Na listingach 6.4 i 6.5 przedstawiony
jest peny kod obu shaderw.
Listing 6.4. Shader wierzchokw FlatShader
// Shader paski
// Shader wierzchokw
// Richard S. Wright Jr
// OpenGL. Ksiga eksperta
#version 330
// Macierz przeksztacenia
uniform mat4 mvpMatrix;
// Dane wejciowe wierzchokw
in vec4 vVertex;
void main(void)
{
// To wszystko, przeksztacamy geometri
gl_Position = mvpMatrix * vVertex;
}
Listing 6.5. Shader fragmentw FlatShader
// Shader paski
// Shader fragmentw
// Richard S. Wright Jr
// OpenGL. Ksiga eksperta
#version 130
// Tworzenie jednolitej geometrii
uniform vec4 vColorValue;
// Wyjcie koloru fragmentu
out vec4 vFragColor;
void main(void)
{
vFragColor = vColorValue;
}
W shaderze wierzchokw na listingu 6.4 znajduje si jedna zmienna uniform reprezentujca
konkatenowan macierz przeksztacenia:
uniform mat4 mvpMatrix;
264
Cz I Podstawy
Jedyn czynnoci wykonywan przez ten shader jest przeksztacenie wierzchoka przy uyciu
macierzy rzutowania model-widok. Jak wida, mnoenie macierzowego typu danych przez wekto-
rowy w jzyku GLSL jest czym naturalnym.
gl_Position = mvpMatrix * vVertex;
W shaderze fragmentw na listingu 6.5 rwnie znajduje si tylko jedna zmienna uniform
bdca czteroskadnikow wartoci koloru, ktry zostanie zastosowany na rasteryzowanych
fragmentach.
uniform vec4 vColorValue;
Po stronie klienckiej program wczytuje oba pliki shaderw i w funkcji SetupRC tworzy wskaniki
do obu zmiennych uniform.
GLuint flatShader;
GLint locMP;
GLint locColor;
Powyszy fragment kodu tworzy najpierw dwa obiekty tekstur, a nastpnie kreuje za ich
pomoc dwie jednostki tekstur uywane do tworzenia tekstur wielokrotnych.
Okrelanie wsprzdnych tekstury
Teraz, gdy wiadomo ju, w jaki sposb tworzy jednostki tekstur, naley zapozna si ze
sposobem ich uycia. Jako e pojedynczy wielokt bdzie wicej ni jedn tekstur,
trzeba zdefiniowa dla niego take wicej ni jeden zestaw wsprzdnych tekstury. Dla
kadej jednostki tekstury naley wic dysponowa osobnym zbiorem wsprzdnych
tekstury i zastosowa je dla kadego wierzchoka z osobna. Aby okreli wsprzdne
tekstury dwuwymiarowej mona zastosowa funkcj glMultTexCoord2A|O` zdefinio-
wan w nastpujcy sposb:
vud |ul1exCuurd?fARB|enun VGZ7PKV, fual EQQTFU),
Inne wersje tej funkcji umoliwiaj okrelenie wsprzdnych tekstu jedno-, trj- oraz
czterowymiarowych take za pomoc wartoci innych typw ni loet. Na przykad
funkcja glMultTexCoord8dA|O` pozwala okreli wsprzdne tekstury trjwymiaro-
wej za pomoc wartoci typu double. Korzystajc z tych funkcji naley poda najpierw
jednostk tekstury, a nastpnie jej wsprzdne. Oto przykad:
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
Powysze wywoanie funkcji nadaje biecemu wierzchokowi wsprzdne (C.C, C.C)
pierwszej jednostki tekstur. Podobnie jak w przypadku funkcji glTexCoord2` trzeba
242 Cz II Korzystanie z OpenGL
okreli najpierw wsprzdne wszystkich uywanych jednostek tekstur, a dopiero po-
tem zdefiniowa wierzchoek. Ilustruje to poniszy fragment kodu:
Ben|_UADS),
ewy, duny werzchue|
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8f-5Df, -5Df, -5Df),
prawy, duny werzchue|
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8f5Df, -5Df, -5Df),
prawy, urny werzchue|
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8f5Df, 5Df, -5Df),
ewy, urny werzchue|
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8f-5Df, 5Df, -5Df),
End),
Fragment ten rysuje kwadrat pokryty dwiema teksturami. Dla kadego wierzchoka de-
finiuje wsprzdne obu tekstur.
Naley pamita, e przy stosowaniu tekstur wielokrotnych funkcja glTexCoord2` po-
zwala na zdefiniowanie wsprzdnych tekstury tylko dla pierwszej jednostki tekstury.
W takim przypadku wywoanie funkcji glTexCoord2` jest wic rwnowane wywoa-
niu glMultTexCoord2C|_TLXTU|LC_A|O, ...`.
Przykad zastosowania tekstur wielokrotnych
Teraz analizie zostanie poddany kompletny przykad programu, ktry pokrywa szecian
dwiema teksturami pokazanymi na rysunku 9.2.
Rysunek 9.2.
Dwie tekstury,
ktrymi pokryty
zostanie szecian
A oto pierwszy fragment kodu programu:
Defnce
#defne B1|AP_D Dx4D4? denlyf|alur furnalu B|P
#defne P 814195
ncudes
#ncude <wnduwsh> slandarduwy p| nauw|uwy unduws
#ncude <slduh>
#ncude <sldbh>
#ncude <nalhh>
Rozdzia 9. Zaawansowane odwzorowania tekstur 243
#ncude <h> slandarduwy p| nauw|uwy pen|
#ncude <uh> p| nauw|uwy bbule| |U
#ncude 'exlh' p| nauw|uwy ruzszerze pen|
1ypy
lypedef slrucl
{
nl wdlh, szeru|uc le|slury
nl hehl, wysu|uc le|slury
unsned nl lexD, ube|l le|slury
unsned char *dala, dane le|slury
} lexlure_l,
Znenne ubane
HDC _HDC, ubany |unle|sl urzadzena
buu fuScreen - fase, lrue - lryb penue|ranuwy
fase - lryb u|en|uwy
buu |eyPressed[?5G], labca przycnec |awszy
fual ane - DDf, |al ubrulu
fual radans - DDf, |al ubrulu |anery w radanach
Znenne nyszy |anery
nl nuuseX, nuuse\, wspurzedne nyszy
fual caneraX, canera\, caneraZ, wspurzedne |anery
fual uu|X, uu|\, uu|Z, pun|l wyceuwana |anery
Znenne le|slur
lexlure_l *sne1ex,
lexlure_l *chec|er1ex,
Znenne zwazane z le|sluran weu|rulnyn
P|N||U|11EXCRD?|ARBPRC |ul1exCuurd?fARB - NU||,
P|N|AC1VE1EX1UREARBPRC Aclve1exlureARB - NU||,
P|N|C|EN1AC1VE1EX1UREARBPRC CenlAclve1exlureARB - NU||,
nl nax1exlureUnls - D, dupuszczana czba ednusle| le|slur
Plik nagwkowy glext.h naley docza wtedy, gdy korzysta si z jakichkolwiek roz-
szerze OpenGL zatwierdzonych przez ARB. Plik ten zawiera definicje wszystkich roz-
szerze. Jego kopia umieszczona zostaa take na dysku CD.
Powyszy fragment kodu prezentuje take sposb wykorzystania struktur do przecho-
wywania informacji o teksturze i jej danych. Typ texture_t 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. Nato-
miast 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 IrStr`.
Zwraca ona warto true, jeli acuch eerc|Str zostanie odnaleziony wewntrz a-
cucha tr, ktry zawiera wiele nazw oddzielonych znakami spacji.
244 Cz II Korzystanie z OpenGL
buu nSlrchar *searchSlr, char *slr)
{
char *endfSlr, ws|an| uslalneu zna|u acucha
nl dx - D,
endfSlr - slr + slrenslr), uslaln zna| acucha
pela wy|unywana a du usaneca |uca acucha
whe slr < endfSlr)
{
udnadue puuene |ueneu zna|u spac
dx - slrcspnslr, ' '),
sprawdza, czy slr ws|azue puszu|wana nazwe
f slrensearchSlr) -- dx) && slrncnpsearchSlr, slr, dx) -- D))
{
relurn lrue,
}
ne esl lu puszu|wana nazwa, przesuwany ws|an| du |uene nazwy
slr +- dx + 1),
}
relurn fase,
}
W celu umoliwienia korzystania z tekstur wielokrotnych program definiuje funkcj Irt
MultTex`, ktra sprawdza, czy dostpne jest rozszerzenie o nazwie C|_A|O_ulttexture,
a ponadto pozyskuje wskaniki funkcji rozszerze. Funkcja IrtMultTex` zwraca war-
to ele, jeli tworzenie tekstur wielokrotnych nie jest dostpne.
buu nl|ul1ex)
{
char *exlensunSlr, sla duslepnych ruzszerze
exlensunSlr - char*)elSlrn|_EX1ENSNS),
f exlensunSlr -- NU||)
relurn fase,
f nSlr'|_ARB_nullexlure', exlensunSlr))
{
zwraca dupuszczana czbe ednusle| le|slur
elnleerv|_|AX_1EX1URE_UN1S_ARB, &nax1exlureUnls),
pubera adresy fun|c ruzszerze
|ul1exCuurd?fARB - P|N||U|11EXCRD?|ARBPRC)
welPrucAddress'|ul1exCuurd?fARB'),
Aclve1exlureARB - P|N|AC1VE1EX1UREARBPRC)
welPrucAddress'Aclve1exlureARB'),
CenlAclve1exlureARB - P|N|C|EN1AC1VE1EX1UREARBPRC)
welPrucAddress'CenlAclve1exlureARB'),
relurn lrue,
}
ese
relurn fase,
}
Rozdzia 9. Zaawansowane odwzorowania tekstur 245
Kolejna funkcja, |oedTextureFle`, aduje pojedyncz tekstur i umieszcza jej opis
w strukturze typu texture_t i zwraca wskanik tej struktury. Parametrem funkcji |oed
TextureFle` jest nazwa pliku. W celu zaadowania jego zawartoci wywouje ona
funkcj |oedOtepFle` i umieszcza informacje o zaadowanym obrazie w strukturze
typu texture_t. Funkcja |oedTextureFle` tworzy take obiekt tekstury.
lexlure_l *|uad1exlure|echar *fenane)
{
B1|APN|HEADER lexnfu,
lexlure_l *lhs1exlure,
przydzea panec slru|lurze lypu lexlure_l
lhs1exlure - lexlure_l*)naucszeuflexlure_l)),
f lhs1exlure -- NU||)
relurn NU||,
adue ubraz le|slury sprawdza puprawne wy|unane le uperac
lhs1exlure->dala - |uadBlnap|efenane, &lexnfu),
f lhs1exlure->dala -- NU||)
{
freelhs1exlure),
relurn NU||,
}
uneszcza nfurnace u szeru|uc wysu|uc le|slury
lhs1exlure->wdlh - lexnfubudlh,
lhs1exlure->hehl - lexnfubHehl,
lwurzy ube|l le|slury
en1exlures1, &lhs1exlure->lexD),
relurn lhs1exlure,
}
Jako e opanowana ju zostaa umiejtno adowania tekstury, mona zapozna si z ko-
lejn funkcj, ktra moe zaadowa wszystkie tekstury uywane w programie i skonfi-
gurowa je tak, by moliwe byo ich wykorzystanie do tworzenia tekstur wielokrotnych.
Funkcja |oedAllTexture` aduje wszystkie tekstury, okrela ich parametry, tworzy mi-
pmapy i wie obiekty tekstur z jednostkami tekstur.
buu |uadA1exlures)
{
adue perwsza le|slure
sne1ex - |uad1exlure|e'snebnp'),
f sne1ex -- NU||)
relurn fase,
adue drua le|slure
chec|er1ex - |uad1exlure|e'chessbnp'),
f chec|er1ex -- NU||)
relurn fase,
lwurzy npnapy z flruwanen nuwyn da perwsze le|slury
Bnd1exlure|_1EX1URE_?D, sne1ex->lexD),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|A_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|N_||1ER, |_|NEAR),
246 Cz II Korzystanie z OpenGL
1exEnv|_1EX1URE_ENV, |_1EX1URE_ENV_|DE, |_REP|ACE),
uBud?D|pnaps|_1EX1URE_?D, |_RB, sne1ex->wdlh, sne1ex->hehl,
|_RB, |_UNSNED_B\1E, sne1ex->dala),
lwurzy npnapy z flruwanen nuwyn da drue le|slury
Bnd1exlure|_1EX1URE_?D, chec|er1ex->lexD),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|A_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|N_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_S, |_REPEA1),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_1, |_REPEA1),
1exEnv|_1EX1URE_ENV, |_1EX1URE_ENV_|DE, |_|DU|A1E),
uBud?D|pnaps|_1EX1URE_?D, |_RB, chec|er1ex->wdlh, chec|er1ex->hehl,
|_RB, |_UNSNED_B\1E, chec|er1ex->dala),
wybera perwsza ednusl|e le|slury
Aclve1exlureARB|_1EX1URED_ARB),
Enabe|_1EX1URE_?D),
Bnd1exlure|_1EX1URE_?D, sne1ex->lexD), wae ednusl|e z perwsza le|slura
wybera drua ednusl|e le|slury
Aclve1exlureARB|_1EX1URE1_ARB),
Enabe|_1EX1URE_?D),
Bnd1exlure|_1EX1URE_?D, chec|er1ex->lexD), wae ednusl|e z drua le|slura
relurn lrue,
}
Funkcja Irtelze` inicjuje dane programu:
vud nlaze)
{
CearCuurDDf, DDf, DDf, DDf), lu w czarnyn |uurze
Shade|ude|_S|1H), cenuwane ad|e
Enabe|_DEP1H_1ES1), usuwane u|rylych puwerzchn
Enabe|_CU||_|ACE), bra| ubcze da newducznych slrun weu|aluw
|runl|ace|_CCu), newduczne slruny pusadaa purzade| werzchu|uw
przecwny du |erun|u ruchu ws|azuwe| zeara
Enabe|_1EX1URE_?D), wacza le|slury dwuwynaruwe
nl|ul1ex),
|uadA1exlures),
}
Szecian narysowa mona za pomoc rozbudowanej wersji funkcji DrewCube` znanej
z poprzednich przykadw. Bdzie ona korzysta z funkcji glMultTexCoord2` w miej-
sce funkcji glTexCoord2` w celu zdefiniowania wsprzdnych jednostek tekstur dla
kadego wierzchoka szecianu:
vud DrawCubefual xPus, fual yPus, fual zPus)
{
Push|alrx),
1ransalefxPus, yPus, zPus),
Ben|_UADS),
Nurna8fDDf, 1Df, DDf), urna cana
Rozdzia 9. Zaawansowane odwzorowania tekstur 247
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8fD5f, D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8fD5f, D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8f-D5f, D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8f-D5f, D5f, D5f),
End),
Ben|_UADS),
Nurna8fDDf, DDf, 1Df), przedna cana
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8fD5f, D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8f-D5f, D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8f-D5f, -D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8fD5f, -D5f, D5f),
End),
Ben|_UADS),
Nurna8f1Df, DDf, DDf), prawa cana
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8fD5f, D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8fD5f, -D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8fD5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8fD5f, D5f, -D5f),
End),
Ben|_UADS),
Nurna8f-1Df, DDf, DDf), ewa cana
248 Cz II Korzystanie z OpenGL
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8f-D5f, D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8f-D5f, D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8f-D5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8f-D5f, -D5f, D5f),
End),
Ben|_UADS),
Nurna8fDDf, -1Df, DDf), duna cana
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8f-D5f, -D5f, D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8f-D5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8fD5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8fD5f, -D5f, D5f),
End),
Ben|_UADS),
Nurna8fDDf, DDf, -1Df), lyna cana
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, DDf),
Verlex8fD5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, DDf),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, DDf),
Verlex8f-D5f, -D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, 1Df, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, 1Df, 1Df),
Verlex8f-D5f, D5f, -D5f),
|ul1exCuurd?fARB|_1EX1URED_ARB, DDf, 1Df),
|ul1exCuurd?fARB|_1EX1URE1_ARB, DDf, 1Df),
Verlex8fD5f, D5f, -D5f),
End),
Pup|alrx),
}
Rozdzia 9. Zaawansowane odwzorowania tekstur 249
Wikszo kodu funkcji |erder` znana jest z poprzednich przykadw. Okrela ona po-
oenie kamery i rysuje szecian.
vud Render)
{
radans - fualP*ane-9DDf)1BDDf),
wyznacza puuene |anery
caneraX - uu|X + snradans)*nuuse\,
caneraZ - uu|Z + cusradans)*nuuse\,
canera\ - uu|\ + nuuse\ ?Df,
wyceuwue |anere w pun|l D,D,D)
uu|X - DDf,
uu|\ - DDf,
uu|Z - DDf,
upruna bufury e|ranu eb
Cear|_C|R_BU||ER_B1 | |_DEP1H_BU||ER_B1),
|uaddenlly),
uneszcza |anere
u|uu|AlcaneraX, canera\, caneraZ, uu|X, uu|\, uu|Z, DD, 1D, DD),
s|aue szecan du ruznaruw 15x15x15
Scaef15Df, 15Df, 15Df),
rysue szecan u rud|u w pun|ce D,D,D)
DrawCubeDDf, DDf, DDf),
SwapBuffers_HDC), przeacza bufury
}
Po umieszczeniu omwionych funkcji w szkielecie standardowej aplikacji systemu Win-
dows uzyskany zostanie program, ktrego dziaanie ilustruje rysunek 9.3.
Rysunek 9.3.
Przykad
zastosowania
tekstury wielokrotnej
250 Cz II Korzystanie z OpenGL
Tekstury wielokrotne mog by rdem doskonaych efektw i dlatego z pewnoci
warto z nimi poeksperymentowa troch wicej. Pora jednak na omwienie kolejnego
doskonaego narzdzia tworzenia zaawansowanych efektw graficznych: odwzorowania
otoczenia.
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 utwo-
rzy 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 tek-
stury mona te oblicza indywidualnie, jednak zmniejsza to zwykle efektywno two-
rzenia grafiki.
Aby skorzysta w OpenGL z moliwoci odwzorowania otoczenia, niezbdny jest po-
niszy fragment kodu:
1exenf|_S, |_1EX1URE_EN_|DE, |_SPHERE_|AP),
1exenf|_1, |_1EX1URE_EN_|DE, |_SPHERE_|AP),
Enabe|_1EX1URE_EN_S),
Enabe|_1EX1URE_EN_1),
naslepne wybera le|slure uluczena rysue ube|l
I to wszystko! Teraz naley przeanalizowa przykad zastosowania moliwoci odwzo-
rowania otoczenia.
Torus na niebie
Omwiony teraz zostanie przykad zastosowania moliwoci odwzorowania otoczenia
w programie, ktry rysowa bdzie torus pokryty tekstur otoczenia. Rysunek 9.4 przed-
stawia 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.
Rozdzia 9. Zaawansowane odwzorowania tekstur 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 frag-
menty zwizane z tworzeniem tekstur i rysowaniem grafiki:
lypedef slrucl
{
nl wdlh, szeru|uc le|slury
nl hehl, wysu|uc le|slury
unsned nl lexD, ube|l le|slury
unsned char *dala, dane le|slury
} lexlure_l,
buu |uadA1exlures)
{
adue ubraz le|slury uluczena
env1ex - |uad1exlure|e's|y-spherebnp'),
f env1ex -- NU||)
relurn fase,
s|y1ex - |uad1exlure|e's|ybnp'),
f s|y1ex -- NU||)
relurn fase,
252 Cz II Korzystanie z OpenGL
lwurzy npnapy z flruwanen nuwyn da le|slury uluczena
Bnd1exlure|_1EX1URE_?D, env1ex->lexD),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|A_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|N_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_S, |_REPEA1),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_1, |_REPEA1),
uBud?D|pnaps|_1EX1URE_?D, |_RB, env1ex->wdlh, env1ex->hehl,
|_RB, |_UNSNED_B\1E, env1ex->dala),
lwurzy npnapy z flruwanen nuwyn da le|slury neba
Bnd1exlure|_1EX1URE_?D, s|y1ex->lexD),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|A_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_|N_||1ER, |_|NEAR),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_S, |_REPEA1),
1exParaneler|_1EX1URE_?D, |_1EX1URE_uRAP_1, |_REPEA1),
uBud?D|pnaps|_1EX1URE_?D, |_RB, s|y1ex->wdlh, s|y1ex->hehl,
|_RB, |_UNSNED_B\1E, s|y1ex->dala),
relurn lrue,
}
vud Render)
{
zwe|sza |al ubrulu
f ane > 8GDDf)
ane - DDf,
ane - ane + D?f,
upruna bufury e|ranu eb
Cear|_C|R_BU||ER_B1 | |_DEP1H_BU||ER_B1),
|uaddenlly),
Bnd1exlure|_1EX1URE_?D, s|y1ex->lexD),
Ben|_UADS),
1exCuurd?fDDf, DDf),
Verlex8f-?DDDf, -?DDDf, -1?DDf),
1exCuurd?f1Df, DDf),
Verlex8f?DDDf, -?DDDf, -1?DDf),
1exCuurd?f1Df, 1Df),
Verlex8f?DDDf, ?DDDf, -1?DDf),
1exCuurd?fDDf, 1Df),
Verlex8f-?DDDf, ?DDDf, -1?DDf),
End),
udsuwa ube|l ubraca u wzeden wszysl|ch us u|adu wspurzednych
1ransalefDDf, DDf, -1DDDf),
Rulalefane, 1Df, DDf, DDf),
Rulalefane, DDf, 1Df, DDf),
Rulalefane, DDf, DDf, 1Df),
|unfurue udwzuruwane uluczena
1exenf|_S, |_1EX1URE_EN_|DE, |_SPHERE_|AP),
1exenf|_1, |_1EX1URE_EN_|DE, |_SPHERE_|AP),
Enabe|_1EX1URE_EN_S),
Enabe|_1EX1URE_EN_1),
Rozdzia 9. Zaawansowane odwzorowania tekstur 253
wybera le|slure uluczena
Bnd1exlure|_1EX1URE_?D, env1ex->lexD),
rysue lurus u prunenu wewnelrznyn ruwnyn 1D ednusle|
prunenu zewnelrznyn ?D ednusle|
auxSud1urus1DDf, ?DDf),
|ush),
SwapBuffers_HDC), przeacza bufury
}
Jak atwo zauway, stosowanie odwzorowania otoczenia w OpenGL jest niezwykle
proste, o ile pozwoli si maszynie OpenGL automatycznie wyznacza wsprzdne tek-
stury. Wsprzdne te mona oblicza indywidualnie, aby uzyska inne efekty specjalne,
ale zagadnienie to nie bdzie tutaj omawiane.
Macierze tekstur
W rozdziale 5. omwione zostay sposoby wykonywania przeksztace wierzchokw,
takich jak przesunicie, obrt i skalowanie za pomoc macierzy modelowania. Przed-
stawiona 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 glTrerlete` mona zastosowa
do przesunicia tekstury na odpowiedni powierzchni. Podobnie funkcj gl|otete`
mona wykorzysta do obrotu ukadu wsprzdnych tekstury i uzyska w efekcie obrt
tekstury. Gra American McGees Alice firmy Electronic Arts and Rogue Entertain-
ment 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 glMultMetrx`, glPu|Metrx`, glPopMetrx`
oraz funkcje przeksztace. Najpierw jednak trzeba poinformowa maszyn OpenGL,
e wykonywane bd operacje na macierzy tekstur:
|alrx|ude|_1EX1URE),
Od tego momentu na macierzy tekstur i stosie macierzy tekstur mona wykonywa do-
wolne operacje. Po ich zakoczeniu naley poleci maszynie OpenGL powrt do ma-
cierzy modelowania, aby zamiast tekstur przeksztaca obiekty.
Poniej zaprezentowany zosta fragment kodu ilustrujcy sposb wykonywania obrotu
tekstury:
upruna bufury e|ranu eb
Cear|_C|R_BU||ER_B1 | |_DEP1H_BU||ER_B1),
|uaddenlly),
wybera lryb uperac na nacerzy le|slur
|alrx|ude|_1EX1URE),
|uaddenlly),
254 Cz II Korzystanie z OpenGL
Rulalefane, DDf, DDf, 1Df), ubraca le|slure
przywraca lryb uperac na nacerzy nudeuwana
|alrx|ude|_|DE|VEu),
Bnd1exlure|_1EX1URE_?D, lexD), wybera le|slure
rysue czwuru|al pu|ryly le|slura
Ben|_UADS),
1exCuurd?fDDf, DDf),
Verlex8f-?DDf, -?DDf, -4DDf),
1exCuurd?f1Df, DDf),
Verlex8f?DDf, -?DDf, -4DDf),
1exCuurd?f1Df, 1Df),
Verlex8f?DDf, ?DDf, -4DDf),
1exCuurd?fDDf, 1Df),
Verlex8f-?DDf, ?DDf, -4DDf),
End),
Kod ten wybiera najpierw macierz tekstury jako biec macierz. Nastpnie aduje do
niej macierz jednostkow, zanim zastosuje do biecej macierzy funkcj obrotu gl|ote
te`. Na skutek jej uycia tekstura zostaje obrcona o pewien kt wzgldem osi z. Po
wykonaniu obrotu wybiera macierz modelowania jako biec macierz i rysuje czworo-
kt pokryty obrcon tekstur. Proste, prawda?
Gdyby po czworokcie zostay narysowane kolejne obiekty, to take zostayby one po-
kryte obrcon tekstur. Rozwizanie tego problemu zaprezentowane zostao poniej:
upruna bufury e|ranu eb
Cear|_C|R_BU||ER_B1 | |_DEP1H_BU||ER_B1),
|uaddenlly),
wybera lryb uperac na nacerzy le|slur
|alrx|ude|_1EX1URE),
|uaddenlly),
Rulalefane, DDf, DDf, 1Df), ubraca le|slure
przywraca lryb uperac na nacerzy nudeuwana
|alrx|ude|_|DE|VEu),
Bnd1exlure|_1EX1URE_?D, lexD), wybera le|slure
rysue czwuru|al pu|ryly le|slura
Ben|_UADS),
1exCuurd?fDDf, DDf),
Verlex8f-?DDf, -?DDf, -4DDf),
1exCuurd?f1Df, DDf),
Verlex8f?DDf, -?DDf, -4DDf),
1exCuurd?f1Df, 1Df),
Verlex8f?DDf, ?DDf, -4DDf),
1exCuurd?fDDf, 1Df),
Verlex8f-?DDf, ?DDf, -4DDf),
End),
reselue nacerz le|slur da naslepnych ube|luw
|alrx|ude|_1EX1URE),
|uaddenlly),
|alrx|ude|_|DE|VEu),
rysue naslepne ube|ly