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