You are on page 1of 73

IDZ DO

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

Poznaj tajniki programowania realistycznej grafiki 3D


Stwrz i animuj obiekty trjwymiarowe
Wykorzystaj mechanizmy renderingu na platformach Windows, Mac OS i Linux
Zastosuj w swoich projektach algorytmy sprztowego wspomagania
wywietlania grafiki 3D
OpenGL to platforma programistyczna do tworzenia grafiki trjwymiarowej.
Tworzce j mechanizmy zostay opracowane ponad 20 lat temu w firmie Silicon
Graphics i spowodoway prawdziw rewolucj w wiecie grafiki komputerowej.
Dziki bibliotece OpenGL moliwe stao si tworzenie realistycznej grafiki i animacji 3D
oraz wykorzystywanie moliwoci kart i systemw graficznych do wspomagania jej
wywietlania. To wanie dziki rozwojowi OpenGL moemy teraz podziwia wspaniae
wizualizacje, kinowe efekty specjalne i oszaamiajce gry komputerowe.
Ksika OpenGL. Ksiga eksperta. Wydanie III to podrcznik dla programistw
chccych wykorzysta moliwoci biblioteki OpenGL w swoich projektach.
Opisuje zarwno podstawy programowania grafiki z wykorzystaniem OpenGL, jak
i moliwoci zastosowania jej na rnych platformach systemowych i sprztowych.
Przedstawia rwnie sposoby wykorzystania mechanizmw sprztowego
wspomagania wywietlania grafiki i animacji 3D oraz efektw specjalnych.
Typowe zastosowania grafiki komputerowej
Przegld moliwoci bibliotek OpenGL
Podstawy stosowania OpenGL
Tworzenie bry trjwymiarowych i korzystanie z ksztatw podstawowych
Przeksztacenia geometryczne i przetwarzanie potokowe
Modele kolorw i owietlenia
Przetwarzanie grafiki i mapowanie tekstur
Modelowanie krzywych i powierzchni
Wykorzystanie bibliotek OpenGL w rnych systemach operacyjnych
Buforowanie danych
Cienie i gbia ostroci
Operacje na wierzchokach

Jeli chcesz stworzy grafik 3D zapierajc dech w piersiach,


skorzystaj z wiedzy zawartej w tej ksice.

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

OpenGL. Ksiga eksperta


Konwencje nazewnictwa funkcji................................................................................................... 66
Niezaleno od platformy .................................................................................................................. 67
Biblioteka GLUT........................................................................................................................... 68
Konfigurowanie rodowiska programistycznego .......................................................................... 69
Nasz pierwszy program ................................................................................................................. 69
Rysowanie ksztatw w OpenGL .................................................................................................. 75
Animacja w OpenGL i GLUT ............................................................................................................. 82
Podwjne buforowanie.................................................................................................................. 85
Maszyna stanw OpenGL.................................................................................................................... 86
Zapisywanie i odtwarzanie stanw................................................................................................ 87
Bdy OpenGL..................................................................................................................................... 88
Gdy w dobrym kodzie dziej si ze rzeczy .................................................................................. 88
Identyfikowanie wersji ........................................................................................................................ 89
Pobieranie wskazwek z funkcji glHint .............................................................................................. 89
Korzystanie z rozszerze ..................................................................................................................... 90
Wyszukiwanie rozszerze ............................................................................................................. 90
Czyje to rozszerzenie?................................................................................................................... 92
Stosowanie w systemie Windows biblioteki OpenGL w wersji wyszej ni 1.1........................... 92
Podsumowanie..................................................................................................................................... 93
Opisy funkcji ....................................................................................................................................... 94

& ''   (


'( )
Rysowanie punktw w trzech wymiarach ......................................................................................... 108
Konfigurowanie trjwymiarowego ptna......................................................................................... 108
Punkt w trzech wymiarach. Wierzchoek .......................................................................................... 110
Narysujmy co!.................................................................................................................................. 111
Rysowanie punktw .................................................................................................................... 111
Ustalanie wielkoci punktu................................................................................................................ 114
Rysowanie linii w trzech wymiarach................................................................................................. 118
Linie amane i zamknite............................................................................................................. 118
Aproksymacja krzywych liniami prostymi.................................................................................. 120
Ustalanie szerokoci linii............................................................................................................. 121
Linie przerywane......................................................................................................................... 123
Rysowanie trjktw w trzech wymiarach ........................................................................................ 125
Trjkt mj pierwszy wielokt ............................................................................................... 126
Nawinicie................................................................................................................................... 126
Trjkty sklejane ......................................................................................................................... 128
Wachlarze trjktw.................................................................................................................... 128
Budowanie penych obiektw............................................................................................................ 129
Ustalanie koloru wielokta .......................................................................................................... 132
Usuwanie ukrytych powierzchni ................................................................................................. 132
Culling. Ukrywanie powierzchni poprawia wydajno ............................................................... 134
Tryby wieloktw ....................................................................................................................... 136
Inne obiekty podstawowe .................................................................................................................. 137
Czworokty ................................................................................................................................. 137
Dowolne wielokty...................................................................................................................... 138
Wypenianie wieloktw lub powrt do tepowania..................................................................... 139
Reguy konstruowania wieloktw.............................................................................................. 142
Podziay i krawdzie ................................................................................................................... 144

Spis treci

Inne ciekawe operacje na buforze...................................................................................................... 145


Wybranie bufora docelowego...................................................................................................... 145
Manipulowanie buforem gbi .................................................................................................... 147
Wycinanie noycami ................................................................................................................... 148
Uywanie bufora szablonowego.................................................................................................. 149
Podsumowanie................................................................................................................................... 155
Opisy funkcji ..................................................................................................................................... 155

* +'   +


Czy to jest ten straszliwy rozdzia z matematyk?............................................................................. 172
Przeksztacenia .................................................................................................................................. 172
Wsprzdne oka ......................................................................................................................... 173
Przeksztacenia punktu widzenia................................................................................................. 174
Przeksztacenia modelowania...................................................................................................... 174
Dwoisto model-widok.............................................................................................................. 175
Przeksztacenia rzutowania ......................................................................................................... 177
Przeksztacenia widoku ............................................................................................................... 178
Macierz matematyczna podstawa grafiki trjwymiarowej............................................................ 178
Czym jest macierz? ..................................................................................................................... 179
Potok przeksztace..................................................................................................................... 180
Macierz model-widok.................................................................................................................. 181
Macierz jednostkowa................................................................................................................... 184
Stos macierzy .............................................................................................................................. 186
Przykad atomowy....................................................................................................................... 187
Rzutowania........................................................................................................................................ 189
Rzutowanie prostopade .............................................................................................................. 190
Rzutowanie perspektywiczne ...................................................................................................... 190
Przykad kosmiczny .................................................................................................................... 193
Zaawansowane manipulacje macierzami........................................................................................... 197
adowanie macierzy.................................................................................................................... 199
Wykonywanie wasnych przeksztace ....................................................................................... 199
czenie przeksztace................................................................................................................ 202
Przesuwanie kamer i aktorw w OpenGL ......................................................................................... 203
Ukad odniesienia aktora ............................................................................................................. 204
Kty Eulera. Uyj ukadu odniesienia, Luke! .......................................................................... 205
Obsuga kamery........................................................................................................................... 205
A teraz wszystko razem ..................................................................................................................... 206
Podsumowanie................................................................................................................................... 212
Opisy funkcji ..................................................................................................................................... 212

% ,-./- +' ""


Czym jest kolor?................................................................................................................................ 222
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

OpenGL. Ksiga eksperta


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
Cienie ................................................................................................................................................ 265
Czym jest cie? ........................................................................................................................... 266
Kod prasujcy.............................................................................................................................. 267
Przykad z cieniem ...................................................................................................................... 268
Ponowna wizyta w wiecie kul.................................................................................................... 271
Podsumowanie................................................................................................................................... 271
Opisy funkcji ..................................................................................................................................... 272

0 1 -



"2
Mieszanie kolorw ............................................................................................................................ 281
czenie kolorw ........................................................................................................................ 282
Zmiana rwnania mieszania ........................................................................................................ 285
Antyaliasing ................................................................................................................................ 286

Spis treci

Mga .................................................................................................................................................. 291


Bufor akumulacji ............................................................................................................................... 294
Inne operacje na kolorach.................................................................................................................. 297
Maskowanie kolorw .................................................................................................................. 297
Operacje logiczne na kolorach .................................................................................................... 298
Testowanie kanau alfa................................................................................................................ 298
Rozsiewanie ................................................................................................................................ 299
Podsumowanie................................................................................................................................... 300
Opisy funkcji ..................................................................................................................................... 300

 + ! &)


