Światła i rodzaje świateł Dorota Smorawa
Rodzaje świateł Biblioteka OpenGL posiada trzy podstawowe rodzaje świateł: światło otoczenia, światło rozproszone oraz światło odbite. Dodając oświetlenie na scenie należy pamiętać o ustaleniu parametrów tych trzech głównych rodzajów świateł. Domyślne ustawienia biblioteki OpenGL nie zawsze dają zadawalające rezultaty. W bibliotece OpenGL możemy zdefiniować osiem różnych rodzajów świateł, numerując je od 0 do 7.
Rodzaje świateł Każde źródło światła na scenie musi składać się z trzech składowych oświetlenia. Tak jak zwykłe kolory każda składowa oświetlenia definiowana jest składowymi RGBA. GL_AMBIENT - światło otaczające - nie pochodzi z żadnego kierunku, choć ma źródło. Wszystkie obiekty na scenie są nim równomiernie oświetlone ze wszystkich stron i na wszystkich powierzchniach. GL_DIFFUSE - światło rozproszone - ma zdefiniowane źródło i z tego kierunku pochodzi. Jasność powierzchni zależy od kąta, pod jakim pada na nią światło. GL_SPECULAR - światło odbite - ma kierunek i jest odbijane od powierzchni w jednym konkretnym kierunku.
Nie istnieje źródło światła, które składałoby się wyłącznie z jednego rodzaju światła!
Parametry światła Przykład: floatswiatlo_otoczenia[] = { 0.1, 0.1, 0.1, 1.0}; floatswiatlo_rozproszone[] = { 0.2, 0.2, 0.6, 1.0}; floatswiatlo_odbite[] = { 1.0, 0.2, 0.2, 1.0}; floatswiatlo_pozycja[] = { 0.0, 0.0, -20.0, 1.0}; gllightfv(światlo,typ,macierz_parametrow); gllightfv( GL_LIGHT0, GL_AMBIENT, swiatlo_otoczenia); gllightfv( GL_LIGHT0, GL_DIFFUSE, swiatlo_rozproszone); gllightfv( GL_LIGHT0, GL_SPECULAR, swiatlo_odbite); gllightfv( GL_LIGHT0, GL_POSITION, swiatlo_pozycja);
Światło otaczające - ogólne Dodając do sceny światło ogólne należy zdefiniować kilka przydatnych zmiennych: // definiowanie wartości parametrów światła ogólnego GLfloat fpozycja_swiatla[4] = {100.0f, 100.0f, 50.0f, 1.0f}; GLfloat fslabe_swiatlo[] = {0.25f, 0.25f, 0.25f, 1.0f}; GLfloat fmocne_swiatlo[] = {1.0f, 1.0f, 1.0f, 1.0f}; Dla światła ogólnego, podobnie jak dla innych rodzajów świateł, ustawiamy parametry światła otoczenia, rozproszonego oraz odbitego. Dodatkowo musimy ustalić pozycję tego światła, świecącego we wszystkich kierunkach. Musimy pamiętać, aby wszystko było ustawiane dla konkretnego światła na scenie (od GL_LIGHT0 do GL_LIGHT7) // ustawienia parametrów dla światła ogólnego gllightfv (GL_LIGHT0, GL_AMBIENT, fslabe_swiatlo); // światło otoczenia gllightfv (GL_LIGHT0, GL_DIFFUSE, fmocne_swiatlo); // światło rozproszenia gllightfv (GL_LIGHT0, GL_SPECULAR, fmocne_swiatlo); // światło odbite gllightfv (GL_LIGHT0, GL_POSITION, fpozycja_swiatla); // pozycja światła
Światło otaczające - ogólne Ustawienia parametrów dla światła ogólnego dokonujemy w funkcji ustawienia, wywoływanej w funkcji main, w funkcji rysującej aktorów lub bezpośrednio w funkcji sceny, zależnie od stopnia zaawansowania i wymogów dla oświetlenia. Po wszystkich ustawieniach należy włączyć za pomocą funkcji glenable oświetlenie (parametr GL_LIGHTING oraz odpowiednie światło (parametr GL_LIGHT0 do GL_LIGHT7). Włączenia dokonujemy w funkcji rysującej aktorów lub w funkcji sceny. glenable (GL_LIGHTING); // włączenie oświetlenia glenable (GL_LIGHT0); // włączenie światła 0 Jeśli chcemy włączyć inne światło i nie chcemy, aby aktualne brało udział w scenie, to po prostu wyłączamy je za pomocą funkcji gldisable z parametrem GL_LIGHT0 do GL_LIGHT7.
Światło odbite - kierunkowe Jeśli chcemy dodać światło kierunkowe do sceny, musimy również je odpowiednio zdefiniować, zaczynając od ustalenia parametrów definiujących to światło. Przykładem światła kierunkowego jest reflektor o odpowiednio zadeklarowanym kształcie reflektora i stopniu skupienia. GLfloat fpozycja_reflektora[4] = {0.0f, 10.0f, -2.5f, 1.0f}; GLfloat fkierunek_reflektora[4] = {0.0f, -2.0f, 0.0f, 1.0f}; // kierunek w którym maświecić reflektor GLfloat fslabe_swiatlo[] = {0.25f, 0.25f, 0.25f, 1.0f}; GLfloat fmocne_swiatlo[] = {1.0f, 1.0f, 1.0f, 1.0f}; Jeśli chcemy korzystać z reflektora, to musimy ustalić jego kształt oraz stopień skupienia wiązki światła. gllightf (GL_LIGHT1, GL_SPOT_CUTOFF, 30.0f); // reflektor o kącie rozwarcia 60stopni gllightf(gl_light1,gl_spot_exponent,10.0f); // stopień skupienia reflektora
Światło odbite - kierunkowe Parametry dla światła kierunkowego definiujemy podobnie jak dla światła ogólnego. Dochodzi tylko kierunek reflektora. gllightfv (GL_LIGHT1, GL_AMBIENT, fslabe_swiatlo); // światło otoczenia gllightfv (GL_LIGHT1, GL_DIFFUSE, fmocne_swiatlo); // światło rozproszenia gllightfv (GL_LIGHT1, GL_SPECULAR, fmocne_swiatlo); // światło odbite gllightfv (GL_LIGHT1, GL_POSITION, fpozycja_reflektora); // pozycja światła gllightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fkierunek_reflektora); // kierunek w który odwrócony jest reflektor Po wszystkich ustawieniach należy włączyć za pomocą funkcji glenable oświetlenie (parametr GL_LIGHTING oraz odpowiednie światło (parametr GL_LIGHT0 do GL_LIGHT7). Włączenia dokonujemy w funkcji rysującej aktorów lub w funkcji sceny. glenable (GL_LIGHTING); // włączenie oświetlenia glenable (GL_LIGHT1); // włączenie światła 1
Opis funkcji gllightmodel składnia parametry Ustala parametry modelu oświetlenia stosowanego przez bibliotekę OpenGL. Możliwe jest ustalenie wartości dowolnego z czterech parametrów modelu. Parametr GL_LIGHT_MODEL_AMBIENT stosowany jest do ustalania domyślnego oświetlenia otoczenia. Domyślnie parametr ten przyjnuje wartości RGBA (0.2, 0.2, 0.2, 1.0). Parametr GL_LIGHT_MODEKL_TWO_SIDE pozwala określić, czy oświetlane będą obie strony wielokątów. Domyślnie oświetlane są przednie strony wielokątów, przy czym w czasie wyliczania oświetlenia stosowane są właściwości materiałów zdefiniowane funkcją glmaterial. Określenie parametru GL_LIGHT_MODEL_LOCAL_VIEWER powoduje zmodyfikowanie obliczeń kątów odbicia światłą odbitego w zależności od tego, czy obserwator patrzy w dół wzdłuż ujemnych wartości osi z, czy też z początku układu współrzędnych oka. Parametr GL_LIGHT_MODEL_COLOR_CONTROL kontroluje, czy oświetlenie będzie tworzyło dodatkowy kolor (tekstury będą oświetlane światłem odbitym) czy też wszystkie trzy składowe światła będą łączone w parametrze GL_SINGLE_COLOR. void gllightmodelfv (GLenum pname, const GLfloat *params); pname określa modyfikowany parametr oświetlenia. Przyjmowane są wartości GL_LIGHT_MODEL_AMBIENT, GL_LIGHT_MODEL_LOCAL_VIEWER, GL_LIGHT_MODEKL_TWO_SIDE, GL_LIGHT_MODEL_COLOR_CONTROL param dla parametru GL_LIGHT_MODEL_LOCAL_VIEWER wartość 0.0 oznacza, że kąty padania światła odbitego muszą brać pod uwagę kierunek patrzenia obserwatora równoległy do ujemnych wartości osi z. każda inna wartość oznacza, że obserwator znajduje się w początku układu współrzędnych. Dla parametru GL_LIGHT_MODEKL_TWO_SIDE wartość 0.0 oznacza, że wyliczane będzie oświetlenie wyłącznie przednich stron wielokątów. Każda inna wartość oznacza, że obliczenia prowadzone będą dla przednich i tylnych stron wielokątów. Parametr ten nie ma żadnego wpływu na punkty, linie i bitmapy. Dla parametru GL_LIGHT_MODEL_COLOR_CONTROL można podać wartości GL_SEPARATE_SPECULAR_COLOR lub GL_SINGLE_COLOR. params dla parametrów GL_LIGHT_MODEL_AMBIENT lub GL_LIGHT_MODEL_LOCAL_VIEWER podać należy wskaźnik na tablicę wartości całkowitych lub zmiennoprzecinkowych. Z podanej tablicy wykorzystana będzie tylko pierwsza wartość. W przypadku parametru GL_LIGHT_MODEL_AMBIENT z tablicy pobierane są cztery wartości opisujące RGBA światła otoczenia.
Opis funkcji gllight Ustala parametry jednego z ośmiu dostępnych źródeł światła. Możemy ustawiać następujące parametry: GL_SPOT_EXPONENT wykładnik tłumienia kątowego reflektora, dopuszczalne są wartości z przedziału [0, 128], GL_SPOT_CUTOFF kąt odcięcia reflektora dopuszczalne są wartości z przedziału [0, 90] oraz 180, GL_CONSTANT_ATTENUATION stały współczynnik tłumienia światła, GL_LINEAR_ATTENUATION liniowy współczynnik tłumienia światła, GL_QUADRATIC_ATTENUATION kwadratowy współczynnik tłumienia światła. Pozostałe parametry ustawiamy za pomocą tablicy wartości, a są to: GL_AMBIENT wartość składowych RGBA światła otaczającego, GL_DIFFUSE - wartość składowych RGBA światła rozproszonego, GL_SPECULAR - wartość składowych RGBA światła odbitego, GL_POSITION czteroelementowy wektor (x, y, z, w), którego interpretacja zależy od wartości w, jeżeli w ma wartość 1 to trzy pierwsze współrzędne wektora określają położenie źródła światła, Jeżeli natomiast w ma wartość 0, to źródło światła jest światłem kierunkowym, a jego promienie padają w kierunku zdefiniowanym przez trzy pierwsze współrzędne wektora. Tablicowych wersji funkcji gllight można używać też do ustalania wartości właściwości opisywanych pojedynczą wartością. składnia void gllightfv (GLenum light, GLenum pname, const GLfloat *params); parametry light określa numer źródła światła poddawanego modyfikacjom. Można podawać tu wartości od 0 do GL_MAX_LIGHTS (przynajmniej 8). Zdefiniowane są stałe wartości wyliczeniowe od GL_LIGHT0 do GL_LIGHT7, pname określa parametr oświetlenia ustawiany w danym wywołaniu funkcji. params określa tablicę wartości całkowitych lub zmiennoprzecinkowych zawierającą wartości przypisywane ustalonej właściwości.
Literatura Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta Wydanie III, Helion2005 Pomoce dydaktyczne i instrukcje, http://icis.pcz.pl/~mkubanek Jackie Neider, Tom Davis, Mason Woo: OpenGL Programming Guide The RedBook Kevin Hawkins, Dave Astle: OpenGL. Programowanie gier, Helion 2003 The official OpenGL web page, http://www.opengl.org http://januszg.hg.pl/opengl/