Laboratorium nr 6
1/7
1)
Wprowadzenie
Specyfikacja biblioteki OpenGL rozróżnia trzy niezależne rodzaje światła:
ś
wiatło otoczenia (ambient light), światło rozproszone (diffuse light) oraz światło odbite
(specular light). Każdy komponent światła definiowany jest przez cztery wartości RGBA,
określające
względną
intensywność
czerwonego,
zielonego,
niebieskiego
oraz
składowej alfa.
Ś
wiatło otoczenia jest to najprostszy typ światła. Rozprasza się równomiernie na
powierzchni danego obiektu niezależnie od swojego źródła. Odbija się od obiektów
znajdujących się w jego zasięgu, rozjaśniając wszystkie obiekty znajdujące się dookoła.
Ś
wiatło rozproszone w przeciwieństwie do światła otoczenia posiada kierunek.
Oznacza to, że gdy oświetlamy światłem rozproszonym jedną ze stron danego obiektu to
tylko ta strona jest oświetlona, a pozostałe nie. Światło rozproszone rozprowadzane jest na
powierzchni obiektu w sposób równomierny.
Grafika Komputerowa 3D
Temat: Materiały i oświetlenie
Instrukcja
laboratoryjna
6
Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 6
2/7
Ś
wiatło odbite również posiada określony kierunek, ale jest odbijane na powierzchni
obiektu w konkretnym kierunku. Takie typ światła powoduje, że na powierzchni obiektu
pojawia się rozbłysk (zazwyczaj o kolorze białym).
1.1) Wektory normalne
Aby w OpenGL oświetlenie było obliczanie poprawnie, każdej ścianie należy
przypisać wektor normalny. Służą do tego celu funkcje z rodziny glNormal:
void glNormal3f(GLfloat x, GLfloat y, GLfloat z)
void glNormal3d(GLdouble x, GLdouble y, GLdouble z)
Funkcje te definiują wektor normalny dla powierzchni. Przyjmują trzy parametry
będące współrzędnymi wektora normalnego. Wektor ten powinien być jednostkowy
(znormalizowany).
Laboratorium nr 6
3/7
2)
Materiały
Materiały określają kolor dla obiektu, na który pada światło. W OpenGL każdy
materiał pokrywający zdefiniowany obiekt ma określone właściwości odbicia światła
otaczającego, rozproszonego i odbitego. Barwa obiektu widzianego przez obserwatora
zależy od rodzaju światła padającego na obiekt i materiału, z jakiego jest wykonany.
Podobnie jak światło, materiał również można 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. Za przypisywanie obiektom materiałów odpowiada rodzina
funkcji glMaterial.
void glMaterialf(GLenum face, GLenum pname, GLfloat param)
void glMateriald(GLenum face, GLenum pname, GLdouble param)
void glMateriali(GLenum face, GLenum pname, GLint param)
Funkcje z rodziny glMaterial przyjmują trzy parametry. Pierwszy parametr określa, czy
definiujemy materiał dla przednich, tylnych, czy obydwu stron wielokątów. Drugi parametr
określa jaką właściwość materiału definiujemy. Ostatni parametr to tablica wartości
składających się na kolor RGB lub pojedyncza wartość.
Parametr „face”
Opis
GL_FRONT
Przednia strona wielokąta
GL_BACK
Tylna strona wielokąta
GL_FRONT_AND_BACK
Przednia i tylna strona wielokąta
Parametr „pname”
Opis
GL_AMBIENT
Definiujemy kolor materiału dla światła otoczenia
GL_DIFFUSE
Definiujemy kolor materiału dla światła rozproszonego
GL_SPECULAR
Definiujemy kolor materiału dla światła odbitego
GL_AMBIENT_AND_DIFFUSE
Definiujemy kolor materiału dla światła otoczenia i rozproszonego
GL_SHININESS
Definiujemy kolor materiału z możliwością zmiany mocy światła
odbitego. Jako ostatni parametr funkcji glMaterial podajmy liczbę z
przedziału (0 – 128) określającą moc odbicia
GL_EMISSION
Definiujemy kolor materiału z efektem emisji, który jest dodawany
do wynikowego koloru obiektu.
Laboratorium nr 6
4/7
2.1) Śledzenie materiału
Ś
ledzenie materiału umożliwia nam zmianę koloru danego typu materiału z
wykorzystaniem funkcji glColor. Możemy np. śledzić kolor światła otoczenia, każdorazowa
zmiana koloru funkcją glColor spowoduje zmianę koloru materiału dla światła otoczenia.
Włączenie śledzenia materiału dokonujemy za pomocą funkcji glEnable z parametrem
GL_COLOR_MATERIAL.
Przypisanie śledzonego koloru materiału funkcji glColor, odbywa się za pomocą
funkcji glColorMaterial.
void glColorMaterial(GLenum face, GLenum mode)
Funkcja ta przyjmuje dwa parametry. Pierwszy parametr określa strony wielokątów
których będzie dotyczyć śledzony kolor. Drugi parametr określa materiał, jaki będzie
ś
ledzony.
Parametr „face”
Opis
GL_FRONT
Przednia strona wielokąta
GL_BACK
Tylna strona wielokąta
GL_FRONT_AND_BACK
Przednia i tylna strona wielokąta
Parametr „mode”
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
GL_AMBIENT_AND_DIFFUSE
GL_EMISSION
Najczęściej podaje się GL_FRONT_AND_BACK jako pierwszy parametr oraz
GL_AMBIENT_AND_DIFFUSE jako drugi.
Laboratorium nr 6
5/7
3)
Oświetlenie
Aby włączyć oświetlenie w OpenGL należy wywołać funkcję glEnable z parametrem
GL_LIGHTING. Funkcja ta nakazuje bibliotece, aby przy obliczaniu koloru wierzchołków w
scenie brała pod uwagę właściwości materiału i parametry oświetlenia. W OpenGL
dostępnych jest osiem niezależnych źródeł światła. Każdemu z nich możemy przypisać inne
położenie, kolor otoczenia czy rozproszenia oraz kilka innych parametrów. Funkcją służącą
do ustawiania i modyfikacji parametrów oświetlenia jest glLight.
void glLightf(GLenum light, GLenum pname, GLfloat param)
void glLighti(GLenum light, GLenum pname, GLint param)
Funkcja ta przyjmuje trzy parametry. Pierwszy parametr określa którego światła
parametry modyfikujemy. Drugi parametr określa, który parametr światła zmieniamy. Trzeci
parametr określa kolor lub pojedynczą wartość przypisywaną danej właściwości.
Parametr „light”
Opis
GL_LIGHTx
Parametr określa, którego światła parametry modyfikujemy
x – jest to liczba z przedziału <0,7>, 0 < x < GL_MAX_LIGHTS
np. GL_LIGHT1, GL_LIGHT2, …
Parametr „pname”
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
UWAGA!!! Za pomocą funkcji glEnable oraz glDisable, możemy włączać i wyłączać
konkretne światło podając jako parametr np. GL_LIGHT1, GL_LIGHT2 itd.
3.1) Pozycja światła
Konkretnemu światłu możemy przypisać położenie, które określa z której strony pada.
Aby zdefiniować położenie światła jako drugi parametr „pname” funkcji glLight podajemy
stałą GL_POSITION. Jako trzeci parametr przekazujemy wtedy czteroelementowy wektor.
Parametr „pname”
GL_POSITION
Laboratorium nr 6
6/7
3.2) Reflektor
Reflektor jest to specjalny typ światła, który oświetla obiekt w danym konkretnym
miejscu np. latarka.
Parametr „pname”
Opis
GL_SPOT_CUTOFF
Definiujemy rozpiętość stożka widzenia w stopniach,
domyślnie jest 180 stopni
GL_SPOT_DIRECTION
Określamy wektor kierunku
GL_SPOT_EXPONENT
Definiujemy płynne przejście od miejsc najbardziej do najmniej
oświetlonych
3.3) Tłumienie światła
Tłumienie powoduje, że obiekty bardziej oddalone od źródła światła są mniej
oświetlone, a w konsekwencji mogą nie być oświetlone w ogóle jeśli znajdują się
odpowiednio daleko. Tłumienie ustawiamy za pośrednictwem trzech stałych:
GL_CONSTANT_ATTENUATION
GL_LINEAR_ATTENUATION
GL_QUADRATIC_ATTENUATION
W zależności od tego jakie przyjmują one wartości otrzymujemy odpowiednie efekty
tłumienia.
Parametr „pname”
Opis
Efekty
GL_CONSTANT_ATTENUATION
Wartość wynosi 1.0
GL_LINEAR_ATTENUATION
Wartość wynosi 0.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 0.0
Wraz z odległością wierzchołki
oświetlane są tak samo
Parametr „pname”
Opis
Efekty
GL_CONSTANT_ATTENUATION
Wartość wynosi 0.0
GL_LINEAR_ATTENUATION
Wartość wynosi 1.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 0.0
Zanik liniowy
Parametr „pname”
Opis
Efekty
GL_CONSTANT_ATTENUATION
Wartość wynosi 0.0
GL_LINEAR_ATTENUATION
Wartość wynosi 0.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 1.0
Zanik kwadratowy
Laboratorium nr 6
7/7
3.4) Modyfikacja oświetlenia globalnego
W OpenGL istnieje możliwość modyfikacji oświetlenia globalnego. Do tego celu służy
rodzina funkcji glLightModel.
void glLightModelf(GLenum pname, GLfloat param)
void glLightModeli(GLenum pname, GLint param)
Funkcje te przyjmują dwa parametry. Pierwszy parametr określa jaką właściwość
modelu oświetlenia zmieniamy:
GL_LIGHT_MODEL_LOCAL_VIEWER
GL_LIGHT_MODEL_TWO_SIDE
GL_LIGHT_MODEL_AMBIENT
Drugi parametr określa przypisywaną wartość.