OPEN_GL LABORATORIUM 6 tekst na podstawie: Edwarda Angela oraz Łukasza Grabca
Łyk teorii Owietlenie w znaczcy sposób wpływa na realizm naszej sceny. Stopie odbicia wiatła od obiektu, zaley od materiału, z jakiego jest wykonany. Obiekty widziane jako połyskujce, odbijaj wikszo wiatła. Natomiast obiekty, które pochłaniaj znaczn cz wiatła lub odbijaj e nie trafia ono do obserwatora, odbierane s jako ciemniejsze. Specyfikacja OpenGL mówi, i kada implementacja tej biblioteki musi zapewnia co najmniej osiem rónych ródeł wiatła. Model owietlenia zaprogramowany w OpenGL jest podzielony na trzy niezalene moduły: moduł wiatła otaczajcego, rozproszonego oraz zwierciadlanego. wiatło otaczajce (Ambient Light) nie owietla obiektu z konkretnego kierunku, chocia oczywicie ma swoje ródło. Jest to wiatło na tyle rozproszone w rodowisku, i wyznaczenie kierunku, z którego nadciga jest niemoliwe, dlatego wydaje si nam, i wieci z kadego miejsca. Na przykład cz wiatła pochodzcego z arówki wiszcej nad nasz głow w nieduym pomieszczeniu odbija si wiele razy od cian, okna, mebli itp. To jest włanie wiatło otaczajce, gdy rozprasza si na tyle mocno, i zatraca swoje ródło. Z drugiej strony wyobramy sobie ciemny pokój z uchylonymi drzwiami, za którymi jest jasne wiatło. Na podłodze rysuje si jasny pas, ale do oka obserwatora trafia ju niewiele wiatła. Oznacza to, e mamy do czynienia ze wiatłem kierunkowym, które ma bardzo mały współczynnik ambient. W OpenGL moemy równie zdefiniowa owietlenie otaczajce dla całej sceny, które jest niezalene od pozostałych ródeł wiatła. Dziki temu nie musimy włcza całego modułu owietleniowego, aby obiekty na scenie były widoczne. wiatło rozproszone (Diffuse Light) charakteryzuje si tym, e jego promienie biegn z konkretnego kierunku i odbijaj si równomiernie w kad stron od owietlanej powierzchni. Intensywno owietlenia obiektu zaley od kta padania promieni - im jest on mniejszy (wzgldem wektora normalnego prostopadłego do powierzchni), tym obiekt jest janiejszy. 2
Na przykład, jeli takie wiatło pada pod ktem bliskim dziewidziesiciu stopni, to jasno obiektu jest minimalna. Praktycznie kade wiatło pochodzce z konkretnego kierunku ma okrelony współczynnik diffuse. wiatło zwierciadlane (Specular Light), podobnie jak rozproszone, biegnie z konkretnego miejsca, ale w przeciwiestwie do niego odbija si od owietlanej powierzchni tylko w jednym kierunku. Kt padania jest równy ktowi odbicia. Jasno wiatła zaley od kta midzy obserwatorem, a odbitymi promieniami. Jeli jest on bliski zeru, to znaczy, e promienie odbite od powierzchni padaj wprost na obserwatora. Na owietlanym obiekcie wyranie wida wtedy jasn plam, której intensywno zaley od materiału, którym jest pokryty nasz obiekt, np. złota wypolerowana kula daje wyrane refleksy wietlne, podczas gdy drewno choby nie wiem jak owietlane, zawsze bdzie matowe. Intensywno kadego z tych wiateł jest opisywana przez cztery komponenty RGBA, których wartoci s z zakresu [0..1]. Na przykład wyobramy sobie celownik laserowy emitujcy czerwone wiatło. Celujcy widzi czerwon plamk przesuwajc si po ciele ofiary oraz ledwo zauwaalny promie. Intensywno tego promienia zaley od współczynnika wiatła rozproszonego, intensywno plamki od wiatła zwierciadlanego, natomiast jej wielko od współczynnika wiatła otaczajcego. W tym przypadku mogłoby to by odpowiednio (0.10, 0.0, 0.0, 1.0), (0.95, 0.0, 0.0, 1.0) oraz (0.05, 0.0, 0.0, 1.0). W OpenGL kady materiał pokrywajcy definiowany przez nas obiekt ma okrelone właciwoci odbicia wiatła otaczajcego, rozproszonego i zwierciadlanego. Barwa obiektu widzianego przez obserwatora zaley od rodzaju wiatła padajcego na obiekt i materiału, z jakiego jest wykonany. Jeli mamy idealnie niebiesk kul i umiecimy j w białym wietle, to pochłonie ona wiatło czerwone i zielone, a odbije niebieskie. Jeli jednak t sam kul umiecimy w wietle czerwonym, to kula bdzie czarna, gdy całe czerwone wiatło zostanie zaabsorbowane i nic nie zostanie odbite. Podobnie jak wiatło, materiał równie moemy 3
opisa za pomoc współczynników ambient, diffuse i specular, które w tym wypadku oznaczaj procentow zdolno materiału do absorbowania i odbijania wiatła. W OpenGL mamy trzy podstawowe rodzaje wiatła: punktowe, kierunkowe oraz reflektorowe. Ze wiatłem kierunkowym mamy do czynienia wtedy, gdy współrzdna w połoeniu ródła wiatła jest równa zero (w OpenGL kady punkt moemy definiowa za pomoc czterech współrzdnych (x,y,z,w)). Takie wiatło nazywamy kierunkowym, gdy znajduje si w nieskoczonoci, jego promienie s do siebie równoległe, a ich kierunek okrelaj współrzdne (x,y,z). Przykładem wiatła kierunkowego jest Słoce. Jeli współrzdna w jest równa jeden, to mamy do czynienia ze wiatłem punktowym. Dodatkowo dla kadego takiego ródła mamy moliwo zdefiniowania czynnika powodujcego tłumienie intensywnoci wiecenia zalenie od odległoci do obiektu. Dla dowolnego wiatła punktowego mamy moliwo ograniczenia przestrzeni rozchodzenia si wiatła poprzez zdefiniowanie stoka widzenia. W ten sposób utworzymy wiatło reflektorowe (takie wiatło daje np. latarka). wiatła w OpenGL: * wiatło otoczenia (ambientlight[]) * wiatło rozproszone (diffuselight[]) * wiatło odbicia (specularlight[]) * wiatło emisji (emissionlight[]) W celu dodania owietlenia do tworzonej sceny naley wykona cztery polecenia: * naley wyznaczy wektory normalnych w kadym wierzchołku kadego obiektu, pozwol one ustali orientacje obiektów wzgldem ródła wiatła. * naley utworzy, wybra i umieci ródła wiatła * naley wybra i umieci model owietlenia. Model ten definiuje wiatło otoczenia oraz połoenie obserwatora, dla którego wyznaczane jest owietlenie. * naley zdefiniowa właciwoci materiałów obiektów znajdujcych si na scenie. W funkcji inicjalizujcej powinnimy aktywowa owietlenie za pomoc funkcji glenable(gl_lighting) informuje ona OpenGL e bd przeprowadzane obliczenia zwiazane z obliczaniem owietlenia obiektów. W celu okrelenia właciwoci materiału naley uy funkcji glmaterialfv( ), okrela ona sposób odbicia wiatła otoczenia i wiatła rozproszenia przez przedni cian wielokta. W celu okrelenia właciwoci ródeł wiatła naley uy funkcji gllightfv( ). Na kocu inicjalizacji wyłaczamy ródło wiatła przekazujc odpowiedni warto GL_LIGHTX funkcji glenable( ). W funkcji rysujcej naley dopisa funkcj definiujc normaln do kadej ze cian figury. Dla ródła wiatła mona zdefiniowa szereg właciwoci (kolor, połoenie, czy kierunek): void gllightfv(glenum light, GLenum pname, TYPE *param); Właciwoci ródła wiatła: * GL_AMBIENT (Intensywno wiatła otoczenia) 4
* GL_DIFFUSE (Intensywno wiatła rozproszonego) * GL_SPECULAR (Intensywno wiatła odbicia) * GL_POSITION (Pozycja ródła wiatła) * GL_SPOT_DIRECTION (Wektor kierunku strumienia wiatła) * GL_SPOT_EXPONENT (Koncentracja strumienia wiatła) * GL_SPOT_CUTOFF (Kt rozwarcia strumienia wiatła) * GL_CONSTANT_ATTENUATION (Stała warto tłumienia, jako warto domylna ustawione jest 1.0) * GL_LINERAL_ATTENUATION (Liniowa warto tłumienia, jako warto domylna ustawione jest 0.0) * GL_QUADRATIC_ATTENUATION (Kwadratowa warto tłumienia, jako warto domylna ustawione jest 0.0) Właciwoci materiałów: * GL_AMBIENT (Kolor przy owietleniu wiatłem otoczenia) * GL_DIFFUSE (Kolor przy owietleniu wiatłem rozproszonym) * GL_AMBIENT_AND_DIFFUSE (Kolor przy owietleniu wiatłem otoczenia i rozproszonym) * GL_SPECULAR (Kolor przy owietleniu wiatłem odbicia) * GL_SHININESS (Współczynnik odbicia) * GL_EMISSION (Kolor wiatła emisji) Właciwoci modelu owietlenia: * GL_LIGHT_MODEL_AMBIENT (Intensywno wiatła otaczajcego sceny w modelu RGBA, domylnie warto 0.2,0.2,0.2,1.0) * GL_LIGHT_MODEL_LOCAL_VIEWER (Obserwator lokalny lub w nieskoczonoci; domylnie warto GL_FALSE (owietlenie jednostronne)) * GL_LIGHT_MODEL_TWO_SIDE (Owietlenie jedno lub dwu stronne; domylnie GL_FALSE (owietlenie jednostronne) * GL_LIGHT_MODEL_COLOR_CONTROL (Oddzielne traktowanie koloru w wietle odbicia od kolorów w wietle otoczenia i wietle rozproszonym; domylnie warto GL_SINGLE_COLOR (łczne traktowanie) Przykład: const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f }; const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; 5
glenable(gl_light0); glenable(gl_lighting); gllightfv(gl_light0, GL_AMBIENT, light_ambient); gllightfv(gl_light0, GL_DIFFUSE, light_diffuse); gllightfv(gl_light0, GL_SPECULAR, light_specular); gllightfv(gl_light0, GL_POSITION, light_position); glmaterialfv(gl_front, GL_AMBIENT, mat_ambient); glmaterialfv(gl_front, GL_DIFFUSE, mat_diffuse); glmaterialfv(gl_front, GL_SPECULAR, mat_specular); glmaterialfv(gl_front, GL_SHININESS, high_shininess); Zadania do wykonania: Prosz o narysowanie sfery oraz dodanie do sceny trzech wiateł: czerwonego typu specular, niebieskiego typu diffuse (wiatła te bd kry wokół naszego szecianu) oraz wiatła typu ambient (którego kolor bdzie mona zmienia za pomoc klawiszy). 6