Bitmapy ............................................................................................................................................. 308
Przykad bitmapowy.................................................................................................................... 309
Pakowanie pikseli.............................................................................................................................. 313
Piksmapy ........................................................................................................................................... 315
Upakowane formaty pikseli......................................................................................................... 316
Przykad kolorowy ...................................................................................................................... 317
Przesuwanie pikseli ..................................................................................................................... 320
Zapisywanie pikseli..................................................................................................................... 322
Wicej zabaw z pikselami ................................................................................................................. 323
Powikszanie pikseli ................................................................................................................... 329
Transfer pikseli............................................................................................................................ 331
Odwzorowanie pikseli................................................................................................................. 335
Podzbir funkcji obrazowania........................................................................................................ 337
Potok obrazowania ...................................................................................................................... 340
Podsumowanie................................................................................................................................... 352
Opisy funkcji ..................................................................................................................................... 353

2 ' +' & &


adowanie tekstur ............................................................................................................................. 374
Wykorzystywanie bufora kolorw .............................................................................................. 377
Aktualizowanie tekstur................................................................................................................ 377
Odwzorowywanie tekstur na obiekty geometryczne ......................................................................... 378
Macierze tekstur .......................................................................................................................... 379
Prosty przykad dwuwymiarowy ....................................................................................................... 381
rodowisko tekstur ............................................................................................................................ 386
Parametry tekstur............................................................................................................................... 387
Podstawowe filtrowanie .............................................................................................................. 388
Zawijanie tekstury ....................................................................................................................... 390
Tekstury kreskwkowe................................................................................................................ 391
Mipmapy ..................................................................................................................................... 395
Obiekty tekstur .................................................................................................................................. 399
Obsuga wielu tekstur.................................................................................................................. 400
Podsumowanie................................................................................................................................... 408
Opisy funkcji ..................................................................................................................................... 409

 ' 34-' *"%


Drugi kolor ........................................................................................................................................ 425
Filtrowanie anizotropowe .................................................................................................................. 428
Kompresja tekstur.............................................................................................................................. 431

10

OpenGL. Ksiga eksperta


Kompresowanie tekstur............................................................................................................... 431
adowanie tekstur skompresowanych......................................................................................... 433
Generowanie wsprzdnych tekstury ............................................................................................... 433
Odwzorowanie liniowe wzgldem obiektu ................................................................................. 439
Odwzorowanie linowe wzgldem oka......................................................................................... 440
Odwzorowywanie kuliste ............................................................................................................ 441
Odwzorowywanie kubiczne ........................................................................................................ 443
Multitekstury ..................................................................................................................................... 445
Wielokrotne wsprzdne tekstur ................................................................................................ 447
Przykad multiteksturowania ....................................................................................................... 448
czniki tekstur ................................................................................................................................. 452
Podsumowanie................................................................................................................................... 454
Opisy funkcji ..................................................................................................................................... 454

 ) ,
 *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

Wczytanie geometrii.................................................................................................................... 553


Wczenie tablic .......................................................................................................................... 554
Gdzie s dane?............................................................................................................................. 554
Rysujemy! ................................................................................................................................... 555
Indeksowane tablice wierzchokw............................................................................................. 556
Podsumowanie................................................................................................................................... 568
Opisy funkcji ..................................................................................................................................... 568

 "   %2&


