Temat: Materiały i oświetlenie 1 Wstęp teoretyczny

Transkrypt

Temat: Materiały i oświetlenie 1 Wstęp teoretyczny
Grafika komputerowa 3D
Instrukcja
laboratoryjna
12
Temat: Materiały i oświetlenie
Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz
Michno
1 Wstęp teoretyczny
1.1 Rodzaje światła
Grafika 3D bez obsługi oświetlenia sprawia zazwyczaj wrażenie bardzo nierealistycznej.
Z tego względu wszystkie (lub prawie wszystkie) biblioteki implementują różne rodzaje światła.
W OpenGLu dostępne są 3 rodzaje: światło otoczenia (ambient light), światło rozproszone (diffuse
light) oraz światło odbite (specular light).
Światło otoczenia – światło o niezmiennej jasności i kolorze, które oświetla każdy obiekt na scenie
równomiernie (oświetla obiekt z każdego kierunku równomiernie).
Światło rozproszone – światło o ustalonym kierunku, co powoduje że obiekty są oświetlane tylko
z jednej strony. Światło rozproszone jest rozprowadzane na danej ścianie obiektu równomiernie.
1/8
Światło odbite – światło o ustalonym kierunku, odbijające się od obiektu również w ustalonym
kierunku, który będąc pod odpowiednim kątem do obserwatora powoduje pojawienie się
rozbłysku.
1.2 Wektory normalne
Każda ściana obiektu, w przypadku gdy chcemy używać oświetlenia, powinna posiadać
wektory normalne (wektory prostopadłe do powierzchni). W tym celu należy użyć jednej z funkcji:
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).
W przypadku gdy stosujemy obiekty GLUTa (teapot itp.), nie ma potrzeby podawania wektorów
normalnych, ponieważ są one już zdefiniowane w kodzie biblioteki.
1.3 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)
2/8
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.
1.4 Ś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
3/8
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”
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.
Najczęściej podaje się GL_FRONT_AND_BACK jako pierwszy parametr oraz
GL_AMBIENT_AND_DIFFUSE jako drugi.
1.5 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
4/8
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.
1.6 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.
1.7 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
5/8
Definiujemy płynne przejście od miejsc
najbardziej do najmniej
oświetlonych
GL_SPOT_EXPONENT
1.8 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
GL_CONSTANT_ATTENUATION
Wartość wynosi 1.0
GL_LINEAR_ATTENUATION
Wartość wynosi 0.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 0.0
Parametr „pname”
Opis
GL_CONSTANT_ATTENUATION
Wartość wynosi 0.0
GL_LINEAR_ATTENUATION
Wartość wynosi 1.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 0.0
Parametr „pname”
Opis
GL_CONSTANT_ATTENUATION
Wartość wynosi 0.0
GL_LINEAR_ATTENUATION
Wartość wynosi 0.0
GL_QUADRATIC_ATTENUATION
Wartość wynosi 1.0
Efekty
Wraz z odległością wierzchołki
oświetlane są tak samo
Efekty
Zanik liniowy
Efekty
Zanik kwadratowy
1.9 Modyfikacja oświetlenia globalnego
W OpenGL istnieje możliwość modyfikacji oświetlenia globalnego. Do tego celu służy
rodzina funkcji glLightModel.
6/8
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ść.
1.10
Stos macierzy przekształceń
Czasami podczas wykonywania przekształceń może nastąpić potrzeba zapamiętania
aktualnego stanu macierzy (zazwyczaj gdy chcemy przekształcić dodatkowo część obiektów,
a część pozostawić bez zmian). W tym celu należy użyć funkcji:
glPushMatrix()
Do ponownego wczytania stanu macierzy służy funkcja:
glPopMatrix()
Stany macierzy zapamiętywane są na stosie, dzięki czemu możliwe jest zapamiętanie wielu stanów,
a następnie ich wczytywanie w tej samej kolejności.
1.11
Zapamiętanie atrybutów oświetlenia
Podobnie jak przy przekształceniach, dla oświetlenia również może wystąpić potrzeba
zapamiętania jego atrybutów. Często zachodzi taka potrzeba gdy chcemy chwilowo wyłączyć
oświetlenie i np. narysować tekst.
Zapamiętanie wszystkich atrybutów oświetlenia realizowane jest przez funkcję:
glPushAttrib(GL_LIGHTING_BIT);
Ponowne wczytanie atrybutów:
glPopAttrib();
Podobnie jak dla macierzy przekształceń, atrybuty odkładane są na stos.
7/8
2 Zadanie
Stwórz program, w którym narysujesz kilka obiektów, z których wszystkie za wyjątkiem
jednego będą oświetlone. Oświetlenie powinno składać się ze wszystkich 3 rodzajów światła,
powinno być również przesuwane automatycznie lub za pomocą klawiatury. Nieoświetlony obiekt
należy narysować wykorzystując zapamiętywanie atrybutów oświetlenia.
8/8