Modelowanie oświetlenia z wykorzystaniem funkcji OpenGL
Grzegorz Prochowicz I4D1S0
Model oświetlenia zastosowany w bibliotece OpenGL opiera się na trzech
rodzajach światła: pierwszym jest światło otaczające (ambent light), które nie
pochodzi z żadnego konkretnego kierunku i równomiernie oświetla całą scenę
3D. Drugi rodzaj to światło rozproszone (diffuse light), które pada na obiekt z
określonego kierunku i jest na nim rozpraszane we wszystkich kierunkach.
Trzecim rodzajem jest światło odbite (specular light), które pada na obiekt z
określonego kierunku i jest odbijane w ściśle określonym kierunku.
W bibliotece OpenGL ze światłem ściśle związane jest pojęcie materiałów
określające właściwości oświetlanych obiektów. Właściwości materiału, poza
reakcją na opisane wyżej trzy rodzaje światła, uwzględniają także możliwość
emitowania światła.
Uruchomienie/wyłączenie oświetlenia wymaga wywołania funkcji
glEnable/glDisable z parametrem GL_LIGHTING. Minimalna ilość źródeł
ś
wiatła jaką musi obsługiwać każda implementacja OpenGL wynosi 8. Każde
ź
ródło światła ma unikatowy numer oznaczony stałą GL_lightx, gdzie x zawiera
się z przedziale [0,7]
1. Parametry świateł
Parametry każdego ze źródeł światła można modyfikować niezależnie od
pozostałych źródeł. Służą do tego funkcje glLight, które można podzielić na
dwie grupy. Pierwsza pozwala na modyfikacje określonych parametrów
pojedynczą wartością:
void glLightf (GLenum light, Plenum pname, GLfloat param)
void glLighti (GLenum light, Plenum pname, GLint param)
Druga natomiast na zmianę parametru źródła światła określonego tablicą
wartości:
void glLightv (GLenum light, Plenum pname, const GLfloat *params)
void glLightiv (GLenum light, Plenum pname, const GLint *params)
Parametr light określa numer źródła światła, którego parametry chcemy zmienić
(G_LIGHTx). Parametr pname określa parametr źródła światła, który chcemy
zmodyfikować. Możliwe są następujące wartości modyfikowanego tego
parametru:
GL_AMBIENT - wartości składowych RGBA światła otaczającego,
GL_DIFFUSE - wartości składowych RGBA światła rozproszonego,
GL_SPECULAR - wartości 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 oznacza to że 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 prze trzy pierwsze
współrzędne wektora,
GL_SPOT_DIRECTION –znormalizowany (o długość 1) trójwspółrzędny
wektor określający kierunek reflektora,
GLSPOT_EXPONENT –współczynnik tłumienia kątowego reflektora,
dopuszczalne są wartości z przedziału [0,128]. Umożliwia regulację stopnia
skupienia światła reflektora.
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 – linowy współczynnik tłumienia światła,
GL_QUADRATIC_ATTENUATION – kwadratowy współczynnik tłumienia
ś
wiatła.
Reflektory to światło kierunkowe , którego promienie rozchodzą się w
przestrzeni ograniczonej stożkiem o wierzchołku znajdującym się w źródle
ś
wiatła. Połowę kąta rozwarcia stożka określa parametr GL_SPOT_CUTOFF.
Wszystkie obiekty sceny poza stożkiem świata reflektora nie będą nim
oświetlone.
Trzy ostatnie parametry źródła światła określają współczynnik tłumienia
ś
wiatła:
gdzie d oznacza odległość wierzchołka od źródła światła, a stałe a
c
, a
l
., a
q
odpowiednio stały (GL_CONSTANT_ATTENUATION), liniowy
(GL_LINEAR_ATTENUATION i kwadratowy
(QUADRATIC_ATTENUATION) współczynnik tłumienia. Przy domyślnych
ustawieniach źródeł światła wartość współczynnika tłumienia wynosi 1, co
oznacza, że intensywność strumienia światła nie zależy od odległości pomiędzy
jego źródłem a wierzchołkiem oświetlanego obiektu.
Domyślnie światło GL_LIGHT0 jest światłem białym kierunkowym
położonym w punkcie o współrzędnych (0,0,1). Światło skierowane jest zgodnie
z kierunkiem wyznaczanym przez wektor o współrzędnych [0,0,-1].
Pomimo kierunkowego charakteru stożek światła GL_LIGHT0 nie jest w żaden
sposób ograniczony (parametr GL_SPOT_CUTOFF ma wartość 180) i światło
rozchodzi się we wszystkich kierunkach. Światło GL_LIGHT0 znajduje się na
ś
rodku płaszczyzny monitora (okna) i jest skierowane prostopadle w głąb
monitora. Źródła światła GL_LIGHT1-GLLIGHT7 różnią się od GL_LIGHT0
tylko barwą światła rozproszonego i odbitego.
2. Parametry modelu oświetlenia.
Poza zdefiniowaniem właściwości poszczególnych źródeł światła do
oświetlenia sceny w bibliotece OpenGL trzeba jeszcze określić parametry
stosowanego modelu oświetlenia. Służą do tego funkcje z grupy glLightModel:
void glLightModelf (GLenum pname, GLfloat param)
void glLightModeli (GLenum pname, GLint param)
void glLightModelfv (GLenum pname, const GLfloat *params)
Funkcje te, podobnie jak funkcje z grupy glLight, występują w dwóch wersjach
różniących się sposobem przekazywania parametrów. Parametr pname określa
własność modelu otoczenia , który chcemy zmienić. Dopuszczalne są
następujące wartości tego parametru:
GL_LIGHT_MODEL_LOCAL_VIEWER – określenie sposobu obliczania kąta
odbicia światła; wartość 0 oznacza, że kąt obliczany jest na podstawie kierunku
od początku układu współrzędnych do oświetlanego wierzchołka obiektu;
wartość inna niż 0 oznacza, że kąt odbicia światła obliczany jest na podstawie
kierunku ujemnej osi OZ,
GL_LIGHT_MODEL_TWO_SIDE – określenie czy będą oświetlane obie
strony wielokątów (wartość różna od 0) czy też tylko przednie strony (wartość
0),
GL_LIGHT_MODEL_AMBIENT – określenie składowych RGBA globalnego
ś
wiatła otaczającego
GL_LIGHT_MODEL_COLOR_CONTROL– określenie czy efekt oświetlenia
ś
wiatłem odbitym będzie nakładany dopiero po nałożeniu tekstury (wartość
GL_SEPARATE_SPECULAR_COLOR) czy też razem z teksturą (wartość
GL_SINGLE_COLOR).
3. Materiały
Elementem modelu oświetlenia przyjętego w bibliotece OpenGL jest opis
sposobu zachowania się powierzchni obiektów na poszczególne rodzaje światła,
czyli opis właściwości materiałów. Do ich modyfikacji służą funkcje z grupy
glMaterial:
void glMaterialf (GLenum face, GLlenum pname, GLfloat param)
void glMateriali (GLenum face, GLlenum pname, GLint param)
void glMaterialfv (GLenum face, GLlenum pname, const GLfloat *params)
void glMaterialiv (GLenum face, GLlenum pname, const GLint *params)
Parametr face ustala, której strony wielokąta dotyczy modyfikowany
parametr. Wartości: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
(odpowiednio przednia, tylna, obie strony)
Parametr pname określa zmienną wartość parametru materiału.
Dopuszczalne wartości:
GL_AMBIENT - składowe RGBA określające stopień odbicia światła
otaczającego,
GL_DIFFUSE - składowe RGBA określające stopień odbicia światła
rozproszonego,
GL_AMBIENT_AND_DIFFUSE - składowe RGBA określające jednocześnie
stopień odbicia światła otaczającego i rozproszonego,
GL_SPECULAR - składowe RGBA określające stopień odbicia światła
odbitego,
GL_SHININESS – stała z przedziału [0,128] określająca wykładnik odbłysku
ś
wiatła czyli regulację stopnia rozbłysku obiektu. Im większa wartość tym
większe skupienie rozbłysku światła na obiekcie,
GL_EMISSION – składowe RGBA światła emitowanego przez obiekt, taki
obiekt nie staje się źródłem światła i nie oświetla innych obiektów sceny,
wymaga to także utworzenia źródła światła,
GL_COLOR_INDEXES – w indeksowanym trybie kolorów trzy indeksy do
tablicy kolorów określające kolejno składowe RGBA określające reakcję na
ś
wiatło otaczające, rozproszone i odbite.