Selekcja ............................................................................................................................................. 584
Nazywanie obiektw ................................................................................................................... 584
Praca w trybie zaznaczania.......................................................................................................... 586
Bufor zaznaczenia ....................................................................................................................... 587
Wybieranie .................................................................................................................................. 589
Wybieranie hierarchiczne............................................................................................................ 591
Informacje zwrotne ..................................................................................................................... 595
Bufor informacji zwrotnych ........................................................................................................ 595
Dane informacji zwrotnej............................................................................................................ 596
Przekazywane znaczniki.............................................................................................................. 596
Przykad wykorzystania danych z bufora .......................................................................................... 597
Nazywanie obiektw w informacjach zwrotnych........................................................................ 597
Krok 1. Zaznaczenie obiektu....................................................................................................... 599
Krok 2. Pobranie informacji zwrotnych dla obiektu.................................................................... 601
Podsumowanie................................................................................................................................... 603
Opisy funkcji ..................................................................................................................................... 603

  



  !"#
 & -  !''' 0
Implementacje OpenGL w systemie Windows.................................................................................. 612
Oglna implementacja OpenGL.................................................................................................. 612
Instalowalny sterownik klienta (ICD) ......................................................................................... 613
Sterownik miniklienta (MCD)..................................................................................................... 613
Ministerownik ............................................................................................................................. 614
Rozszerzony OpenGL ................................................................................................................. 614
Podstawowy rendering w systemie Windows.................................................................................... 616
Kontekst urzdzenia GDI ............................................................................................................ 616
Formaty pikseli............................................................................................................................ 618
Kontekst renderingu OpenGL ..................................................................................................... 625
czymy wszystko razem.................................................................................................................. 626
Tworzenie okna ........................................................................................................................... 626
Korzystanie z kontekstu renderingu OpenGL ............................................................................. 630
Pozostae komunikaty okna......................................................................................................... 633
Palety systemu Windows................................................................................................................... 635
Dopasowanie kolorw................................................................................................................. 635
Arbitra palety............................................................................................................................. 636
Tworzenie palety dla OpenGL .................................................................................................... 638
Tworzenie i zwalnianie palety..................................................................................................... 642
OpenGL i czcionki systemowe .......................................................................................................... 643
Trjwymiarowe czcionki i tekst .................................................................................................. 644

12

OpenGL. Ksiga eksperta


Dwuwymiarowe czcionki i tekst ................................................................................................. 646
Tryb penoekranowy.......................................................................................................................... 648
Tworzenie okna bez paska tytuowego i krawdzi ...................................................................... 649
Utworzenie okna penoekranowego ............................................................................................ 649
Rendering wielowtkowy .................................................................................................................. 652
OpenGL i rozszerzenia WGL ............................................................................................................ 653
Proste rozszerzenia...................................................................................................................... 654
Korzystanie ze wskanikw na funkcje....................................................................................... 655
Rozszerzenia WGL...................................................................................................................... 656
Podsumowanie................................................................................................................................... 679
Opisy funkcji ..................................................................................................................................... 680

 *  !''6 78 0%


Podstawy ........................................................................................................................................... 695
Szkielety aplikacji ....................................................................................................................... 696
Korzystanie z interfejsu GLUT ................................................................................................... 696
Wykorzystanie interfejsw AGL i Carbon ........................................................................................ 696
Formaty pikseli............................................................................................................................ 697
Zarzdzanie kontekstem .............................................................................................................. 697
Podwjne buforowanie................................................................................................................ 699
Pierwszy program AGL............................................................................................................... 699
Korzystanie z czcionek bitmapowych ......................................................................................... 709
Interfejs programistyczny Cocoa ....................................................................................................... 720
Klasa NSOpenGL........................................................................................................................ 720
Pierwszy program korzystajcy z Cocoa..................................................................................... 723
Podsumowanie................................................................................................................................... 730
Opisy funkcji ..................................................................................................................................... 731

 %  !85 !!' &%


Podstawy ........................................................................................................................................... 735
Korzystanie z bibliotek OpenGL oraz X11 ................................................................................. 735
Uycie biblioteki GLUT.............................................................................................................. 738
OpenGL w systemie Linux.......................................................................................................... 738
Emulacja OpenGL Mesa ........................................................................................................ 739
Rozszerzenia OpenGL dla X Window System .................................................................................. 739
Podstawy X Window System ...................................................................................................... 740
Wybr typu obiektu wywietlania............................................................................................... 740
Zarzdzanie kontekstem OpenGL ............................................................................................... 742
Tworzenie okna OpenGL ............................................................................................................ 742
Okna podwjnie buforowane ...................................................................................................... 743
Wykorzystanie zdobytej wiedzy.................................................................................................. 743
Tworzenie czcionek bitmapowych na potrzeby OpenGL .................................................................. 751
Renderowanie poza ekranem ............................................................................................................. 761
Mapy pikselowe GLX ................................................................................................................. 761
Uycie obiektw Pbuffer............................................................................................................. 766
Zastosowanie biblioteki Motif ........................................................................................................... 772
GLwDrawingArea oraz GLwMDrawingArea kontrolki OpenGL.......................................... 772
Funkcje zwrotne .......................................................................................................................... 773
Funkcje........................................................................................................................................ 775
Wykorzystanie zdobytej wiedzy.................................................................................................. 775

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 <'1(  2&%


Punkt widzenia wiata ...................................................................................................................... 836
Dopasowanie sceny do okna ....................................................................................................... 836
Unikamy efektw specjalnych .................................................................................................... 837
Nowy rodzaj tekstury......................................................................................................................... 839
Dlaczego cienie rysujemy na pocztku? ............................................................................................ 840
I staa si wiato ............................................................................................................................ 841
Rzutowanie mapy cieni. Etap pierwszy przyczyna................................................................. 842
Rzutowanie mapy cieni. Etap drugi sposb............................................................................ 843
Porwnanie cieni......................................................................................................................... 845
Dwa przebiegi z trzech nie najgorszy wynik ................................................................................ 851
Kilka sw o offsecie wieloktw...................................................................................................... 851
Podsumowanie................................................................................................................................... 852
Opisy funkcji ..................................................................................................................................... 853

  + 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

OpenGL. Ksiga eksperta


Wprowadzenie do shaderw.............................................................................................................. 867
Rozszerzenia niskopoziomowe.................................................................................................... 867
Rozszerzenia wysokopoziomowe................................................................................................ 869
Podsumowanie................................................................................................................................... 870

") ='

 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

Zmienne wbudowane .................................................................................................................. 919


Wyraenia.......................................................................................................................................... 919
Operatory..................................................................................................................................... 919
Dostp do tablic........................................................................................................................... 921
Konstruktory ............................................................................................................................... 921
Selektory skadowych.................................................................................................................. 922
Kontrola przepywu ........................................................................................................................... 923
Ptle............................................................................................................................................. 923
if...else ......................................................................................................................................... 923
discard ......................................................................................................................................... 924
Funkcje........................................................................................................................................ 924
Podsumowanie................................................................................................................................... 927
Opisy funkcji ..................................................................................................................................... 927

"" +

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

OpenGL. Ksiga eksperta

>>-'- ) 
Inne dobre ksiki o OpenGL.......................................................................................................... 1019
Ksiki dotyczce grafiki 3D........................................................................................................... 1019
Strony WWW .................................................................................................................................. 1020

>?7  )"


>3 !@7 )"
Redukcja typw danych................................................................................................................... 1027
Co zostao usunite? ........................................................................................................................ 1028
Ograniczenie funkcjonalnoci ......................................................................................................... 1029
Odwzorowanie tekstur............................................................................................................... 1029
Operacje rastrowe...................................................................................................................... 1029
Owietlenie................................................................................................................................ 1030
Wnioski ........................................................................................................................................... 1030

7 )&

4Q\F\KC


   



 
#WVQT4KEJCTF59TKIJV,T


   



       

Ustala kolor na podstawie skadowych RGB



Ustala model cieniowania





Ustala model owietlenia

  


Ustala parametry owietlenia

 

Skonfigurowa odblaskowe waciwoci materiaw

 
 / 
 

Stosowa normalne powierzchni



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 podstawowych, 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 wiecie 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 matowe 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.

 

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

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


 

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

   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 sposb, 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, miliardami (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.
  
Kady obiekt odbija
cz fotonw, a cz
z nich pochania

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

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 fosforyzujce materiay uoone s bardzo blisko siebie, tak e razem tworz jedn barwn
plamk na ekranie (rysunek 5.5).
  
Jak monitor
komputerowy generuje
kolory

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.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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.

     


Ze wzgldu na oszczdno pamici i popraw wydajnoci w wielu kartach graficznych
stosowane s rwnie rne inne tryby kolorw. W celu poprawy wydajnoci czsto uywany 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 podzielnych 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 odwzorowywanie 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 dodatkowe kolory w trybie 24-bitowym bardzo podnosz jako obrazu, jeeli do jego generowania wykorzystywane s operacje cieniowania i mieszania kolorw.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

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-niebieski (cyan) i fuksyna (magenta), bdce kombinacjami kolorw podstawowych. Szecian
kolorw mona obraca, aby zobaczy wszystkie jego strony.

232

Cz I  Klasyka OpenGL

  "
Przestrze
kolorw RGB

  #
Wynik dziaania
programu CCUBE

&   


Przyjrzyjmy si krtko funkcji . Jest ona prototypowana nastpujco:






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

),  (  ) lub  (  ). Kolejna wersja funkcji ma na kocu


liter . Oznacza ona, e ta wersja funkcji pobiera tablic zawierajc wszystkie parametry (litera  oznacza vector, czyli wektor). W podrozdziale Opisy funkcji znajduje si
duo dokadniejszy opis funkcji .
Wikszo programw, z jakimi przyjdzie nam si spotyka, wykorzystuje funkcj 
, w ktrej intensywno kadej skadowej okrelana jest liczb z zakresu od  do
. Jednak dla osb z dowiadczeniem w programowaniu w systemie Windows znacznie

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

233

atwiejsze moe by uycie funkcji 


. Ta wersja pobiera trzy bajty bez znaku,
czyli wartoci od  do . Stosowanie tej funkcji jest bardzo podobne do stosowania
makra systemu Windows:
 !"#$%& !"

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

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

235

  '
Trjkt w przestrzeni
kolorw RGB

// Wierzchoek zielony - na dole po prawej stronie


% .
% .
 % .

/

010231010
// Wierzchoek niebieski - na dole po lewej stronie
% .
% .
% .
 
/

0210231010
- 

&   



W pierwszej linii listingu 5.1 ustalamy, e modelem cieniowania stosowanym przez bibliotek 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   , jest !"#!$%,
czyli cieniowanie paskie. Cieniowanie paskie oznacza, e wewntrz obiektw podstawowych 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 !"&'!( '). 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 zdefiniujemy, OpenGL doskonale wycieniuje jego wntrze, stosujc kolory nadane wierzchokom.

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

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

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.

%  &$  
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 .

* "  


Wyliczenia dla wiata otoczenia s jednak wyjtkowo proste. wiato rozproszone rwnie
opisywane jest wartociami intensywnoci RGB, ktre w taki sam sposb cz si z waciwociami 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 przykad 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 , 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.

' ($ &( 


Moe si wydawa, e powysze wywody s ogromn iloci nagle podanej teorii. Zwolnimy wic i spokojnie przeanalizujemy przykady kodu koniecznego, jeeli chcemy stosowa 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.

(
"
Aby nakaza bibliotece OpenGL przeprowadzanie oblicze zwizanych z owietleniem,
wystarczy wywoa funkcj *
 z parametrem !"!+ ,%+) :
-
% ' +%*)+%

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 pozostaby ciemny i nieowietlony tak jak nasz przykadowy samolot z rysunku 5.17. Jeeli spojrzymy na kod dowolnego z przykadowych programw wywodzcych si z programu JET,
to zobaczymy, e funkcj  -. wywoujemy zaraz po utworzeniu kontekstu renderowania. W tym wanie miejscu wykonywane s wszystkie inicjalizacje parametrw owietlenia.

   "


Pierwsz rzecz, jak musimy wykona zaraz po wczeniu obliczania owietlenia, to skonfigurowanie modelu owietlenia. Trzy parametry wpywajce na model owietlenia ustawiane s za pomoc funkcji !  .

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
-
% ' +%*)+%

// Konfigurujemy model owietlenia tak, eby stosowa


// wiato otoczenia zdefiniowane tablic ambientLight[]
  
0:% ' +%*)' (;- ', &+-)
 

Podana tutaj wersja funkcji !   !   w pierwszym parametrze


pobiera informacj o typie owietlenia, jakie poddajemy modyfikacjom, a w drugim parametrze pobiera tablic wartoci RGBA opisujc wiato. Domylne wartoci RGBA dla
globalnego wiata otoczenia wynosz 12223, co oznacza bardzo przyciemnione wiato. Pozostae parametry modelu owietlenia pozawalaj okreli, czy
owietlane maj by przednie, tylnie czy moe obie strony wieloktw oraz metody obliczania owietlenia wiatem odbitym. Wicej informacji o tych parametrach znajduje si
w podrozdziale Opisy funkcji.

& "
"
 
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:% '<$()% ', &+-)',;';+<<=-.
&
 % ')$+,% -

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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
!"'!'."$%*.+$!:
-
% '( ($' ,)-$+, 

Nastpnie funkcj   okrelamy parametry podawane zaraz za wartociami


funkcji . Na przykad, aby ustawi waciwoci materiau dla wiata otoczenia
i rozproszenia dla przednich stron wieloktw tak, aby ledziy one kolory ustawiane
funkcj , naley wywoa:
 
 % '<$()% ', &+-)',;';+<<=-

Teraz podany wyej fragment kodu ustawiajcy waciwoci materiaw moglibymy


zmodyfikowa nastpujco. Moe to wyglda na tworzenie wikszej iloci kodu, ale tak
naprawd oszczdza si w ten sposb wiele linii kodu, co przekada si na szybsze rysowanie wielu rnokolorowych wieloktw:
// Wczenie ledzenia kolorw
-
% '( ($' ,)-$+, 

// Kolory waciwoci materiaw dla wiata otoczenia i rozproszenia


// bd ledziy wartoci podawane w funkcji glColor
 
 % '<$()% ', &+-)',;';+<<=-
111
111
013 013 013 0
&
 % ')$+,% -
/

02! 101010
/

010! 1010
/

010102 >10
- 

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

% &  Konfiguracja warunkw owietlenia otoczenia


// Ta funkcja wykonuje wszystkie konieczne inicjalizacje kontekstu renderowania
// Tutaj ustala i inicjalizuje owietlenie sceny

$
8
// Wartoci wiata
// Jasne biae wiato
% 0
 67#8!10!10!10!109
-
% ';-?)*')-)// Usuwanie powierzchni ukrytych
-
% '= '<,-// Nie bdziemy prowadzi oblicze wntrza samolotu
<<@
% 'A// Wielokty z nawiniciem przeciwnym do ruchu wskazwek
zegara
// Owietlenie
-
% ' +%*)+%// Wczenie owietlenia
// Ustalamy, e model owietlenia bdzie stosowa wiato otoczenia
// zdefiniowane w tablicy ambientLight []
  
0:% ' +%*)' (;- ', &+-)
 
-
% '( ($' ,)-$+, // Wczenie ledzenia kolorw materiaw
// Waciwoci owietlenia otoczenia i rozproszenia
// bd ledzi wartoci podawane funkcji glColor
 
 % '<$()% ', &+-)',;';+<<=-
// liczny jasny bkit

10101 0!10
9

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.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

245

  #
Wynik dziaania
przykadowego
programu AMBIENT

  $
Wynik dziaania
przykadowego
programu AMBIENT
po przyciemnieniu
owietlenia

) (&$ &


Manipulacje wiatem otoczenia z pewnoci s uyteczne, ale w wikszoci aplikacji stawiajcych sobie za zadanie modelowanie wiata rzeczywistego konieczne jest zdefiniowanie
wicej ni tylko jednego rda wiata. Takie rda wiata, poza rnymi intensywnociami i kolorami, maj rwnie swoje pozycje i kierunki w przestrzeni. Rozmieszczenie takich wiate moe mie znaczcy wpyw na wygld naszej sceny.
Biblioteka OpenGL pozwala na obsug przynajmniej omiu niezalenych rde wiata
umieszczonych w dowolnych punktach na scenie albo poza przestrzeni widoczn. Moemy umieci rdo wiata w nieskoczonej odlegoci od sceny, tak eby jego promienie padajce na scen byy zawsze rwnolege albo umieci je bardzo blisko, tak eby
promieniowao we wszystkich kierunkach. Moliwe jest te zdefiniowanie wiata punktowego o dowolnych charakterystykach, ktre wiecio by wewntrz zadanego stoka.

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.

  


+
Linia prowadzona od wierzchoka w kierunku grnym, pod ktem prostym w stosunku do
pewnej wyimaginowanej powierzchni (lub naszego wielokta) nazywana jest wektorem
normalnym. Termin wektor normalny moe kojarzy si z rozmowami, jakie prowadz
midzy sob bohaterowie serialu StarTrek, ale oznacza on po prostu lini prostopad

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

Wektor jest wielkoci kierunkow informujc bibliotek OpenGL o kierunku, w jakim


ustawione s wierzchoki (lub wielokty). Poniszy fragment kodu pochodzi z naszego
przykadowego programu JET i przedstawia okrelanie wektora normalnego dla jednego
z trjktw.
&
 % ')$+,% -
0102!1010
/

01010>10
/

02! 101010
/

0! 101010
- 

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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.

  


W czasie gdy biblioteka OpenGL bdzie odprawia swoje czary, wszystkie wektory normalne musz zosta zamienione w normalne jednostkowe. Normalna jednostkowa jest
zwykym wektorem normalnym o dugoci . Normalna przedstawiona na rysunku 5.23 ma
dugo 5 jednostek. Dugo kadej normalnej mona uzyska, podnoszc do kwadratu
warto kadej wsprzdnej, sumujc wyniki, a nastpnie wycigajc z tej sumy pierwiastek kwadratowy. Jeeli teraz podzielimy kad skadow wektora normalnego przez t
dugo, to otrzymamy identycznie skierowany wektor, ale o dugoci rwnej . W tym
przypadku nasz nowy wektor normalny bdzie okrelany wsprzdnymi 1223. Proces
ten nazywany jest normalizacj. Tak wic dla potrzeb oblicze owietlenia, wszystkie
wektory normalne musza zosta znormalizowane. wietny argon!
Moemy nakaza bibliotece OpenGL wykonywanie normalizacji wszystkich wektorw
normalnych. Trzeba tylko wywoa funkcj *
 z parametrem !")'.$!+8*:
-
% '($ , +B-

Z t metod wi si jednak pewne spadki wydajnoci. Znacznie lepszym wyjciem


jest od razu wyliczy znormalizowany wektor normalny, ni zleca bibliotece OpenGL
wykonywanie tego zadania.
Trzeba zaznaczy, e wywoanie funkcji 9 rwnie bdzie wpywa na dugo
naszego wektora normalnego. Jeeli bdziemy jednoczenie stosowa funkcj 9 i mechanizmy owietlenia, to moemy uzyska rne niepodane efekty. Po zdefiniowaniu dla
jakiego obiektu wszystkich normalnych jednostkowych i w uyciu funkcji skalujcej ze
staym wspczynnikiem skalowania (skalowanie jest takie samo we wszystkich kierunkach),
to moemy zamiast parametru !")'.$!+8* zastosowa nowy (wprowadzony w wersji 1.2
biblioteki) parametr !".*$!*")'.$!. Parametr ten wczany jest prostym wywoaniem:

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:
%
/
@% )/
@% )/
@% )/
@
% )/
@


Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

// Konfiguracja i wczenie wiata numer 0


 0:% ' +%*)% ', &+-)
 
 0:% ' +%*)% ';+<<=- 00D


% &  Konfiguracja owietlenia i kontekstu renderowania w programie LITJET


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

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

Na koniec wiato !"!+ ,% zostaje wczone:


-
% ' +%*)

Pozycja wiata ustalana jest wewntrz kodu funkcji  = :


% 0 ?D67#82 10 10!10!109
111
111
 0:% ' +%*)% '?(+)+( ?D

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:

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

253

// Wczenie ledzenia kolorw


-
% '( ($' ,)-$+, 

// Waciwoci owietlenia otoczenia i rozproszenia


// bd ledzi wartoci podawane funkcji glColor
 
 % '<$()% ', &+-)',;';+<<=-

)
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

// Ustalenie koloru materiau


!"!"!"
&
 % ')$+,% -
0102!1010
0102!1010
/

01010>10
/

02! 101010
/

0! 101010
// Wierzchoki tego panelu
8
% )/
@:? D67#88! 1010109
810! 10109
81010>1099
// Wyliczenie wektora normalnego dla tego wielokta
%
/
@:? D67:? D6!7:? D67:
0::
/

0::? D67
/

0::? D6!7
/

0::? D67
9
8
% )/
@:? D67#881010>109
810! 10109
82! 10101099
%
/
@:? D67:? D6!7:? D67:
0::
/

0::? D67
/

0::? D6!7
/

0::? D67
9

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

Najbardziej oczywist metod poprawienia wydajnoci tego kodu jest wczeniejsze


wyliczenie wszystkich wektorw normalnych i pniejsze wykorzystanie ich w funkcji
$

@

. Zanim ktokolwiek zacznie dry ten temat, powinien najpierw przeczyta
w rozdziale 11., Wszystko o potokach szybkie przekazywanie geometrii informacje
o listach wywietlania i tablicach wierzchokw. Umoliwiaj one zapisywanie wyliczonych
wartoci nie tylko wektorw normalnych, ale rwnie danych wieloktw. Prosz pamita,
e te przykady byy wycznie demonstracj poj i z pewnoci nie stanowi
najefektywniejszego rozwizania.

*
$ 
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.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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
-
% ' +%*)+%

// Konfiguracja i wczenie wiata numer 0


 0:% ' +%*)% ', &+-)
 
 0:% ' +%*)% ';+<<=- 00D

 0:% ' +%*)% '?-= ,$D
@
-
% ' +%*)

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
@

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

( 
 

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

// 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
 
  % '<$()% '*++-!"

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

Pniej ju nie wywoujemy funkcji   z parametrem !"&*>!$., dlatego


wszystkie materiay bd miay takie same waciwoci dla wiata odbitego. Celowo
tworzymy ten przykad w taki sposb, poniewa chcemy, aby cay samolot sprawia wraenie, e zbudowany jest z bardzo byszczcych materiaw.
To, co zrobilimy w naszej funkcji konfigurujcej, jest niezwykle istotne. Spowodowalimy, e waciwoci odblaskowe materiaw dla wiata otoczenia i rozproszonego dla
wszystkich tworzonych w przyszoci wieloktw (do czasu a zmienimy to wywoaniem
funkcji   lub  ), bd zmieniay si razem ze zmianami kolorw tych wieloktw, a jednoczenie waciwoci tych samych materiaw dla wiata
odbitego bd niezmienne.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

// 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
 
  % '<$()% '*++-!"
// Jasnoniebieskie to

1010!10!10
9

&" 
+
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

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

259

  $
Typowa kula zbudowana
z czworoktw
i trjktw

podstawowe i bufory, do rysowania gadkich linii krzywych za pomoc wielu krtkich


linii prostych. Jeeli uznamy, e kady wierzchoek jest punktem na rzeczywistej powierzchni obiektu, to jego prawdziwym wektorem normalnym bdzie wektor normalny
powierzchni w tym punkcie.
W przypadku naszej kuli wektor normalny mgby by poprowadzony od rodka kuli na
zewntrz poprzez nasz punkt na powierzchni. Na rysunkach 5.30 i 5.31 przedstawimy t
ide dla prostych dwch wymiarw. Na rysunku 5.30 kada paska powierzchnia posiada
wasny, prostopady do niej, wektor normalny. T metod wykorzystalimy w podanym
wczeniej przykadzie programu LITJET, jednak ju na rysunku 5.31 mona zobaczy,
e kady wektor normalny nie jest prostopady do jakiejkolwiek linii przybliajcej wygld kuli, ale do rzeczywistej powierzchni kuli albo linii stycznej (ang. tangent line) do
tej powierzchni.
  '
Aproksymowanie
za pomoc normalnych
prostopadych
do kadej fasety

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

// Ustalenie pozycji rda wiata


 0:% ' +%*)% '?(+)+( ?D

W tablicy  &;<przechowywane s wartoci wsprzdnych x, y i z okrelajcych


aktualn pozycj rda wiata na scenie albo kierunek, z ktrego wiato pada na scen.
Ostatnia warto w tablicy, w tym przypadku , oznacza, e rdo wiata rzeczywicie

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

// Ta funkcja wykonuje wszystkie konieczne inicjalizacje kontekstu renderowania,


// a take konfiguruje i inicjalizuje owietlenie sceny

$
8
-
% ';-?)*')-)// Usuwanie powierzchni ukrytych
<<@
% 'A// Wielokty z nawiniciem przeciwnym do ruchu
wskazwek zegara
-
% '= '<,-// Nie bdziemy prowadzi oblicze wntrza samolotu
// Wczenie owietlenia
-
% ' +%*)+%
// Konfiguracja i wczenie wiata numer 0
// Musimy dostarczy nieco wiata otoczenia, eby w ogle
// zobaczy jakiekolwiek obiekty
  
0:% ' +%*)' (;- ', &+-)
 
// rdo wiata bdzie emitowa wycznie wiato rozproszone i odbite
 0:% ' +%*)% ';+<<=-
 
 0:% ' +%*)% '?-= ,$D
@
 0:% ' +%*)% '?(+)+( ?D

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

Ponisze linie kodu sprawiaj, e pozycjonowane rdo wiata zmienia si w reflektor:


// Ze rda wiata tworzymy reflektor
// Kt odcicia ma 60 stopni
 0% ' +%*)% '?()'=)(<<>10

Warto parametru !"&'%">%'## okrela kt mierzony od linii rodkowej stoka wiata,


do brzegu tego stoka. Dla normalnego wiata pozycjonowanego warto tego kta wynosi ?@, co oznacza, e nie jest ono ograniczane jakimkolwiek stokiem. Jednak ju dla
reflektorw warto ta wynosi od @ do 5@. Reflektory generuj wiato wycznie wewntrz zadanego stoka. Wszystko, co znajduje si poza nim, nie jest owietlane. Na rysunku 5.32 mona zobaczy, w jaki sposb podawany tu kt zamieniany jest na szeroko
stoka wiata.
  
Kty w stoku wiata
z refletora

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

Rysunek 5.34 przedstawia nasz przykadowy program w swojej konfiguracji pocztkowej,


przy czym reflektor owietlajcy kul zosta przesunity nieco w prawo (reflektor przesuwany jest klawiszami strzaek). Kula zbudowana jest z niewielkiej liczby pasko cieniowanych wieloktw. W systemie Windows prawym klawiszem myszy wywoujemy
menu kontekstowe (w komputerach Mac ten sam efekt uzyskujemy, przytrzymujc klawisz
Ctrl i klikajc mysz), z ktrego moemy wybra paski lub gadki model cieniowania,
a take trzy rne poziomy mozaikowoci modelu kuli. Listing 5.7 przedstawia peny
kod renderujcy scen w tym programie.
   
Przykadowy program
SPOT niska
mozaikowo,
paskie cieniowanie

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

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

265

// iTess = MODE_MEDIUM;


 

10  
// Wywietlenie obrazu
H&00
D
9

Wartoci zmiennych %  i  ustawiane s w funkcji obsugujcej menu. Zmienne te


kontroluj liczb wieloktw, z jakich skada si kula, a take stosowany model cieniowania. Prosz zauway, e rdo wiata umieszczane jest na scenie jeszcze przed
wykonaniem jakiejkolwiek operacji renderowania. Jak wspominalimy w rozdziale 2.,
biblioteka OpenGL jest interfejsem trybu natychmiastowego, dlatego, jeeli chcemy
owietli jakie obiekty na scenie, to rda wiata musimy umieci na niej jeszcze przed
narysowaniem owietlanych obiektw.
Na rysunku 5.34 widzielimy, e kula jest owietlona w niewyszukany sposb, a powierzchnie wszystkich wieloktw s wyranie widoczne. Wczenie trybu gadkiego
cieniowania nieco poprawia sytuacj, co wida na rysunku 5.35.

   Kula z gadkim cieniowaniem, ale niewystarczajc mozaikowoci

Jak pokazano na rysunku 5.36, podniesienie stopnia mozaikowoci pozwala na znacznie


lepsze odwzorowanie artefaktw w czasie przesuwania reflektora wok kuli. To wanie
te artefakty s jedn z wad modelu owietlenia stosowanego przez bibliotek OpenGL.
Tak naprawd, naleaoby powiedzie, e jest to wada modelu owietlenia opartego na

266

Cz I  Klasyka OpenGL

  ! Wybranie dokadniejszej siatki wieloktw oznacza lepsze efekty owietlenia
wierzchokw

wierzchokach (czyli niekoniecznie samej biblioteki OpenGL!). Wyliczajc wartoci jedynie


w wierzchokach, a pniej tworzc interpolacje pomidzy nimi na powierzchni wieloktw, otrzymujemy tylko zgrubne przyblienie rzeczywistego owietlenia. W wielu przypadkach takie rozwizanie jest wystarczajce, ale jak moglimy si przekona w programie
SPOT nie we wszystkich. Jeeli jednak zastosujemy model kuli o bardzo wysokiej
mozaikowoci i zaczniemy porusza wok niej reflektorem, to zauwaymy, e wada
tego modelu owietlenia zacznie znika.
Od czasu, gdy akceleratory grafiki wsppracujce z bibliotek OpenGL zaczy rwnie
przyspiesza dziaania przeksztace geometrycznych i efektw owietlenia, a procesory
bardzo zyskay na mocy obliczeniowej, moemy stosowa w naszych scenach obiekty
o znacznie wikszej mozaikowoci i uzyskiwa znacznie lepsze efekty wietlne.
Ostatni rzecz, o jakiej musimy wspomnie przy omawianiu programu SPOT, bdzie
mona zaobserwowa po wczeniu redniego stopnia mozaikowoci i paskiego cieniowania. Jak pokazano na rysunku 5.37, kada faseta kuli jest jednolicie owietlona. Kady
z wierzchokw ma ten sam kolor modulowany jedynie przez waciwoci owietlenia
i wektor normalny wielokta. W cieniowaniu paskim kady wielokt otrzymuje kolor
pobrany z ostatniego wierzchoka definiujcego ten wielokt. Nie nastpuje tu pynna
interpolacja pomidzy poszczeglnymi wierzchokami.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

267

  " Kula zoona z wielu wieloktw


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

Przy wykorzystaniu zaawansowanych manipulacji macierzowych, o ktrych mwilimy


ju wczeniej, obiekt rzucajcy cie sprasowywany jest na powierzchni na ktr ten cie
rzuca. Poniej postaramy si jak najbardziej uproci ten proces.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

D 67# 2: ?D675:?
-J 67

D 6F7#102: ?D675:?
-J 6!7

D 6"7#102: ?D675:?
-J 67

D 6!7#102: ?D675:?
-J 67
// Druga kolumna

D 6!7#102: ?D6!75:?
-J 67

D 6 7# 2: ?D6!75:?
-J 6!7

D 647#102: ?D6!75:?
-J 67

D 6!7#102: ?D6!75:?
-J 67

270

Cz I  Klasyka OpenGL
// Trzecia kolumna

D 67#102: ?D675:?
-J 67

D 6>7#102: ?D675:?
-J 6!7

D 6!7# 2: ?D675:?
-J 67

D 6!F7#102: ?D675:?
-J 67
// Czwarta kolumna

D 67#102: ?D675:?
-J 67

D 637#102: ?D675:?
-J 6!7

D 6!!7#102: ?D675:?
-J 67

D 6! 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

Listing 5.9 przedstawia metod tworzenia macierzy rzutowania wykorzystan w tym


przykadzie. Prosz zwrci uwag, e macierz tworzona jest jeden raz w funkcji  -.
i zapisywana w zmiennej globalnej.
% & $ Tworzenie macierzy rzutowania cienia
% 0 ?D67#823 10! 102 10109
111
111

// Macierz przeksztacenia rzucanych cieni


% )  D H 
111
111

// Ta funkcja wykonuje wszystkie konieczne inicjalizacje kontekstu renderowania,


// a take konfiguruje i inicjalizuje owietlenie sceny

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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

// Kod konfigurujcy owietlenie itd.


111
// To jasnoniebieskie

1010!10!10
// Wyliczenie macierzy rzutowania stosowanej do generowania cieni
 I
 H   D ?DD H 
9

Na listingu 5.10 przedstawiono kod renderujcy stosowany w przykadowym programie


generowania cieni. Na pocztku rysowane jest podoe, a nastpnie normalnie rysujemy
samolot, tak jak we wszystkich pozostaych przykadach. Na koniec odtwarzamy macierz
model-widok, mnoymy j przez macierz cieni i tworzymy w ten sposb nasz macierz
prasujc. Teraz trzeba jeszcze raz narysowa samolot (kod zosta zmodyfikowany tak,
eby funkcja /BC raz rysowaa w normalnych kolorach, a raz tylko w czerni). Po
ponownym odtworzeniu macierzy model-widok rysujemy niewielk t kul ustawion
mniej wicej w miejscu rda wiata. Prosz zauway, e przed rysowaniem cienia
samolotu wyczylimy mechanizm testowania gbi.
% & ' Renderowanie samolotu i jego cienia
// Wywoywana w celu przerysowania sceny
$

@


8
// Czyszczenie okna aktualnym kolorem czyszczcym

% '( ($'&=<<-$'&+)E% ';-?)*'&=<<-$'&+)
// Rysowanie podoa. Rcznie wykonujemy cieniowanie podoa,
// stosujc coraz ciemniejsze odcienie zielonego,
// otrzymujc w ten sposb iluzj gbi
&
 % 'L=,;

/

0F102! 10210
/

02F102! 10210
 
/

02F102! 1010
/

0F102! 1010
- 

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!

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

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 peni owietlony wiat kul rzucajcych cienie

 ( 
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:

Ustala aktualny kolor w trybie RGBA.

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 
 !
F 3D
 1 
 ! 
 F 3D
1 
 ! F 3D
1 
 ! F 3D
1 
 ! F 3D

1 
 !
F 3D
1 
 ! F 3D
1 
 ! F 3D
E
1 
 !
F 3D
E 1 
 ! 
 F 3D
E1 
 ! F 3D
E1 
 ! F 3D
E1 
 ! F 3D

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

275

E
1 
 !
F 3D
E1 
 ! F 3D
E1 
 ! F 3D

Opis:

Funkcja ustala aktualny kolor, pozwalajc poda osobno skadowe czerwon,


zielon i niebiesk. Funkcja umoliwia te podanie wartoci kanau alfa.
Kada skadowa reprezentowana jest liczb z zakresu od zera () do penej
intensywnoci koloru (). Funkcje posiadajce w nazwie przyrostek v
pobieraj wskanik na tablic przechowujc wszystkie skadowe koloru.
Wszystkie elementy takiej tablicy musz by tego samego typu. Jeeli
skadowa alfa nie zostanie sprecyzowana, to nadawana jest jej domylna
warto . W funkcjach przyjmujcych wartoci niezmiennoprzecinkowe,
wartoci z zakresu od zera do maksymalnej wartoci dopuszczalnej w danym
typie przeksztacane s w wartoci zmiennoprzecinkowe z zakresu od 
do .

Parametry:





F

Skadowa czerwona koloru.


Skadowa zielona koloru.
Skadowa niebieska koloru.
Skadowa kanau alfa koloru. Parametr ten stosowany jest wycznie
w wersjach funkcji pobierajcych cztery parametry.
Wskanik na tablic przechowujc wartoci skadowych czerwonej,
zielonej, niebieskiej i alfa.

Warto zwracana: Brak


Zobacz te:

 ,  


Zastosowanie:

Wcza i wycza moliwo modyfikowania skadowych koloru znajdujcych


si w buforze koloru.

Plik nagwkowy:



Skadnia:
A1 !
  2 !
 2 !
 2 !
 
3D

Opis:

Funkcja umoliwia wczanie i wyczanie pozwolenia na modyfikowanie


poszczeglnych skadowych koloru znajdujcego si w buforze koloru
(domylnie mona modyfikowa wszystkie skadowe). Na przykad nadanie
parametrowi 
wartoci !"#$!* spowoduje, e w buforze koloru
nie bdzie moliwe modyfikowanie kanau alfa.

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.

Warto zwracana: Brak


Zobacz te:



  
Zastosowanie:

Pozwala na ustalanie waciwoci materiaw wieloktw zgodnie z kolorami


nadanymi mu funkcj .

Plik nagwkowy:



Skadnia:
 1 ! 7 2 ! 73D

Opis:

Funkcja pozwala na ustalenie waciwoci materiaw bez koniecznoci


wywoywania funkcji  . Za pomoc tej funkcji moemy sprawi,
e waciwoci materiaw bd dostosowyway si do kolorw definiowanych
funkcj . Domylnie mechanizm ledzenia kolorw jest wyczony.
Mona go wczy, wywoujc funkcj *
 1 !"'!'."$%*.+$!3,
a nastpnie ponownie wyczy funkcj /
 1 !"'!'."$%*.+$!3.

Parametry:
 



! 7 okrela, czy mechanizm ledzenia kolorw bdzie dotyczy


przednich ( !"#.')%), tylnych ( !"0$4) lub obu ( !"#.')%"$)/"0$4)
stron wieloktw.
! 7 definiuje, ktra z waciwoci materiau ma by modyfikowana
zgodnie z aktualnym kolorem. Mona tu poda wartoci !"*++'),
!"$0+*)%, !"/+##>*, !"&*>!$. albo !"$0+*)%"$)/"/+##>*.

Warto zwracana: Brak


Zobacz te:

,  , ! , !  

  
Zastosowanie:

Zwraca informacje o aktualnych parametrach rda wiata.

Plik nagwkowy:



Rodzaje:
 ! 1 ! 7 2 ! 7
 2 ! F
 3D
 ! 1 ! 7 2 ! 7
 2 ! F
 3D

Opis:

Tej funkcji mona uywa do sprawdzania aktualnych wartoci ustawie


jednego z omiu obsugiwanych przez bibliotek rde wiata. Wartoci
zwracane s pod adresem wskazywanym przez parametr
 . W wikszoci
przypadkw zwracana jest tablica czterech wartoci opisujcych skadowe
RGBA danego parametru.

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

277

Parametry:
 

 

 

! 7 okrela rdo wiata, ktrego dotycz dane informacje. Mog


to by wartoci z zakresu od  do !"$G"!+ ,% (specyfikacja biblioteki
wymaga obsugiwania minimum omiu wiate). Wartoci stae wyliczane
s od !"!+ ,% do !"!+ ,%H.
! 7 okrela odpytywan waciwo rda wiata. Moliwe jest
podanie jednej z poniszych wartoci: !"$0+*)%, !"/+##>*, !"&*>!$.,
!"&'+%+'), !"&'%"/+.*%+'), !"&'%"*G&')*)%, !"&'%">%'##,
!"')%$)%"$%%*)>$%+'), !"!+)*$."$%%*)>$%+') lub
!"I>$/.$%+"$%%*)>$%+').
! F lub ! F krela tablic wartoci cakowitych lub
zmiennoprzecinkowych, do ktrej zapisane bd wartoci zwracane.
Do tablicy zapisywane mog by dane w postaci tablicy trj- lub
czteroelementowej, a take w postaci pojedynczej wartoci. W tabeli 5.2
podano rodzaje wartoci zwracanych dla kadej waciwoci.

( )  Prawidowe wartoci parametrw owietlenia dla funkcji glGetLight


012+2

,  + 2 + 

% ', &+-)

Cztery skadowe RGBA

% ';+<<=-

Cztery skadowe RGBA

% '?-= ,$

Cztery skadowe RGBA

% '?(+)+(

Cztery elementy okrelajce pozycj rda wiata. Pierwsze trzy wartoci


definiuj pozycj rda wiata. Jeeli czwartemu elementowi nadana zostanie
warto !1, oznacza to, e wiato rzeczywicie znajduje si na podanej
pozycji. Jeeli jednak czwartemu elementowi nadana zostanie warto 1,
to rdo wiata jest rdem kierunkowym, a wszystkie jego promienie
padaj rwnolegle z kierunku zdefiniowanego przez pierwsze trzy wartoci

% '?()';+$-)+(

Trzy elementy okrelajce kierunek reflektora. Wektor musi by


znormalizowany i definiowany we wsprzdnych oka

% '?()'-N?(-)

Pojedyncza warto reprezentujca wykadnik reflektora

% '?()'=)(<<

Pojedyncza warto reprezentujca kt odcicia reflektora

% '(),)',))-=,)+(

Pojedyncza warto reprezentujca sta tumienia wiata

% ' +-,$',))-=,)+(

Pojedyncza warto reprezentujca liniowe tumienie wiata

% 'L=,;$,)+',))-=,)+(

Pojedyncza warto reprezentujca kwadratowe tumienie wiata

Warto zwracana: Brak


Zobacz te:

!

   
Zastosowanie:

Zwraca aktualne ustawienia waciwoci materiau.

Plik nagwkowy:



278

Cz I  Klasyka OpenGL

Rodzaje:
  1 ! 7 2 ! 7
 2 ! F
 3D
  1 ! 7 2 ! 7
 2 ! F
 3D

Opis:

Funkcja pozwala na sprawdzenie waciwoci materiau przedniej lub tylnej


strony wielokta. Wartoci zwracane zapisywane s pod adresem pamici
wskazywanym przez parametr
 . W wikszoci przypadkw zwracana
jest tablica czterech wartoci RGBA opisujcych dan waciwo.

Parametry:
 

 

 

! 7 okrela, czy sprawdzane s wartoci waciwoci przednich


( !"#.')%) lub tylnych ( !"0$4) stron wieloktw.
! 7 definiuje, ktra z waciwoci materiau jest sprawdzana. Mona
tu poda wartoci !"$0+*)%, !"/+##>*, !"&*>!$., !"*++'),
!",+)+)* albo !"'!'."+)/*G*.
! F lub ! F skazuje na tablic wartoci cakowitych lub
zmiennoprzecinkowych, do ktrej bd zapisywane wartoci zwracane.
W przypadku zapytania o waciwoci !"$0+*)%, !"/+##>*, !"&*>!$.
i !"*++') zwracana jest czteroelementowa tablica zawierajca wartoci
RGBA opisujce waciwo. Dla zapytania o waciwo !",+)+)*
zwracana jest pojedyncza warto opisujca wykadnik odblasku materiau.
Przy zapytaniu o waciwo !"'!'."+)/*G* zwracana jest tablica
trjelementowa opisujca skadowe wiata otoczenia, rozproszonego i obitego,
zapisane w postaci indeksw kolorw. Parametr !"'!'."+)/*G* stosowany
jest wycznie wtedy, gdy stosowane jest owietlenie kolorami indeksowanymi.

Warto zwracana: Brak


Zobacz te:

 

 
Zastosowanie:

Ustala parametry jednego z dostpnych rde wiata.

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:

Funkcja uywana jest do ustalania parametrw jednego z omiu obsugiwanych


rde wiata. Dwie pierwsze wersje funkcji pobieraj tylko jeden parametr
i pozwalaj na ustawienie wartoci nastpujcych waciwoci:
!"&'%"*G&')*)%, !"&'%">%'##, !"')%$)%"$%%*)>$%+'),
!"!+)*$."$%%*)>$%+') i !"I>$/.$%+"$%%*)>$%+'). Dwie pozostae wersje
funkcji stosowane s do ustalania waciwoci opisywanych tablic kilku
wartoci. Takimi waciwociami s !"$0+*)%, !"/+##>*, !"&*>!$.,

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

279

!"&'+%+') i !"&'%"/+.*%+'). Tablicowych wersji funkcji ! mona


uywa te do ustalania wartoci waciwoci opisywanych pojedyncz
wartoci; wystarczy w tablicy F
  umieci tylko jeden parametr.

Parametry:
 

 

 

 

! 7: Okrela numer rda wiata poddawanego modyfikacjom. Mona


podawa tu wartoci od  do !"$G"!+ ,% (przynajmniej 8). Zdefiniowane
s stae wartoci wyliczeniowe od !"!+ ,% do !"!+ ,%H.
! 7 okrela parametr owietlenia ustawiany w danym wywoaniu
funkcji. W tabeli 5.2 podana zostaa pena lista parametrw wraz z ich
znaczeniami.
! lub ! podaje warto dla parametru owietlenia definiowanego
pojedyncz wartoci. Takimi parametrami s !"&'%"*G&')*)%,
!"&'%">%'##, !"')%$)%"$%%*)>$%+'), !"!+)*$."$%%*)>$%+')
i !"I>$/.$%+"$%%*)>$%+'). Parametry te maj znaczenie tylko
przy definiowaniu reflektorw.
! F lub ! F okrela tablic zawierajc wartoci cakowicie
opisujce ustawiany parametr. W tabeli 5.2 mona znale pen list
takich parametrw wraz z ich znaczeniami.

Warto zwracana: Brak


Zobacz te:

 !

  
Zastosowanie:

Ustala parametry modelu owietlenia stosowanego przez bibliotek OpenGL.

Plik nagwkowy:



Rodzaje:
!  1 ! 7
 2 ! 
 3D
!  1 ! 7
 2 ! 
 3D
!  1 ! 7
 2 
 ! F
 3D
!  1 ! 7
 2 
 ! F
 3D

Opis:

T funkcj stosuje si do ustalania parametrw modelu owietlenia


stosowanego przez bibliotek OpenGL. Moliwe jest ustalenie wartoci
dowolnego z czterech parametrw modelu. Parametr !"!+ ,%"'/*!"$0+*)%
stosowany jest do ustalania domylnego owietlenia otoczenia. Domylnie,
parametr ten ma przypisan warto RGBA 12223.
Do ustawiania tego parametru stosowane mog by tylko dwie ostatnie
wersje tej funkcji, poniewa pobieraj one wskanik na tablic opisujc
wszystkie wartoci RGBA.
Parametr !"!+ ,%"'/*!"%J'"+/* pozwala okreli, czy owietlane bd
obie strony wieloktw. Domylnie owietlane s wycznie przednie strony
wieloktw, przy czym w czasie wyliczania owietlenia stosowane s
waciwoci materiaw zdefiniowane funkcj  . Okrelenie

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:

 

 

 

! 7 okrela modyfikowany parametr owietlenia. Przyjmowane s


wartoci !"!+ ,%"'/*!"$0+*)%, !"!+ ,%"'/*!"!'$!":+*J*.,
!"!+ ,%"'/*!"%J'"+/*, !"!+ ,%"'/*!"'!'."')%.'!.
! lub ! dla parametru !"!+ ,%"'/*!"!'$!":+*J*. warto
 oznacza, e kty padania wiata odbitego musz bra pod uwag kierunek
patrzenia obserwatora rwnolegy do ujemnych wartoci osi z. Kada inna
warto oznacza, e obserwator znajduje si w pocztku ukadu wsprzdnych
oka. Dla parametru !"!+ ,%"'/*!"%J'"+/* warto  oznacza,
e wyliczane bdzie owietlenie wycznie przednich stron wieloktw.
Kada inna warto oznacza, e obliczenia prowadzone bd dla przednich
i tylnych stron wieloktw. Parametr ten nie ma adnego wpywu na punkty,
linie i bitmapy. Dla parametru !"!+ ,%"'/*!"'!'."')%.'! mona poda
wartoci !"*&$.$%*"&*>!$."'!'. lub !"+) !*"'!'..
! F lub ! F dla parametrw !"!+ ,%"'/*!"$0+*)% lub
!"!+ ,%"'/*!"!'$!":+*J*., poda naley wskanik na tablic wartoci
cakowitych lub zmiennoprzecinkowych. Z podanej tablicy wykorzystana
bdzie tylko pierwsza warto. W przypadku parametru !"!+ ,%"'/*!"$0+*)%
z tablicy pobierane s cztery wartoci opisujce skadowe RGBA wiata
otoczenia.

Warto zwracana: Brak


Zobacz te:

! ,  

  
Zastosowanie:

Ustala waciwoci materiau stosowane w modelu owietlenia.

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:

Tej funkcji uywa si do ustalenia parametrw odblaskowych materiau


pokrywajcego wielokty. Waciwoci !"$0+*)%, !"/+##>* i !"&*>!$.
okrelaj sposb, w jaki materia odbija padajce na niego wiato. Waciwo
!"*++') stosowana jest dla materiaw sprawiajcych wraenie emitowania
wasnego wiata. Warto przypisywana waciwoci !",+)+)* musi

Rozdzia 5.  Kolor, materiay i owietlenie. Podstawy

281

znajdowa si w zakresie od  do ?, przy czym wysze wartoci tworz


wiksze efekty rozbyskw na powierzchni materiau. Waciwo
!"'!'."+)/*G* stosowana jest do ustalania waciwoci odblaskowych
materiaw w trybie kolorw indeksowanych.
Parametry:
 

 

 

 

! 7 okrela, czy waciwoci materiaw bd ustalane dla przednich


( !"#.')%), tylnych ( !"0$4) czy te obu ( !"#.')%"$)/"0$4) stron
wieloktw.
! 7 w pierwszych dwch wersjach funkcji okrela poddawan
modyfikacjom waciwo przyjmujc pojedyncz warto. Aktualnie
jedyn tego rodzaju waciwoci jest !",+)+)*. Pozostae dwie wersje
funkcji przyjmuj te tablice wartoci przypisywanych waciwociom.
Za ich pomoc mona modyfikowa waciwoci !"$0+*)%, !"/+##>*,
!"&*>!$., !"*++'), !",+)+)*, !"$0+*)%"$)/"/+##>*
oraz !"'!'."+)/*G*.
! lub ! krela warto przypisywan do waciwoci zdefiniowanej
parametrem
  (aktualnie tylko !",+)+)*).
! F lub ! F krela tablic wartoci cakowitych lub
zmiennoprzecinkowych zawierajc wartoci przypisywane ustawianej
waciwoci.

Warto zwracana: Brak


Zobacz te:

  ,  , ! , !  


Zastosowanie:

Definiuje normaln dla nastpnego definiowanego wierzchoka lub zbioru


wierzchokw.

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 
 !
F 3D
)7 1 
 ! 
 F 3D
)71 
 ! F 3D
)71 
 ! F 3D
)71 
 ! F 3D

Opis:

Wektor normalny okrela kierunek prostopady do grnej powierzchni


wielokta. Funkcja stosowana jest w obliczeniach zwizanych z owietleniem
i cieniowaniem. Podanie wektora jednostkowego (o dugoci 1) bardzo

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:




Okrela warto x w wektorze normalnym.


Okrela warto y w wektorze normalnym.
Okrela warto z w wektorze normalnym.
Okrela tablic trjelementow zawierajc wartoci x, y i z wektora
normalnego.

Warto zwracana: Brak


Zobacz te:

%  2:  

 
Zastosowanie:

Ustala, czy stosowany bdzie model cieniowania paskiego czy te gadkiego.

Plik nagwkowy:



Skadnia:
  1 ! 73D

Opis:

Obiekty podstawowe biblioteki OpenGL zawsze s cieniowane, jednak


model cieniowania moe by paski ( !"#!$%) lub gadki ( !"''%,).
W najprostszym scenariuszu przed narysowaniem wielokta jego kolor
musi zosta zdefiniowany wywoaniem funkcji . Taki obiekt
podstawowy zawsze wypeniany jest kolorem jednolitym, niezalenie od
modelu cieniowania. Jeeli dla kadego wierzchoka zdefiniowany zostanie
inny kolor, to rysunek takiego wielokta bdzie wyglda inaczej w kadym
modelu cieniowania. W cieniowaniu gadkim wntrze wielokta wypeniane
jest interpolacj kolorw wszystkich jego wierzchokw. Oznacza to,
e kolor powierzchni wielokta bdzie zmienia si na odcinku czcym
dwa wierzchoki. W czasie interpolowania, kolory pobierane bd
z szecianu kolorw z odcinka czcego punkty odpowiadajce kolorom
dwch wierzchokw. Jeeli wczone bdzie te owietlenie, biblioteka
OpenGL wykonywa bdzie dodatkowe obliczenia majce na celu ustalenie
waciwej wartoci koloru kadego wierzchoka. W cieniowaniu paskim
kolor nadany ostatniemu wierzchokowi stosowany jest do wypenienia
caego obiektu podstawowego. Jedynym wyjtkiem od tej zasady s obiekty
podstawowe !"&'!( '), ktre wypeniane s kolorem pierwszego wierzchoka.

Parametry:


! 7 okrela stosowany model cieniowania. Mona poda tu wartoci


!"#!$% (cieniowanie paskie) lub !"''%, (cieniowanie gadkie). Domylnie

stosowane jest cieniowanie gadkie.


Warto zwracana: Brak
Zobacz te:

, ! , !  

You might also like