Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
OpenGL. Ksiga
eksperta. Wydanie III
Autorzy: Richard S. Wright Jr., Benjamin Lipchak
Tumaczenie: Wojciech Moch (wstp, rozdz. 1 9), Rafa Joca
(rozdz. 10 14), Marek Ptlicki (rozdz. 15 23, dod. A C)
ISBN: 83-7361-703-5
Tytu oryginau: OpenGL Superbible
Format: B5, stron: 1080
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
5RKUVTGEK
! "
O co tu chodzi?.................................................................................................................................... 29
Krtka historia grafiki komputerowej.................................................................................................. 29
Pojawienie si monitorw CRT..................................................................................................... 30
Wejcie w trzeci wymiar ............................................................................................................... 31
Przegld efektw trjwymiarowych .................................................................................................... 33
Perspektywa .................................................................................................................................. 34
Kolorowanie i cieniowanie............................................................................................................ 34
wiato i cienie.............................................................................................................................. 34
Odwzorowywanie tekstur.............................................................................................................. 35
Mga .............................................................................................................................................. 36
Mieszanie i przezroczysto .......................................................................................................... 36
Antyaliasing .................................................................................................................................. 37
Typowe zastosowania grafiki trjwymiarowej .................................................................................... 38
Trzy wymiary w czasie rzeczywistym........................................................................................... 38
Trzy wymiary bez czasu rzeczywistego ........................................................................................ 39
Podstawowe zasady programowania grafiki trjwymiarowej.............................................................. 42
Tryb natychmiastowy i tryb opniony......................................................................................... 42
Ukad wsprzdnych .................................................................................................................... 43
Rzutowanie. Z trzech w dwa wymiary .......................................................................................... 47
Podsumowanie..................................................................................................................................... 49
"#$ ! %
Czym jest OpenGL? ............................................................................................................................ 51
Ewolucja standardu ....................................................................................................................... 52
Wojny interfejsw (API Wars)...................................................................................................... 54
Jak dziaa OpenGL?............................................................................................................................. 60
Implementacja oglna ................................................................................................................... 60
Implementacje sprztowe .............................................................................................................. 61
Potok ............................................................................................................................................. 62
OpenGL. To jest API, nie jzyk .......................................................................................................... 63
Biblioteki i pliki nagwkowe ....................................................................................................... 64
Szczegy interfejsu............................................................................................................................. 64
Typy danych.................................................................................................................................. 65
Spis treci
Spis treci
10
),
*0&
Powierzchnie wbudowane ................................................................................................................. 464
Ustawienie stanw powierzchni stopnia drugiego....................................................................... 464
Rysowanie powierzchni stopnia drugiego ................................................................................... 466
Modelowanie za pomoc powierzchni stopnia drugiego............................................................. 470
Krzywe i powierzchnie Bziera......................................................................................................... 472
Reprezentacja parametryczna ...................................................................................................... 473
Ewaluatory .................................................................................................................................. 475
Powierzchnie NURBS ....................................................................................................................... 484
Od krzywych Bziera do krzywych NURBS .............................................................................. 485
Punkty wzowe .......................................................................................................................... 485
Tworzenie powierzchni NURBS ................................................................................................. 486
Waciwoci NURBS .................................................................................................................. 486
Definiowanie powierzchni .......................................................................................................... 487
Wycinanie ................................................................................................................................... 488
Krzywe NURBS.......................................................................................................................... 490
Podziay powierzchni ........................................................................................................................ 491
Obiekt podziaw ........................................................................................................................ 492
Wywoanie zwrotne programu dzielcego .................................................................................. 493
Okrelanie danych wierzchokw................................................................................................ 494
czymy wszystko razem............................................................................................................ 495
Podsumowanie................................................................................................................................... 499
Opisy funkcji ..................................................................................................................................... 500
''
5'( %"
Skadanie modeli ............................................................................................................................... 528
Kawaki i czci .......................................................................................................................... 528
Listy wywietlania............................................................................................................................. 540
Przetwarzanie wsadowe .............................................................................................................. 540
Wczeniejsze przetwarzanie wsadowe ........................................................................................ 541
Zalety i wady list wywietlania ................................................................................................... 543
Konwersja na listy wywietlania ................................................................................................. 543
Mierzenie wydajnoci........................................................................................................................ 544
Lepszy przykad .......................................................................................................................... 545
Tablice wierzchokw........................................................................................................................ 548
Spis treci
11
12
Spis treci
13
Podsumowanie................................................................................................................................... 784
Opisy funkcji ..................................................................................................................................... 785
$
%
#&
0((941 4 4
%
Przechowywanie tablic wierzchokw............................................................................................... 797
Generowanie sferycznych chmur czsteczek .............................................................................. 797
Aktywacja tablic wierzchokw .................................................................................................. 798
Generujemy wiksz ilo sfer .................................................................................................... 799
Zastosowanie obiektw buforowych ................................................................................................. 800
Zarzdzanie obiektem buforowym .............................................................................................. 802
Renderowanie z uyciem obiektw buforowych......................................................................... 802
adowanie danych do obiektw buforowych .................................................................................... 803
Kopiowanie danych do obiektu buforowego ............................................................................... 803
Bezporednie odwzorowanie obiektu buforowego...................................................................... 804
Kilka brakujcych elementw ........................................................................................................... 809
Podsumowanie................................................................................................................................... 810
Opisy funkcji ..................................................................................................................................... 810
-'1:5(1
(- ; 2
wiat bez analizy przesoni ............................................................................................................ 820
Bryy ograniczajce ........................................................................................................................... 823
Analiza przesoni i obiekt analizy .................................................................................................. 827
Podsumowanie................................................................................................................................... 829
Opisy funkcji ..................................................................................................................................... 830
+ 2%
Zacznijmy od klasyki......................................................................................................................... 858
Statyczna obrbka wierzchokw................................................................................................ 859
Statyczna obrbka fragmentw ................................................................................................... 861
Dochodzimy do nowoci ................................................................................................................... 862
Programowane shadery wierzchokw ........................................................................................ 863
czenie z klasycznym potokiem................................................................................................ 865
Programowane shadery fragmentw ........................................................................................... 866
14
")='
2
&
Zastosowanie shaderw niskopoziomowych ..................................................................................... 874
Tworzenie i wizanie obiektw shaderw................................................................................... 874
adowanie shaderw................................................................................................................... 874
Usuwanie shaderw..................................................................................................................... 876
Konfiguracja rozszerze.............................................................................................................. 876
Zestawy instrukcji ............................................................................................................................. 877
Wsplne instrukcje...................................................................................................................... 878
Instrukcje specyficzne dla shaderw wierzchokw.................................................................... 878
Instrukcje specyficzne dla shaderw fragmentw ....................................................................... 878
Typy zmiennych ................................................................................................................................ 881
Wartoci tymczasowe.................................................................................................................. 881
Parametry .................................................................................................................................... 882
Atrybuty ...................................................................................................................................... 884
Wyjcie........................................................................................................................................ 886
Aliasy .......................................................................................................................................... 888
Adresowanie................................................................................................................................ 888
Modyfikatory wejcia i wyjcia......................................................................................................... 888
Zanegowanie ............................................................................................................................... 889
Zmiana kolejnoci skadowych ................................................................................................... 889
Maska zapisu............................................................................................................................... 889
Przycinanie wyniku ..................................................................................................................... 889
Kontrola zuycia zasobw................................................................................................................. 890
Ograniczenia skadniowe............................................................................................................. 890
Ograniczenia wbudowane ........................................................................................................... 892
Inne zapytania ............................................................................................................................. 893
Opcje shaderw ................................................................................................................................. 894
Opcja niezmiennoci pozycji w shaderach wierzchokw........................................................... 894
Opcje mgy w shaderach fragmentw ......................................................................................... 894
Opcja sugerowanego poziomu precyzji....................................................................................... 894
Podsumowanie................................................................................................................................... 895
Opisy funkcji ..................................................................................................................................... 895
"'
)
Zarzdzanie shaderami wysokopoziomowymi .................................................................................. 910
Obiekty shaderw........................................................................................................................ 910
Obiekty programw..................................................................................................................... 912
Konfiguracja rozszerze.............................................................................................................. 914
Zmienne............................................................................................................................................. 916
Typy podstawowe ....................................................................................................................... 916
Struktury...................................................................................................................................... 916
Tablice......................................................................................................................................... 918
Kwalifikatory .............................................................................................................................. 918
Spis treci
15
""+
5' ./-' *
Pierwsze koty za poty ....................................................................................................................... 941
wiato rozproszone .......................................................................................................................... 944
Refleksy wietlne............................................................................................................................... 947
Ulepszone refleksy wietlne .............................................................................................................. 950
Mga obliczana na poziomie wierzchokw....................................................................................... 956
Rozmiar punktu obliczany na poziomie wierzchoka ........................................................................ 960
Niestandardowe przetwarzanie wierzchokw................................................................................... 963
Zlewanie wierzchokw..................................................................................................................... 965
Podsumowanie................................................................................................................................... 970
"&+
=/:'-
Przeksztacanie kolorw .................................................................................................................... 972
Skala szaroci .............................................................................................................................. 972
Sepia............................................................................................................................................ 974
Negatyw ...................................................................................................................................... 975
Porednie odczyty z tekstur ......................................................................................................... 978
Mga tworzona w oparciu o fragmenty........................................................................................ 978
Przetwarzanie obrazu......................................................................................................................... 980
Rozmywanie................................................................................................................................ 981
Wyostrzanie................................................................................................................................. 984
Rozszerzanie i erozja................................................................................................................... 985
Wykrywanie krawdzi................................................................................................................. 988
Owietlenie........................................................................................................................................ 990
Owietlenie wiatem rozproszonym........................................................................................... 991
Refleksy wietlne wielokrotnych rde wiata.......................................................................... 994
Proceduralne nakadanie tekstur ........................................................................................................ 999
Tekstura szachownicy ............................................................................................................... 1000
Pika plaowa ............................................................................................................................ 1005
Inna pika................................................................................................................................... 1010
Podsumowanie................................................................................................................................. 1015
'(
)*"*
16
>>-'- )
Inne dobre ksiki o OpenGL.......................................................................................................... 1019
Ksiki dotyczce grafiki 3D........................................................................................................... 1019
Strony WWW .................................................................................................................................. 1020
7 )&
4Q\F\KC
#WVQT4KEJCTF59TKIJV,T
/
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.
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.
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.
Pomiar dugoci
fali wietlnej
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
225
226
Cz I Klasyka OpenGL
wiato odbite od naszej tabliczki czekolady wpada do naszego oka, gdzie jest interpretowane 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 wiato 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 fotonw, ale kady rodzaj najmocniej reaguje na fale o okrelonej dugoci. Jedne komrki
pobudzane s wiatem czerwonym, drugie wiatem zielonym, a trzecie wiatem niebieskim. 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 odmiennych intensywnociach da nam w wyniku rne mieszanki kolorw. Jeeli wszystkie 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.
Jak nasze oko widzi
kolor brzowy
Skoro wiemy ju, jak ludzkie oko rozpoznaje kolory, cakiem rozsdnym wydaje si
pomys komputerowego generowania kolorw poprzez definiowanie oddzielnych intensywnoci skadowych czerwonej, zielonej i niebieskiej. Tak si akurat skada, e monitory komputerw zaprojektowane s w sposb pozwalajcy im emitowa trzy rodzaje
wiata (zgadnijcie jakie), z ktrych kady moe mie inn intensywno. W tylnej czci
227
Prosz sobie przypomnie, jak w rozdziale 2., Uywanie OpenGL, opisywalimy polecenie pozwalajce na definiowanie kolorw poprzez podanie intensywnoci
skadowych czerwonej, zielonej i niebieskiej.
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 efektowna, 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 oglnie, 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 krtkowzroczno, ktra firm IBM kosztowaa pozycj ustanawiajcego standardy rynku graficznego 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 rozdzielczoci 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 fotorealistycznej 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.
229
Systemy operacyjne Microsoft Windows i Apple Macintosh pod dwoma wzgldami zrewolucjonizoway 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. Programici 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.
!
"#
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 stosuj te rozdzielczoci (czsto w poczeniu z duymi monitorami), co uatwia im prac
z komputerem. Zawsze trzeba mie na uwadze wielko okna i ustawienia widoku (rozdzia 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.
$
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.
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 indeksem 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 tworzenia 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
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 przyspiesza dziaa na 8-bitowych kolorach, ale stosujc rendering programowy mona w pewnych 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.
Dzisiaj moliwie najlepszy obraz uzyskiwany jest w trybie koloru 24-bitowego. W tym trybie 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 operacj, 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.
231
!"
Wiemy ju, e biblioteka OpenGL definiuje kolory, okrelajc intensywnoci skadowych:
czerwonej, zielonej i niebieskiej. Wiemy te, e nowoczesny sprzt jest w stanie wywietli niemal wszystkie moliwe kombinacje tych skadowych albo zaledwie kilka. Jak
w takim razie moemy okreli potrzebny nam kolor, podajc wspomniane trzy skadowe?
%"
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. Wsprzdne 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 zmieci si w 24 bitach, co daje 8 bitw na kad skadow. Mona wic powiedzie, e w kadej 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.
!
Pocztek ukadu
wsprzdnych
koloru RGB
232
Cz I Klasyka OpenGL
"
Przestrze
kolorw RGB
#
Wynik dziaania
programu CCUBE
W nazwie funkcji znak oznacza liczb parametrw. Mog to by trzy parametry oznaczajce 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
(
),
(
), ( ), ( ), ( ),
(
233
Rzeczywicie, ta metoda moe uatwi dopasowanie kolorw w bibliotece OpenGL do kolorw 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 dziaania programu. Poza tym w przyszoci moe si okaza, e powstan znacznie pojemniejsze bufory kolorw (tak naprawd to ju zaczynaj si pojawia bufory zapamitujce
wartoci zmiennoprzecinkowe), w ktrych przechowywane wartoci zmiennoprzecinkowe
najdokadniej odwzoruj stosowane kolory.
Poprzednio podawana definicja funkcji 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 ustala aktualny 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) zdefiniujemy 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 definiowane 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 przedstawiony 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 kolorami 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
$
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 algorytmu 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 przykad 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.
%
&Rysowanie trjkta cieniowanego kolorami czerwonym, zielonym i niebieskim
// Wczenie gadkiego cieniowania
%'(()*
// Rysowanie trjkta
&
%')$+,%-
// Wierzchoek czerwony
%.
%.
%.
/
0101010
235
'
Trjkt w przestrzeni
kolorw RGB
236
Cz I Klasyka OpenGL
Wynik dziaania
programu TRIANGLE
#
$
W rzeczywistoci kolory obiektw nie s niezmienne, nie s te cieniowaniem pomidzy
kilkoma wartociami RGB. Rysunek 5.12 przedstawia wynik dziaania programu JET znajdujcego 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.
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 paskiej powierzchni zmieniaby si wraz ze zmianami kta patrzenia i padania wiata.
Biblioteka OpenGL cakiem dobrze radzi sobie z jak najlepszym odwzorowywaniem rzeczywistego 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).
237
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 cakowicie stracio jakikolwiek kierunek. Wszystkie powierzchnie obiektw znajdujcych si
w wietle otaczajcym s owietlone rwnomiernie, niezalenie od kierunku. We wszystkich 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.
Obiekt owietlony
wycznie wiatem
otaczajcym
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 pewnym 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.
Obiekt owietlony
wycznie wiatem
rozproszonym
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 wycznie wiatem odbitym.
238
Cz I Klasyka OpenGL
Obiekt owietlony
wiatem odbitym
'
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 rozprasza 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 skadow 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 skadowa 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 wspomnianego czerwonego lasera moe by opisywane wartociami skadowych podanymi
w tabeli 5.1.
( )Rozkad skadowych wiata w promieniu czerwonego lasera
* +
, )
-
.)/
Odbite
144
1
1
!1
Rozproszone
1!
1
1
!1
Otoczenia
1
1
1
!1
Prosz zauway, e promie czerwonego lasera nie posiada skadowej wiata zielonego
ani niebieskiego. Wane jest rwnie to, e kada skadowa wiata (odbitego, rozproszonego i otoczenia) moe przyjmowa wartoci od do . Mona to interpretowa
w ten sposb, e wiato lasera czerwonego bdzie miao w pewnych scenach bardzo wysok warto skadowej wiata odbitego, niewielk warto skadowej wiata rozproszonego i bardzo ma warto skadowej wiata otoczenia. Tam, gdzie bdzie pada promie 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
239
%
&$
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 owietlane s wiatem biaym, ktre jest rwnomiern mieszank wszystkich kolorw. Dlatego w wietle biaym obiekty ujawniaj swoje naturalne kolory. Niestety, nie zawsze
mamy tak doskonae warunki. Jeeli nasza niebiesk pik umiecimy w ciemnym pokoju 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.
("
"
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 musimy okreli jego waciwoci odblaskowe dla wiata otoczenia, rozproszenia i odbitego. 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 waciwociach emisji obiektw generujcych wasne wiato, takich jak tylne wiata samochodw albo zegarki wiecce w ciemnociach.
)"
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 okrela 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 poprzez zastosowanie pynnego cieniowania wntrza wieloktw.
(
"
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:
1 51 1 5!11 51 #1 1 1
Jest to wynik mnoenia kadej skadowej rda wiata otoczenia przez odpowiadajce
im waciwoci odblaskowe materiau (rysunek 5.16).
!
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 ,
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 .
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 , 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 obiektw. 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.
(
"
Aby nakaza bibliotece OpenGL przeprowadzanie oblicze zwizanych z owietleniem,
wystarczy wywoa funkcj *
z parametrem !"!+ ,%+) :
-
%'+%*)+%
242
Cz I Klasyka OpenGL
"
Nieowietlony samolot
nie odbija adnego
wiata
Pierwszym parametrem owietlenia uywanym w naszym nastpnym przykadzie (program AMBIENT) jest !"!+ ,%"'/*!"$0+*)%. 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
%0
67#8!10!10!10!109
// Wczenie owietlenia
-
%'+%*)+%
&
"
"
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
przed zdefiniowaniem kadego wielokta lub zbioru wieloktw. Przyjrzymy si poniszemu fragmentowi kodu:
%0.67#813 013 013 0!109
111
111
0:%'<$()%',&+-)',;';+<<=-.
&
%')$+,%-
243
/
02! 101010
/
010! 1010
/
010102 >10
-
Pierwszy parametr funkcji okrela, czy definiowane bd waciwoci materiau przedniej, tylnej czy moe obu stron wieloktw ( !"#.')%, !"0$4, !"#.')%"$)/"0$4).
W drugim parametrze podawana jest waciwo, ktra bdzie zmieniana; w tym przypadku waciwoci odblaskowe dla wiata otoczenia i rozproszenia bd takie same.
Ostatnim parametrem jest tablica zawierajc wartoci RGBA opisujce odblaskowe waciwoci materiau. Wszystkie obiekty podstawowe rysowane po wywoaniu tej funkcji
bd miay ustalone przez ni waciwoci odblaskowe a do momentu ponownego
wywoania funkcji .
W wikszoci przypadkw skadowe wiata otoczenia i rozproszenia s takie same, a jeeli
nie chcemy stosowa specjalnych efektw owietlenia (iskrzenia, rozbyskw), nie musimy definiowa adnych waciwoci dla wiata odbitego. Mimo to przygotowywanie
tablicy kolorw i wywoywanie funkcji przed rysowaniem kadego wielokta lub grupy wieloktw moe by zajciem bardzo nucym.
Jestemy wiec gotowi na zastosowanie drugiej, lepszej metody ustalania waciwoci
materiaw nazywanej ledzeniem kolorw (ang. color tracking). Dziki tej metodzie
moemy ustali waciwoci materiau ju w momencie wywoania funkcji .
Aby wczy ten mechanizm, trzeba najpierw wywoa funkcj *
z parametrem
!"'!'."$%*.+$!:
-
%'(($',)-$+,
244
Cz I Klasyka OpenGL
Na listingu 5.2 podajemy kod, jaki dodany zosta do funkcji -. z przykadowego
programu JET, w ktrym ustalamy jasne rdo wiata otoczenia, a take waciwoci
materiaw pozwalajce obiektom odbija wiato i w efekcie pojawi si na ekranie. Pozmienialimy te kolory samolotu. Teraz rne kolory nadalimy poszczeglnym sekcjom
samolotu, a nie tworzcym go wieloktom. Kocowy wynik (pokazany na rysunku 5.18)
nie rni si jednak znaczco od tego, co uzyskalimy jeszcze przed wczeniem owietlenia. Jeeli jednak zredukujemy wiato otoczenia o poow, to uzyskamy obraz przedstawiony na rysunku 5.19. Aby o poow obniy intensywno owietlenia, wartoci
RGBA dla wiata otoczenia ustalamy nastpujco:
%0
67#81 01 01 0!109
Teraz wiemy ju, jak mona obniy jasno owietlenia otoczenia tak, aby uzyska ciemniejszy obraz. Ta waciwo bardzo przydaje si w symulacjach, w ktrych zmierzch zapada stopniowo albo w momentach, gdy zablokowane zostaje gwne rdo wiata dla
sceny, czyli gdy jeden obiekt znajduje si w cieniu drugiego.
245
#
Wynik dziaania
przykadowego
programu AMBIENT
$
Wynik dziaania
przykadowego
programu AMBIENT
po przyciemnieniu
owietlenia
246
Cz I Klasyka OpenGL
$
Definiujc rdo wiata, musimy poinformowa bibliotek OpenGL gdzie si ono znajduje i w ktrym kierunku wieci. Bardzo czsto rda wiata wiec we wszystkich
kierunkach, ale moliwe jest te tworzenie wiate kierunkowych. W kadym przypadku
na powierzchni rysowanego obiektu promienie wiata (pochodzce z dowolnego rda
innego ni czyste wiato otoczenia) padaj pod bardzo rnymi ktami. Oczywicie
w przypadku wiate kierunkowych nie musz by owietlane wszystkie wielokty, z jakich
skada si obiekt. Aby okreli stopie zacienienia poszczeglnych powierzchni obiektu,
biblioteka OpenGL musi by w stanie wyliczy kt padania promieni wiata.
Na rysunku 5.20 wielokt (kwadrat) owietlany jest promieniami wiata generowanego
przez pewne rdo. Promienie te tworz z powierzchni pewien kt (A), a nastpnie
odbijane s pod ktem (B) w kierunku widza (inaczej bymy go nie zobaczyli). Do wyliczania wynikowego koloru kadego elementu stosowane s odpowiednie kty padania
promieni wiata w poczeniu z parametrami owietlenia i omawianymi wczeniej waciwociami materiaw. Tak si akurat skada, e konstrukcja biblioteki OpenGL wylicza
te wartoci dla kadego wierzchoka opisujcego wielokt. Dziki temu, a take dziki
tworzeniu pynnych przej pomidzy kolorami poszczeglnych wierzchokw, tworzona
jest doskonaa iluzja owietlenia. Czary!
'
wiato odbija si
od powierzchni pod
rnymi ktami
Z punktu widzenia programisty z takimi wyliczeniami owietlenia wi si pewne problemy. Kady wielokt tworzony jest jako zbir wierzchokw bdcych zaledwie punktami. Na kady z tych wierzchokw pod pewnym ktem pada promie wiata. Ale jak
mona wyznaczy kt pomidzy punktem a lini (promieniem wiata)? Oczywicie
z geometrycznego punktu widzenia nie mona wyznaczy kta pomidzy punktem a lini
umieszczon w trzech wymiarach, poniewa w takich warunkach istnieje nieskoczona
liczba moliwoci. Z tego powodu konieczne jest zwizanie z kadym wierzchokiem
dodatkowej informacji wskazujcej kierunek w gr wierzchoka, czyli powierzchni
wielokta.
247
do rzeczywistej lub wyimaginowanej powierzchni. Wektor jest lini wskazujc w pewnym kierunku, a sowo normalny, to inne okrelenie na prostopady, czyli ustawiony
pod ktem 56. Bardzo lubi stosowa je jajogowi jakby prostopady nie byo do
paskudnym sowem! Podsumowujc wektor normalny to linia wskazujca kierunek
ustawiony pod ktem 56 w stosunku do powierzchni wielokta. Na rysunku 5.21 przedstawiono przykady wektorw normalnych w dwch i trzech wymiarach.
Wektor normalny
w dwch i trzech
wymiarach
Powstaje tutaj pytanie, dlaczego musimy definiowa wektor normalny dla kadego wierzchoka w wielokcie. Dlaczego nie moemy zdefiniowa pojedynczego wektora dla wielokta i stosowa go we wszystkich jego wierzchokach? Oczywicie, e moemy i w kilku
pierwszych przykadach bdziemy tak robi. Czasami jednak nie bdziemy chcieli, eby
wektory normalne byy dokadnie prostopade do powierzchni wielokta. Z pewnoci
kady zauway, e nie wszystkie powierzchnie s paskie! Mona tworzy przyblienia
takich powierzchni, stosujc paskie wielokty, ale powstaj w ten sposb kanciaste
powierzchnie o wielu fasetach. Pniej omawia bdziemy techniki pozwalajce na
tworzenie iluzji agodnych krzywizn za pomoc wykrconych wektorw normalnych
(kolejne czary!). Ale zacznijmy od pocztku
)
Aby zobaczy, jak definiuje si normaln dla wierzchoka, spjrzmy na rysunek 5.22, na
ktrym znajduje si paszczyzna umieszczona w przestrzeni trjwymiarowej ponad
paszczyzn xz. Staralimy si jak najbardziej uproci ten rysunek, aby zademonstrowa
pojcie normalnej. Prosz zauway lini biegnc przez wierzchoek 12 2 3 prostopadle do paszczyzny. Jeeli wybierzemy na tej linii dowolny inny punkt, na przykad 1223, to linia od pierwszego punktu do drugiego bdzie naszym wektorem
normalnym. Drugi z podanych punktw okrela, e kierunek normalnej wskazuje w gr
osi y. W ten sposb okrelana jest te przednia i tylna strona wielokta, poniewa wektor
normalny wskazuje te przedni stron powierzchni.
Jak wida, drugi punkt podawany jest jako liczba jednostek w osi x, y i z, opisujcych
pewien punkt na wektorze normalnym wychodzcym z wierzchoka. Zamiast podawa
dwa punkty dla kadego wektora normalnego, moemy odj wsprzdne wierzchoka
od wsprzdnych tego drugiego punktu, a otrzymamy trzy wartoci wsprzdnych
okrelajcych odlego drugiego punktu od wierzchoka w osi x, y i z. W naszym przykadzie byoby to:
!!2!!#!2!!2!#4
248
Cz I Klasyka OpenGL
Wektor normalny
oddalajcy si
prostopadle
od paszczyzny
Na powyszy przykad mona spojrze jeszcze inaczej. Jeeli wierzchoek zostanie przesunity do pocztku ukadu wsprzdnych, to punkt wyznaczony przez powysze odejmowanie nadal bdzie okrela kierunek wektora normalnego w stosunku do powierzchni.
Na rysunku 5.23 przedstawiony zosta wektor przesunity w ten wanie sposb.
Przesunity wektor
normalny
249
Nawinicie wieloktw
Prosz przyjrze si kolejnoci definiowania wierzchokw trjkta pochodzcego z samolotu.
Jeeli bdziemy si mu przyglda od strony wskazywanej przez wektor normalny, to wierzchoki
bd ukada si w kierunku przeciwnym do ruchu wskazwek zegara. Nazywane jest to nawiniciem wielokta. Domylnie przodem wielokta okrela si t stron, po ktrej wierzchoki
ukadaj si wanie w kierunku przeciwnym do ruchu wskazwek zegara.
Funkcja )7 pobiera w parametrach trzy wsprzdne okrelajce wektor normalny wskazujcy kierunek prostopady do powierzchni trjkta. W tym przykadzie
normalne wszystkich trzech wierzchokw maj dokadnie taki sam kierunek wskazujcy
w d ujemnych wartoci osi y. Jest to bardzo prosty przykad, poniewa cay trjkt ley
w paszczynie xz; jest on po prostu wycinkiem brzucha samolotu. Jak bdzie mona
zobaczy pniej, czsto bdziemy musieli okrela inne wektory normalne dla kadego
wierzchoka wielokta.
Perspektywa definiowania wektora normalnego dla kadego wierzchoka wielokta moe
by nieco przeraajca, szczeglnie e wiele powierzchni nie ley dokadnie na jednej
z gwnych paszczyzn. Bez obaw! Szybko podamy przydatn funkcj, z ktrej moemy
korzysta cay czas do wyliczania wektorw normalnych.
250
Cz I Klasyka OpenGL
-
%'$-,-'($,
W ten sposb informujemy bibliotek OpenGL, e nasze normalne nie maj jednostkowej
dugoci, ale mona je przeskalowa o dokadnie tak sam warto, eby osigny dugo jednostkow. Biblioteka OpenGL sprawdza to, kontrolujc macierz model-widok.
W efekcie musimy wykona mniej operacji matematycznych ni w innych przypadkach.
Ze wzgldu na to, e najlepszym rozwizaniem jest podanie bibliotece OpenGL ju znormalizowanych wektorw, w bibliotece glTools dostpna jest funkcja pobierajca dowolny
wektor i poddajca go normalizacji:
C
/
@%)/
@:
,
Na rysunku 5.24 przedstawiony zosta kolejny wielokt, ktry nie ley w caoci na adnej
z paszczyzn osiowych. Teraz znalezienie wektora normalnego do powierzchni wielokta
nie jest ju tak oczywiste, potrzebujemy wic prostego sposobu na wyliczenie wektora
normalnego dla dowolnego wielokta w przestrzeni trjwymiarowej.
Nietrywialny problem
szukania wektora
normalnego
Biorc trzy punkty lece na paszczynie dowolnego wielokta, mona w prosty sposb
wyliczy normaln do tej paszczyzny. Rysunek 5.25 przedstawia trzy punkty P1, P2
i P3 ktrych mona uy do zdefiniowania dwch wektorw: wektora V1 od punktu P1
do punktu P2 i wektora V2 od punktu P1 do punktu P3. Dwa wektory w przestrzeni definiuj paszczyzn (a na paszczynie definiowanej przez te dwa wektory ley nasz wielokt). Jeeli teraz wykonamy iloczyn wektorowy tych dwch wektorw (w matematyce
zapisuje si to jako ::), to wynikowy wektor bdzie prostopady do naszej paszczyzny. Rysunek 5.26 przedstawia wektor V3 bdcy wynikiem iloczynu wektorowego
wektorw V1 i V2.
I znowu biblioteka glTools zawiera w sobie funkcj wyliczajc wektor normalny na podstawie trzech punktw wielokta:
%
/
@%)/
@%)/
@%)/
@
%)/
@
251
Dwa wektory definiowane
przez trzy punkty
lece na paszczynie
!
Wektor normalny bdcy
iloczynem wektorowym
dwch wektorw
Aby skorzysta z tej funkcji, trzeba przekaza jej trzy wektory (kady bdcy tablic trzech
wartoci typu ) opisujce punkty naszego trjkta (musz by podawane z nawiniciem przeciwnym do ruchu wskazwek zegara) oraz tablic dodatkowego wektora,
do ktrej zostan wpisane wartoci wektora normalnego.
-
Znamy ju teraz zasady, jakich trzeba przestrzega w czasie tworzenia wieloktw, tak aby
mogy na nie oddziaywa rda wiata. Nadszed czas wczenia wiate! Na listingu 5.3
mona zobaczy kod funkcji -. pochodzcej z przykadowego programu LITJET.
W czasie konfigurowania sceny tworzone jest w nim rdo wiata i umieszczane po
lewej grnej stronie, nieco za obserwatorem. Skadowym wiata otoczenia i rozproszonego w rdle !"!+ ,% nadawane s intensywnoci zdefiniowane w tablicach 7
! ;< i
! ;<. W efekcie powstaje rdo delikatnego wiata biaego:
%0
67#8101010!109
%0
00D
67#8130130130!109
111
111
252
Cz I Klasyka OpenGL
-
%';-?)*')-)// Usuwanie ukrytych powierzchni
<<@
%'A// Wielokty z nawiniciem przeciwnym do ruchu
wskazwek zegara
-
%'='<,-// Nie bdziemy prowadzi oblicze wntrza samolotu
// Wczenie owietlenia
-
%'+%*)+%
// Konfiguracja i wczenie wiata numer 0
0:%'+%*)%',&+-)
0:%'+%*)%';+<<=-
00D
-
%'+%*)
// Wczenie ledzenia kolorw
-
%'(($',)-$+,
// Waciwoci owietlenia otoczenia i rozproszenia
// bd ledzi wartoci podawane funkcji glColor
%'<$()%',&+-)',;';+<<=-
// Jasnoniebieskie to
1010!10!10
9
W powyszych wierszach w tablicy &;< zapisywana jest pozycja rda wiata.
Ostatnia warto w tej tablicy to , co oznacza, e rdo wiata zlokalizowane jest
w podanych wsprzdnych. Gdybymy podali tam warto , 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 przemieszcza za pomoc macierzy model-widok. Umiejscawiajc wiato w momencie wykonywania przeksztacenia punktu widzenia, zyskujemy pewno, e bdzie ono ustawione
prawidowo, niezalenie od pniejszych przeksztace geometrii.
&
"
"
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:
253
)
W zwizku z obsug nowego modelu owietlenia kod renderujcy znany z dwch pierwszych przykadowych programw JET musia zosta znaczco przebudowany. Na listingu
5.4 przedstawiono wycinek kodu pochodzcy z funkcji .
9 z programu LITJET.
%
& Przykadowy kod ustalajcy kolor oraz wyliczajcy wektory normalne wieloktw
%)/
@:// Przechowuje wyliczone wektory normalne
111
111
254
Cz I Klasyka OpenGL
Warto wektora normalnego wyliczamy za pomoc funkcji )7:9 pochodzcej z biblioteki glTools. Poza tym waciwoci materiaw bd ustalane zgodnie
z kolorami podawanymi funkcji . Mona te zauway, e trjki wierzchokw
definiujcych trjkty nie s zamykane midzy funkcjami 0 i *
. Wystarczyo
raz okreli, e bdziemy definiowa trjkty, a do momentu wywoania funkcji *
kada kolejna trjka wierzchokw bdzie wykorzystywana jako definicja nowego trjkta. Jeeli bdziemy definiowa due iloci wieloktw, to ta technika moe bardzo
podnie wydajno naszego programu poprzez wyeliminowanie niepotrzebnych wywoa funkcji i konfigurowania kolejnych wieloktw.
Na rysunku 5.27 przedstawiono wynik dziaania programu LITJET. Samolot nie jest ju
rnokolorowy, ale pokryty jest jednolit, jasnoszar barw. Kolor zosta zmieniony w ten
sposb, aby uwidoczni wpyw owietlenia na powierzchnie samolotu. Mimo e wszystkie
powierzchnie samolotu maj ten sam kolor, to jednak moemy wyrni wszystkie
jego elementy. Obracajc samolot klawiszami strzaek, moemy zobaczy zmiany odcieni
poszczeglnych powierzchni i sprawdzi wpyw, jaki owietlenie ma na nie pod rnymi ktami.
"
Wynik dziaania
programu LITJET
*
$
wiato otoczenia i rozproszone stosowane w programie LITJET s cakowicie wystarczajce, aby uzyska efekt owietlenia. W zalenoci od kta padania promieni wiata
poszczeglne powierzchnie samolotu cieniowane s w rny sposb. W czasie gdy samolot
si obraca, kty te ulegaj cigym zmianom, a my moemy obserwowa zmiany owietlenia i na tej podstawie okreli pooenie rda wiata.
255
Do tej pory ignorowalimy jednak skadow wiata skupienia w rdach wiata, jak
rwnie odpowiadajc jej skadow waciwoci materiau. Co prawda efekty owietlenia s wyliczane, ale kolory powierzchni samolotu s raczej matowe. wiato otoczenia
i rozproszone i odpowiadajce im waciwoci materiaw s wystarczajce w czasie
modelowania obiektw z gliny, drewna, tektury, tkaniny i innych matowych materiaw.
Jednak samolot skada si gwnie z powierzchni metalizowanych, ktrym przydaoby
si nieco poysku.
.
Waciwoci materiau i wiata odbitego nadaj naszym materiaom wymaganego poysku. Ma on wybielajcy wpyw na kolory obiektu, co moe doprowadzi do powstania
odbyskw, jeeli kt padania wiata na powierzchni bdzie odpowiedni w stosunku
do pozycji obserwatora. Odbysk powstaje wtedy, kiedy niemal cae wiato padajce na
powierzchni odbijane jest w stron obserwatora. Dobrym przykadem takiego odbysku
jest jasna plama na powierzchni, lecej w socu, czerwonej piki.
Do rda wiata mona bardzo atwo doda skadow wiata odbitego. Poniej przedstawiono kod konfigurujcy owietlenie pochodzcy z programu LITJET, w ktrym dodano
instrukcje konfigurujce skadow wiata odbitego:
// Wsprzdne i wartoci owietlenia
%0
67#8101010!109
%0
00D
67#8130130130!109
%0D
@67#8!10!10!10!109
111
111
// Wczenie owietlenia
-
%'+%*)+%
W tablicy -9;< zdefiniowana zostaa bardzo jasna skadowa biaego wiata odbitego.
Chcemy w ten sposb zasymulowa jasne wiato soneczne. Ponisz lini dodajemy
do rda wiata !"!+ ,% przygotowan wczeniej skadow wiata odbitego:
0:%'+%*)%'?-=,$D
@
256
Cz I Klasyka OpenGL
(
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
%0D
@
067#8!10!10!10!109
111
111
Tak jak poprzednio wczamy mechanizm ledzenia kolorw, aby waciwoci odbijania
wiata otoczenia i rozproszonego byy zgodne z aktualnym kolorem definiowanym funkcj . Oczywicie nie chcemy, eby funkcja definiowaa rwnie waciwoci odbijania wiata odbitego. T waciwo zdefiniujemy sami i nie bdzie ona
podlegaa adnym zmianom.
Dodalimy teraz tablic -9;< zawierajc wartoci RGBA opisujce wspczynnik
odbicia dla materiau. Zapisujemy w niej same jedynki, dziki czemu tworzymy powierzchnie odbijajce praktycznie kade wiato odbite. Ponisza linia ustala waciwoci materiau dla wszystkich definiowanych po niej wieloktw tak, aby zawieray w sobie dane
wspczynnika odbicia:
0:%'<$()%'?-=,$D
@
0
257
(
Jak mwilimy ju wczeniej, wysoka warto jasnoci wiata odbitego i odpowiednich
waciwoci odblaskowych bd rozjaniay kolory obiektu. W naszym przykadzie zastosowalimy wyjtkowo wysok warto jasnoci wiata (pena intensywno) oraz
wspczynnika odbicia (najlepsze odbicia). W efekcie samolot byby niemal wycznie
biay lub szary, za wyjtkiem powierzchni odwrconych od rda wiata (te byyby
cakowicie czarne i nieowietlone). Moemy zagodzi ten efekt za pomoc poniszej
linii kodu umieszczonej zaraz za definicj waciwoci odblaskowych materiaw:
%'<$()%'*++-!"
Waciwo !",+)+)* ustala wykadnik odbysku (ang. specular exponent) materiau okrelajcy, jak may i skupiony na by rozmiar odbysku. Warto oznacza, e
odbysk w ogle nie bdzie skupiony, co w efekcie prowadzi do rwnomiernego rozjaniania kolorw na powierzchni caych wieloktw. Zmieniajc t warto, zwikszamy
skupienie rozbysku, co powoduje, e na obiekcie pojawia si coraz mniejsza, jasna plama.
Im wysza warto, tym bardziej byszczca bdzie powierzchnia obiektu. We wszystkich
implementacjach biblioteki OpenGL warto tego parametru mona ustala w zakresie
od do ?.
Listing 5.5 przedstawia kod funkcji -. pochodzcy z przykadowego programu
SHINYJET. Jest to jedyny kod, jaki zosta zmieniony w stosunku do programu LITJET
(no, moe poza nazw okna), a na ekranie pojawia si piknie byszczcy samolot. Na
rysunku 5.28 przedstawiony zosta efekt dziaania programu, jednak wszystkie efekty
mona w peni doceni, dopiero wczajc sam program i klawiszem strzaki obracajc samolot w wietle sonecznym.
%
&Kod konfigurujcy tworzcy w programie SHINYJET efekty odbyskw wietlnych
// Ta funkcja wykonuje wszystkie konieczne inicjalizacje kontekstu renderowania,
// a take konfiguruje i inicjalizuje owietlenie sceny
$
8
// Wsprzdne i wartoci owietlenia
%0
67#8101010!109
%0
00D
67#8130130130!109
%0D
@67#8!10!10!10!109
%0D
@
067#8!10!10!10!109
-
%';-?)*')-)// Usuwanie ukrytych powierzchni
<<@
%'A// Wielokty z nawiniciem przeciwnym do ruchu
wskazwek zegara
-
%'='<,-// Nie bdziemy prowadzi oblicze wntrza samolotu
// Wczenie owietlenia
-
%'+%*)+%
// Konfiguracja i wczenie wiata numer 0
0:%'+%*)%',&+-)
0:%'+%*)%';+<<=-
00D
0:%'+%*)%'?-=,$D
@
-
%'+%*)
258
Cz I Klasyka OpenGL
#
Wynik dziaania
programu SHINYJET
&"
+
Wczeniej wspominalimy, e wykrzywiajc wektory normalne moemy wytworzy
gadk powierzchni za pomoc paskich wieloktw. Za pomoc tej techniki, znanej jako
urednianie normalnych (normal averaging), mona uzyska wiele interesujcych iluzji
optycznych. Zamy, e posiadamy kul zoon z czworoktw i trjktw podobn do
przedstawionej na rysunku 5.29.
Jeeli kadej fasecie tej kuli przypisano by tylko jeden wektor normalny, to wygldaaby
ona jak wielki diament o bardzo wielu fasetach. Jeeli jednak kademu wierzchokowi
przypiszemy jego prawdziwy wektor normalny, to obliczenia owietlenia wygeneruj
wartoci kolorw, ktre zostan przez bibliotek OpenGL pynnie interpolowane wewntrz
wieloktw. W ten sposb paskie wielokty zostan wycieniowane tak, jakby byy gadk
powierzchni kuli.
Czym jednak jest prawdziwy wektor normalny? Aproksymacja wieloktami jest tylko
przyblieniem rzeczywistej powierzchni. Teoretycznie, jeeli zastosowalibymy wystarczajc liczb wieloktw, to powierzchnia zaczaby wyglda na gadk. Z podobnego
pomysu skorzystalimy w rozdziale 3., Rysowanie w przestrzeni. Geometryczne obiekty
259
$
Typowa kula zbudowana
z czworoktw
i trjktw
Linia styczna dotyka krzywej w jednym punkcie, ale jej nie przecina. W trzech wymiarach
podobnie zachowuje si paszczyzna styczna. Na rysunku 5.31 mona zobaczy kontur
rzeczywistej powierzchni, jak rwnie to, e normalna jest zawsze prostopada do linii
stycznej do powierzchni.
260
Cz I Klasyka OpenGL
Kada normalna
jest prostopada
do rzeczywistej
powierzchni kuli
Jeeli chodzi o kul, to wyliczenie normalnych do jej powierzchni nie jest bardzo trudne
(normalne maj dokadnie te same wartoci co wektory wyprowadzone ze rodka kuli).
Niestety, dla innych, nietrywialnych powierzchni takie obliczenia z pewnoci nie bd
proste. W takich przypadkach wylicza si normalne dla wszystkich wieloktw wspdzielcych jeden wierzchoek, a nastpnie do wierzchoka przypisuje si wektor normalny bdcy redni wszystkich wektorw normalnych wieloktw. W wyniku takiego
dziaania otrzymamy adn, gadk powierzchni, mimo e skada si ona z pewnej liczby
niewielkich paskich segmentw.
+
Nadszed czas na napisanie nieco bardziej rozbudowanego programu. Zademonstrujemy
w nim, jak uywa normalnych do uzyskania wygldu gadkich powierzchni, jak przesuwa rdo wiata na scenie, tworzy reflektor kierunkowy. Na koniec wskaemy wad
stosowanego przez bibliotek OpenGL modelu owietlenia.
Wszystkie te zadania wykonywa bdzie nasz nastpny program przykadowy SPOT. Na
rodku naszej przestrzeni widocznej tworzymy kul za pomoc funkcji
-.
Kul owietlimy za pomoc reflektora, ktry bdzie mona przesuwa po scenie. Bdziemy
te zmienia gadko powierzchni kuli, a take wskazywa pewne ograniczenia modelu
owietlenia stosowanego w bibliotece OpenGL.
Jak dotd pozycj rda wiata okrelalimy za pomoc funkcji ! :
// Tablica okrelajca pozycj rda wiata
%0
?D67#810! 10! 10!109
111
111
261
znajduje si na podanej pozycji. Domylnie, rda wiata wiec we wszystkich kierunkach jednakowo, jednak mona zmieni to ustawienie i utworzy reflektor kierunkowy.
Umieszczajc warto na ostatniej pozycji tablicy &;<, powodujemy, e rdo
wiata znajduje si w nieskoczonej odlegoci od sceny, a wszystkie promienie jego
wiata docieraj do sceny z zadanego kierunku. Kade rdo wiata kierunkowego
(tak nazywaj si te rda) jednakowo owietla wszystkie obiekty na scenie. Oznacza
to, e promienie tego wiata s do siebie rwnolege. Z drugiej strony promienie wiata
pozycjonowanego rozchodz si od rda we wszystkich kierunkach.
/
rda wiata typu reflektorw tworzy si dokadnie tak samo jak inne pozycjonowane
rda wiata. Kod z listingu 5.6 przedstawia funkcj -. pochodzc z programu
SPOT. Program ten umieszcza porodku okna niebiesk kul. Poza tym tworzy te reflektor, ktry moemy przesuwa nad kul w pionie (klawisze ze strzakami w gr i w d)
oraz w poziomie (klawisze ze strzakami w lewo i w prawo). Poruszanie reflektora wok
kuli powoduje, e efekty odblaskowe zmieniaj si, dostosowujc si do nowej pozycji
reflektora.
%
&!Konfiguracja owietlenia w programie przykadowym SPOT
// Wartoci i wsprzdne owietlenia
%0
?D67#810103 10!109
%0D
@67#8!10!10!10!109
%0D
@
067#8!10!10!10!109
%0
67#81 01 01 0!109
%0D;
67#810102!109
262
Cz I Klasyka OpenGL
// Ze rda wiata tworzymy reflektor
// Kt odcicia ma 60 stopni
0%'+%*)%'?()'=)(<<>10
// Nie moemy zapomnie o wczeniu tego wiata
-
%'+%*)
// Wczenie ledzenia kolorw
-
%'(($',)-$+,
// Waciwoci owietlenia otoczenia i rozproszenia
// bd ledzi wartoci podawane funkcji glColor
%'<$()%',&+-)',;';+<<=-
// Od tego momentu wszystkie materiay uzyskaj poysk
// i bd doskonale odbijay wiato odbite
0:%'<$()%'?-=,$D
@
0
%'<$()%'*++-!"
// Czarne to
101010!10
9
263
!
Umieszczajc na scenie reflektor, musimy zaznaczy, skd pochodzi rzucane przez niego
wiato. To, e w jakim miejscu bdzie znajdowa si rdo wiata, nie oznacza od razu,
e zobaczymy tam jasn plam. W przykadowym programie SPOT w miejscu reflektora
umiecimy te czerwony stoek, a w jego podstawie t kul symbolizujc arwk.
W programie przygotowalimy menu kontekstowe, z pomoc ktrego bdziemy demonstrowa kilka rzeczy. Mona w nim przecza si midzy cieniowaniem paskim i gadkim,
a take wybiera modele kuli o rnych stopniach mozaikowoci. Mozaikowo (ang.
tessellation) oznacza zamian siatki obiektu w siatk o wikszej dokadnoci (skadajcej
si z wikszej liczby wierzchokw). Na rysunku 5.33 mona zobaczy siatkow reprezentacj kuli o wysokiej mozaikowoci. Obok niej wida siatk kuli skadajc si z mniejszej
liczby wierzchokw.
Po lewej stronie
znajduje si kula
o wysokiej
mozaikowoci,
natomiast po prawej
kula skadajca si
z niewielkiej liczby
wierzchokw
264
Cz I Klasyka OpenGL
%
&"Funkcja renderujca programu SPOT. Mona tu zobaczy, jak przesuwany jest
na scenie reflektor
// Wywoywana w celu przerysowania sceny
$
@
8
##(;-'<,)
%'<,)
// iShade = MODE_SMOOTH;
%'(()*
// Czyszczenie okna aktualnym kolorem czyszczcym
%'(($'&=<<-$'&+)E%';-?)*'&=<<-$'&+)
// Najpierw trzeba umieci na scenie rdo wiata
// Zapisa przeksztacenie wsprzdnych
?D
// Obrt ukadu wsprzdnych
$
0.$10!1010
$
0$!101010
// Zdefiniowanie nowej pozycji i kierunku w obrconym ukadzie wsprzdnych
0:%'+%*)%'?(+)+(
?D
0:%'+%*)%'?()';+$-)+(D;
// Rysowanie czerwonego stoka obejmujcego rdo wiata
// Przesuwamy pocztek ukadu wsprzdnych, umieszczajc stoek w miejscu,
// w ktrym znajduje si rdo wiata
)D
0
?D67
?D6!7
?D67
F10>10! !
// Rysujemy niewielk t kul wygldajc jak arwka
// Zapisanie zmiennych stanu owietlenia
?D,
%'+%*)+%'&+)
// Wyczenie owietlenia i rysowanie jasnej tej kuli
;
D
%'+%*)+%
10! !
// Odtworzenie zmiennych stanu owietlenia
?,
// Odtworzenie przeksztacenia wsprzdnych
?
// Ustawienie koloru materiau i narysowanie kuli na rodku ekranu
)
DD##(;-'/-$G(A
1033
)
DD##(;-'-;+=
10! !
265
266
Cz I Klasyka OpenGL
!Wybranie dokadniejszej siatki wieloktw oznacza lepsze efekty owietlenia
wierzchokw
267
W rozdziale dotyczcym kolorw i owietlenia nie moe zabrakn dyskusji o cieniach.
Uzupenienie sceny o cienie obiektw moe bardzo podnie jej realizm. Na rysunkach
5.38 i 5.39 mona zobaczy dwa obrazy kolorowego szecianu. Mimo e w obu zastosowano owietlenie, to jednak ten z cieniem jest znacznie bardziej przekonujcy.
#
Owietlony szecian
bez cieni
268
Cz I Klasyka OpenGL
$
Owietlony szecian
z cieniem
0
Pod wzgldem pojciowym rysowanie cieni powinno by prost operacj. Cie tworzony
jest wtedy, gdy jaki obiekt zatrzymuje wiato padajce z pewnego rda wiata i nie
pozwala mu pa na powierzchnie znajdujce si za tym obiektem. Obszar na zacienionej
powierzchni jest bardzo ciemny i ma ksztat obiektu rzucajcego cie. Moemy wic programowo wygenerowa cie, wykonujc spaszczajcy rzut obiektu rzucajcego cie na
zacienion powierzchni. W takim rzucie obiekt rysowany jest kolorem czarnym lub innym
ciemnym, z zachowaniem pewnego stopnia przezroczystoci. Istnieje wiele metod i algorytmw generowania cieni, z ktrych cz naley do bardzo zoonych. W tej ksice
skupia bdziemy si przede wszystkim na interfejsie programistycznym OpenGL.
Mamy nadziej, e po opanowaniu tego narzdzia kolejne pozycje sugerowane w dodatku A udostpni kademu ogromne moliwoci jego wykorzystania w wielu rnych
nowych aplikacjach. W rozdziale 18., Tekstury gbi oraz cienie, opisujemy jedn z nowych bezporednich metod generowania cieni oferowan przez bibliotek OpenGL.
Jednak w tym rozdziale skupimy si na zaprezentowaniu jednej z prostszych metod, doskonale si sprawdzajcych, jeeli cie rzucany jest na paskie powierzchnie (na przykad na
ziemi). Spaszczenie, o ktrym mwilimy wczeniej, zilustrowane zostao na rysunku 5.40.
'
Spaszczenie obiektu
tworzce jego cie
269
Musimy spaszczy macierz rzutowania widoku modelu w taki sposb, eby wszystkie
rysowane w niej obiekty byy spaszczone do wiata dwuwymiarowego. Niezalenie od
uoenia obiektu w przestrzeni zostanie on sprasowany na powierzchni, na ktrej pooony bdzie jego cie. Trzeba przy tym wzi pod uwag kierunek i odlego rda
wiata. Kierunek rda wiata bdzie wpywa na ksztat i rozmiar cienia obiektu.
Kady, kto przyglda si swojemu cieniowi wczesnym rankiem lub pnym wieczorem,
wie dokadnie, jak dugi i powykrzywiany moe si on wydawa.
Pochodzca z biblioteki glTools funkcja A
B przedstawiona zostaa na
listingu 5.8. Pobiera ona trzy punkty lece na paszczynie, na ktrej ma si pojawi
cie (nie mog by uoone na jednej linii!), pozycj rda wiata oraz wskanik na
macierz przeksztacenia wyliczonego przez t funkcj. Nie bdziemy za bardzo wgbia
si w algebr liniow, ale musimy powiedzie, e ta funkcja wyznacza wspczynniki
rwnania paszczyzny, na ktr pada bdzie cie i wykorzystuje je w poczeniu z informacj o pozycji rda wiata do zbudowania macierzy przeksztacenia. Jeeli t macierz
pomnoymy przez aktualn macierz model-widok, to wszystkie kolejne operacje rysowania
bd odbyway si na podanej do funkcji paszczynie.
%
&#Funkcja tworzca macierz przeksztacenia generujcego cienie
// Tworzy macierz rzutowania cienia na podstawie wspczynnikw
// rwnania paszczyzny i pozycji rda wiata
// Warto zwracana zapisywana jest pod wskanikiem destMat
I
H
%)/
@:?
D67%)/
@F:
?D
%)
D
8
%)/
@F:?
-J
%0
%
?
-J
:?
D67:?
D6!7:?
D67:?
-J
// Iloczyn skalarny paszczyzny i pozycji rda wiata
#:?
-J
675:
?D67K
:?
-J
6!75:
?D6!7K
:?
-J
675:
?D67K
:?
-J
675:
?D67
// Teraz wykonujemy rzutowanie
// Pierwsza kolumna
D67# 2:
?D675:?
-J
67
D6F7#102:
?D675:?
-J
6!7
D6"7#102:
?D675:?
-J
67
D6!7#102:
?D675:?
-J
67
// Druga kolumna
D6!7#102:
?D6!75:?
-J
67
D6 7# 2:
?D6!75:?
-J
6!7
D647#102:
?D6!75:?
-J
67
D6!7#102:
?D6!75:?
-J
67
270
Cz I Klasyka OpenGL
// Trzecia kolumna
D67#102:
?D675:?
-J
67
D6>7#102:
?D675:?
-J
6!7
D6!7# 2:
?D675:?
-J
67
D6!F7#102:
?D675:?
-J
67
// Czwarta kolumna
D67#102:
?D675:?
-J
67
D637#102:
?D675:?
-J
6!7
D6!!7#102:
?D675:?
-J
67
D6! 7# 2:
?D675:?
-J
67
9
1
Aby zademonstrowa zastosowanie funkcji z listingu 5.8, zawiesimy nasz samolot wysoko
nad ziemi, a rdo wiata nad samolotem, lekko przesunite w lew stron. Klawiszami strzaek mona obraca samolot w rnych kierunkach, a wtedy cie rzucany przez
samolot na ziemi bdzie si dostosowywa do nowej pozycji samolotu. Na rysunku 5.41
przedstawiono wynik dziaania programu SHADOW.
Wynik dziaania
programu SHADOW
271
$
8
// Trzy dowolne punkty lece na podou
// (podane z nawiniciem przeciwnym do ruchu wskazwek zegara)
%)/
@
D67#882102!F4102109
82102!F410109
8F102!F4101099
-
%';-?)*')-)// Usuwanie ukrytych powierzchni
<<@
%'A// Wielokty z nawiniciem przeciwnym do ruchu
wskazwek zegara
-
%'='<,-// Nie bdziemy prowadzi oblicze wntrza samolotu
// Wczenie owietlenia
-
%'+%*)+%
111
272
Cz I Klasyka OpenGL
// Przed wykonaniem obrotw zapisanie macierzy stanu
?D
// Rysowanie samolotu w nowej pozycji i umieszczenie rda wiata
// jeszcze przed jego obrceniem.
-
%'+%*)+%
0:%'+%*)%'?(+)+(
?D
$
0$!101010
$
0.$10!1010
;HM
<,-
// Odtworzenie oryginalnego stanu macierzy
?
// Przygotowania do rysowania cienia i podoa
// Najpierw wyczamy owietlenie i zapisujemy stan rzutowania
;
D
%';-?)*')-)
;
D
%'+%*)+%
?D
// Mnoenie przez macierz rzutowania cienia
0%05D H
// Teraz obracamy samolot w nowej, spaszczonej przestrzeni
$
0$!101010
$
0.$10!1010
// Informujemy funkcj, e rysowany bdzie cie
;HM
)$=-
// Odtworzenie normalnej wartoci macierzy rzutowania
?
// Rysowanie rda wiata
?D
)D
0
?D67
?D6!7
?D67
10!!
?
// Odtworzenie zmiennych stanu owietlenia
-
%';-?)*')-)
// Wywietlenie wynikw
H&00
D
9
Prostokt ziemi ley na dokadnie tej samej paszczynie, na ktrej rysowane s cienie,
a chcemy by pewni, e cienie jednak zostan narysowane. Do tej pory nie zastanawialimy si, co si stanie, gdy na jednej paszczynie bdziemy rysowa dwa obiekty. Opisywalimy jednak mechanizm testowania gbi stosowany do sprawdzania, jakie elementy
maj by rysowane przed innymi. Jeeli dwa obiekty znajduj si w tej samej odlegoci
od obserwatora, to najczciej pojawia si ten, ktry by rysowany jako ostatni. Czasami
jednak, w wyniku efektu zwanego walk w buforze z (ang. z-fighting), na ekranie pojawiaj si pomieszane ze sob czci obu obiektw, co powoduje zamazanie obrazu!
273
1"
Ostatni przykad tego rozdziau jest zbyt duy, eby w caoci podawa jego kod rdowy.
W poprzednim rozdziale, w programie SPHEREWORLD, tworzylimy cay trjwymiarowy wiat wraz z animacjami i ruchami kamery. W tym rozdziale ponownie odwiedzimy wiat kul i dodamy do niego owietlenie, a torusowi i wszystkim kulom nadamy
waciwoci ich materiaw. Zastosujemy te opisan przed chwil technik generowania cieni! Do tego przykadu bdziemy wraca od czasu do czasu, dodajc do niego coraz
wicej funkcji biblioteki OpenGL. Na rysunku 5.42 przedstawiony zosta wynik dziaania programu SPHEREWORLD uzupenionego o funkcje opisywane w tym rozdziale.
(
W niniejszym rozdziale wprowadzilimy kilka bardziej zaawansowanych moliwoci
biblioteki OpenGL. Rozpoczlimy od dodawania do sceny kolorw i zastosowania
gadkiego cieniowania. Nastpnie dowiedzielimy si, jak mona utworzy jedno lub
wicej rde wiata i zdefiniowa ich charakterystyki skadowych wiata otoczenia,
rozproszenia i odbicia. Wyjanilimy te, w jaki sposb poszczeglne waciwoci materiaw wspdziaaj ze rdami wiata. Zademonstrowalimy kilka efektw specjalnych
takich jak generowanie rozbyskw wietlnych na powierzchni obiektw i agodzenie
ostrych krawdzi wystpujcych pomidzy ssiadujcymi trjktami.
274
Cz I Klasyka OpenGL
Omwilimy rwnie pozycjonowanie rde wiata, a take metody tworzenia i manipulowania reflektorami. Opisana przez nas macierz wysokiego poziomu bardzo uatwia
generowanie cieni, jeeli s one rzucane na pask powierzchni.
Zastosowanie:
Plik nagwkowy:
Rodzaje:
1 !
2 !
2 !
3D
1 !
2 !
2 !
3D
1 ! 2 ! 2 ! 3D
1 ! 2 ! 2 ! 3D
1 ! 2 ! 2 ! 3D
1 !
2 !
2 !
3D
1 ! 2 ! 2 ! 3D
1 ! 2 ! 2 ! 3D
E
1 !
2 !
2 !
2 !
3D
E
1 !
2 !
2 !
2 !
3D
E1 ! 2 ! 2 ! 2 !
3D
E1 ! 2 ! 2 ! 2 !
3D
E1 ! 2 ! 2 ! 2 !
3D
E
1 !
2 !
2 !
2 !
3D
E1 ! 2 ! 2 ! 2 !
3D
E1 ! 2 ! 2 ! 2 !
3D
1
!
F3D
1
!
F3D
1
! F3D
1
! F3D
1
! F3D
1
!
F3D
1
! F3D
1
! F3D
E
1
!
F3D
E
1
!
F3D
E1
! F3D
E1
! F3D
E1
! F3D
275
E
1
!
F3D
E1
! F3D
E1
! F3D
Opis:
Parametry:
F
Zastosowanie:
Plik nagwkowy:
Skadnia:
A1 !
2 !
2 !
2 !
3D
Opis:
Parametry:
!
okrela, czy moliwe bd modyfikacje skadowej czerwonej
koloru.
!
okrela, czy moliwe bd modyfikacje skadowej zielonej
koloru.
276
Cz I Klasyka OpenGL
!
okrela, czy moliwe bd modyfikacje skadowej niebieskiej
koloru.
!
okrela, czy moliwe bd modyfikacje skadowej kanau alfa.
Zastosowanie:
Plik nagwkowy:
Skadnia:
1 !7 2 !73D
Opis:
Parametry:
Zastosowanie:
Plik nagwkowy:
Rodzaje:
! 1 !72 !7
2 ! F
3D
! 1 !72 !7
2 ! F
3D
Opis:
277
Parametry:
%',&+-)
%';+<<=-
%'?-=,$
%'?(+)+(
%'?()';+$-)+(
%'?()'-N?(-)
%'?()'=)(<<
%'(),)',))-=,)+(
%'+-,$',))-=,)+(
%'L=,;$,)+',))-=,)+(
!
Zastosowanie:
Plik nagwkowy:
278
Cz I Klasyka OpenGL
Rodzaje:
1 !7 2 !7
2 ! F
3D
1 !7 2 !7
2 ! F
3D
Opis:
Parametry:
Zastosowanie:
Plik nagwkowy:
Rodzaje:
! 1 !72 !7
2 !
3D
! 1 !72 !7
2 !
3D
! 1 !72 !7
2
! F
3D
! 1 !72 !7
2
! F
3D
Opis:
279
Parametry:
!
Zastosowanie:
Plik nagwkowy:
Rodzaje:
!
1 !7
2 !
3D
!
1 !7
2 !
3D
!
1 !7
2
! F
3D
!
1 !7
2
! F
3D
Opis:
280
Cz I Klasyka OpenGL
parametru !"!+ ,%"'/*!"!'$!":+*J*. powoduje zmodyfikowanie oblicze
ktw odbicia wiata odbitego w zalenoci od tego, czy obserwator patrzy
w d wzdu ujemnych wartoci osi z czy te z pocztku ukadu wsprzdnych
oka. W kocu parametr !"!+ ,%"'/*!"'!'."')%.'! moe by stosowany
do kontrolowania, czy owietlenie bdzie tworzyo dodatkowy kolor (tekstury
bd owietlane wiatem odbitym) czy te wszystkie trzy skadowe wiata
bd czone w parametrze !"+) !*"'!'..
Parametry:
Zastosowanie:
Plik nagwkowy:
Rodzaje:
1 !7 2 !7
2 !
3D
1 !7 2 !7
2 !
3D
1 !7 2 !7
2
! F
3D
1 !7 2 !7
2
! F
3D
Opis:
281
Zastosowanie:
Plik nagwkowy:
Rodzaje:
)7
1 !
2 !
2 !
3D
)7
1 !
2 !
2 !
3D
)71 ! 2 ! 2 ! 3D
)71 ! 2 ! 2 ! 3D
)71 ! 2 ! 2 ! 3D
)7
1
!
F3D
)7
1
!
F3D
)71
! F3D
)71
! F3D
)71
! F3D
Opis:
282
Cz I Klasyka OpenGL
podnosi prdko renderowania. Biblioteka OpenGL automatycznie moe
zamienia wszystkie wektory normalne w wektory jednostkowe; wystarczy
wywoa funkcj *
1 !")'.$!+8*3D.
Parametry:
Zastosowanie:
Plik nagwkowy:
Skadnia:
1 !73D
Opis:
Parametry: