OPEN_GL LABORATORIUM 6
Transkrypt
OPEN_GL LABORATORIUM 6
OPEN_GL LABORATORIUM 6 tekst na podstawie: Edwarda Angela oraz Łukasza Grabca Łyk teorii O wietlenie w znacz cy sposób wpływa na realizm naszej sceny. Stopie odbicia wiatła od obiektu, zale y od materiału, z jakiego jest wykonany. Obiekty widziane jako połyskuj ce, odbijaj wi kszo 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 ka da implementacja tej biblioteki musi zapewnia co najmniej osiem ró nych ródeł wiatła. Model o wietlenia zaprogramowany w OpenGL jest podzielony na trzy niezale ne moduły: moduł wiatła otaczaj cego, rozproszonego oraz zwierciadlanego. wiatło otaczaj ce (Ambient Light) nie o wietla obiektu z konkretnego kierunku, chocia oczywi cie ma swoje ródło. Jest to wiatło na tyle rozproszone w rodowisku, i wyznaczenie kierunku, z którego nadci ga jest niemo liwe, dlatego wydaje si nam, i wieci z ka dego miejsca. Na przykład cz wiatła pochodz cego z arówki wisz cej nad nasz głow w niedu ym pomieszczeniu odbija si wiele razy od cian, okna, mebli itp. To jest wła nie wiatło otaczaj ce, gdy rozprasza si na tyle mocno, i zatraca swoje ródło. Z drugiej strony wyobra my 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 mo emy równie zdefiniowa o wietlenie otaczaj ce dla całej sceny, które jest niezale ne od pozostałych ródeł wiatła. Dzi ki temu nie musimy wł cza całego modułu o wietleniowego, 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 ka d stron od o wietlanej powierzchni. Intensywno o wietlenia obiektu zale y od k ta padania promieni - im jest on mniejszy (wzgl dem wektora normalnego prostopadłego do powierzchni), tym obiekt jest ja niejszy. 2 Na przykład, je li takie wiatło pada pod k tem bliskim dziewi dziesi ciu stopni, to jasno obiektu jest minimalna. Praktycznie ka de wiatło pochodz ce z konkretnego kierunku ma okre lony współczynnik diffuse. wiatło zwierciadlane (Specular Light), podobnie jak rozproszone, biegnie z konkretnego miejsca, ale w przeciwie stwie do niego odbija si od o wietlanej powierzchni tylko w jednym kierunku. K t padania jest równy k towi odbicia. Jasno wiatła zale y od k ta mi dzy obserwatorem, a odbitymi promieniami. Je li jest on bliski zeru, to znaczy, e promienie odbite od powierzchni padaj wprost na obserwatora. Na o wietlanym obiekcie wyra nie wida wtedy jasn plam , której intensywno zale y od materiału, którym jest pokryty nasz obiekt, np. złota wypolerowana kula daje wyra ne refleksy wietlne, podczas gdy drewno cho by nie wiem jak o wietlane, zawsze b dzie matowe. Intensywno ka dego z tych wiateł jest opisywana przez cztery komponenty RGBA, których warto ci s z zakresu [0..1]. Na przykład wyobra my sobie celownik laserowy emituj cy czerwone wiatło. Celuj cy widzi czerwon plamk przesuwaj c si po ciele ofiary oraz ledwo zauwa alny promie . Intensywno tego promienia zale y od współczynnika wiatła rozproszonego, intensywno plamki od wiatła zwierciadlanego, natomiast jej wielko od współczynnika wiatła otaczaj cego. 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 ka dy materiał pokrywaj cy definiowany przez nas obiekt ma okre lone wła ciwo ci odbicia wiatła otaczaj cego, rozproszonego i zwierciadlanego. Barwa obiektu widzianego przez obserwatora zale y od rodzaju wiatła padaj cego na obiekt i materiału, z jakiego jest wykonany. Je li mamy idealnie niebiesk kul i umie cimy j w białym wietle, to pochłonie ona wiatło czerwone i zielone, a odbije niebieskie. Je li jednak t sam kul umie cimy w wietle czerwonym, to kula b dzie czarna, gdy całe czerwone wiatło zostanie zaabsorbowane i nic nie zostanie odbite. Podobnie jak wiatło, materiał równie mo emy 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ółrz dna w poło eniu ródła wiatła jest równa zero (w OpenGL ka dy punkt mo emy definiowa za pomoc czterech współrz dnych (x,y,z,w)). Takie wiatło nazywamy kierunkowym, gdy znajduje si w niesko czono ci, jego promienie s do siebie równoległe, a ich kierunek okre laj współrz dne (x,y,z). Przykładem wiatła kierunkowego jest Sło ce. Je li współrz dna w jest równa jeden, to mamy do czynienia ze wiatłem punktowym. Dodatkowo dla ka dego takiego ródła mamy mo liwo zdefiniowania czynnika powoduj cego tłumienie intensywno ci wiecenia zale nie od odległo ci do obiektu. Dla dowolnego wiatła punktowego mamy mo liwo ograniczenia przestrzeni rozchodzenia si wiatła poprzez zdefiniowanie sto ka 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 o wietlenia do tworzonej sceny nale y wykona cztery polecenia: * nale y wyznaczy wektory normalnych w ka dym wierzchołku ka dego obiektu, pozwol one ustali orientacje obiektów wzgl dem ródła wiatła. * nale y utworzy , wybra i umie ci ródła wiatła * nale y wybra i umie ci model o wietlenia. Model ten definiuje wiatło otoczenia oraz poło enie obserwatora, dla którego wyznaczane jest o wietlenie. * nale y zdefiniowa wła ciwo ci materiałów obiektów znajduj cych si na scenie. W funkcji inicjalizuj cej powinni my aktywowa o wietlenie za pomoc funkcji glEnable(GL_LIGHTING) informuje ona OpenGL e b d przeprowadzane obliczenia zwiazane z obliczaniem o wietlenia obiektów. W celu okre lenia wła ciwo ci materiału naley u y funkcji glMaterialfv( ), okre la ona sposób odbicia wiatła otoczenia i wiatła rozproszenia przez przedni cian wielok ta. W celu okre lenia wła ciwo ci ródeł wiatła nale y u y funkcji glLightfv( ). Na ko cu inicjalizacji wyłaczamy ródło wiatła przekazuj c odpowiedni warto GL_LIGHTX funkcji glEnable( ). W funkcji rysuj cej nale y dopisa funkcj definiuj c normaln do ka dej ze cian figury. Dla ródła wiatła mo na zdefiniowa szereg wła ciwo ci (kolor, poło enie, czy kierunek): void glLightfv(GLenum light, GLenum pname, TYPE *param); Wła ciwo ci 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 (K t rozwarcia strumienia wiatła) * GL_CONSTANT_ATTENUATION (Stała warto tłumienia, jako warto domy lna ustawione jest 1.0) * GL_LINERAL_ATTENUATION (Liniowa warto tłumienia, jako warto domy lna ustawione jest 0.0) * GL_QUADRATIC_ATTENUATION (Kwadratowa warto tłumienia , jako warto domy lna ustawione jest 0.0) Wła ciwo ci materiałów: * GL_AMBIENT (Kolor przy o wietleniu wiatłem otoczenia) * GL_DIFFUSE (Kolor przy o wietleniu wiatłem rozproszonym) * GL_AMBIENT_AND_DIFFUSE (Kolor przy o wietleniu wiatłem otoczenia i rozproszonym) * GL_SPECULAR (Kolor przy o wietleniu wiatłem odbicia) * GL_SHININESS (Współczynnik odbicia) * GL_EMISSION (Kolor wiatła emisji) Wła ciwo ci modelu o wietlenia: * GL_LIGHT_MODEL_AMBIENT (Intensywno wiatła otaczaj cego sceny w modelu RGBA, domy lnie warto 0.2,0.2,0.2,1.0) * GL_LIGHT_MODEL_LOCAL_VIEWER (Obserwator lokalny lub w niesko czono ci; domy lnie warto GL_FALSE (o wietlenie jednostronne)) * GL_LIGHT_MODEL_TWO_SIDE (O wietlenie jedno lub dwu stronne; domy lnie GL_FALSE (o wietlenie jednostronne) * GL_LIGHT_MODEL_COLOR_CONTROL (Oddzielne traktowanie koloru w wietle odbicia od kolorów w wietle otoczenia i wietle rozproszonym; domy lnie warto GL_SINGLE_COLOR (ł czne traktowanie) Przykład: const const const const GLfloat GLfloat GLfloat GLfloat light_ambient[] light_diffuse[] light_specular[] light_position[] = = = = { { { { 0.0f, 1.0f, 1.0f, 2.0f, const const const const GLfloat GLfloat GLfloat GLfloat mat_ambient[] mat_diffuse[] mat_specular[] high_shininess[] = = = = { { { { 0.7f, 0.7f, 0.7f, 1.0f }; 0.8f, 0.8f, 0.8f, 1.0f }; 1.0f, 1.0f, 1.0f, 1.0f }; 100.0f }; 5 0.0f, 1.0f, 1.0f, 5.0f, 0.0f, 1.0f, 1.0f, 5.0f, 1.0f 1.0f 1.0f 0.0f }; }; }; }; glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, glLightfv(GL_LIGHT0, GL_DIFFUSE, glLightfv(GL_LIGHT0, GL_SPECULAR, glLightfv(GL_LIGHT0, GL_POSITION, glMaterialfv(GL_FRONT, glMaterialfv(GL_FRONT, glMaterialfv(GL_FRONT, glMaterialfv(GL_FRONT, light_ambient); light_diffuse); light_specular); light_position); GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_SHININESS, mat_ambient); mat_diffuse); mat_specular); high_shininess); Zadania do wykonania: Prosz o narysowanie sfery oraz dodanie do sceny trzech wiateł: czerwonego typu specular, niebieskiego typu diffuse ( wiatła te b d kr y wokół naszego sze cianu) oraz wiatła typu ambient (którego kolor b dzie mo na zmienia za pomoc klawiszy). 6