Wizualizacja 3D
Światło W OpenGL można rozróżnić 3 rodzaje światła Światło otaczające (ambient light) równomiernie oświetla wszystkie elementy sceny, nie pochodzi z żadnego konkretnego kierunku Światło rozproszone (diffuse light) pada na obiekt z określonego kierunku, ale jest na nim rozpraszane we wszystkich kierunkach Światło odbite (specular light) światło kierunkowe. Pada na obiekt z określonego kierunku i odbijane jest w konkretnym kierunku
Włączenie oświetlenia Oświetlenie w OpenGL włącza się poleceniem glenable(gl_lighting) Dodatkowo zalecane jest stosowanie bufora głębokości. Wyłączenie: gldisable(gl_lighting) OpenGL posiada min. 8 źródeł światła, oznaczonych GL_LIGHT0, GL_LIGHT1, GL_LIGHT7. Pozostałe (w zależności od implementacji) można uzyskać poprzez zapis GL_LIGHT0+i, gdzie i to numer światła. Można sprawdzić ile dana implementacja posiada źródeł światła poprzez funkcję glgetintegerv z parametrem GL_MAX_LIGHTS. Poszczególne źródła światła włącza się poleceniem: glenable(gl_light0) Wyłącza poprzez polecenie gldisable(..)
Przykład
Parametry źródeł światła Każde źródło światła może być modyfikowane niezależnie od innych poleceniem gllight. Są dwie wersje funkcji gllight. Pierwsza umożliwia zmianę tylko jednego parametru, druga wielu naraz poprzez przekazanie tablicy. Zmianę jednego parametru umożliwia jedna z funkcji void gllightf (GLenum light, GLenum pname, GLfloat param) void gllighti (GLenum light, GLenum pname, GLint param) Zmianę wielu parametrów naraz umożliwiają funkcje void gllightfv (GLenum light, GLenum pname, const GLfloat *params) void gllightiv (GLenum light, GLenum pname, const GLint *params) gdzie params jest wskaźnikiem na tablicy (w praktyce pisze się tutaj nazwę tablicy), param jest wartością pojedynczego parametru, light jest numerem światła, np. GL_LIGHT1, pname to parametr, który jest modyfikowany (następny slajd)
Parametry źródeł światła cd. 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; wartość 1, oznacza, że trzy pierwsze współrzędne wektora określają położenie źródła światła; wartość 0, oznacza, że źródło światła jest światłem kierunkowym, a jego promienie padają w kierunku zdefiniowanym przez trzy pierwsze współrzędne wektora, GL_SPOT_DIRECTION - znormalizowany (długości 1) trójwspółrzedny wektor określający kierunek reflektora, GL_SPOT_EXPONENT - wykładnik tłumienia kątowego reflektora; dopuszczalne są wartości z przedziału [0, 128]. Opisuje ściemnianie światła od centrum na zewnątrz reflektora (funkcja cosinus).
Parametry światła GL_SPOT_CUTOFF - kat odcięcia reflektora; dopuszczalne są wartości z przedziału [0, 90] oraz 180. Dla wartości 180 światło rozchodzi się równomiernie w całej przestrzeni. 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.
Parametry domyślne dla GL_LIGHT0 GL_AMBIENT (0,0,0,1) GL_DIFFUSE (1,1,1,1) GL_SPECULAR (1,1,1,1) GL_POSITION (0,0,1,0) GL_SPOT_DIRECTION (0,0,-1) GL_SPOT_EXPONENT 0 GL_SPOT_CUTOFF 180 GL_CONSTANT_ATTENUATION 1 GL_LINEAR_ATTENUATION 0 GL_QUADRATIC_ATTENUATION 0 Ś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 wyznaczonym 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ę każdym kierunku. Przy domyślnych początkowych ustawieniach układu współrzędnych oraz bryły odcinania źródło światła GL_LIGHT0 znajduje się na środku płaszczyzny monitora (okna) i jest skierowane prostopadle w głąb monitora.
Parametry domyślne dla GL_LIGHT1-GL_LIGHT7 GL_AMBIENT (0,0,0,1) GL_DIFFUSE (0,0,0,1) GL_SPECULAR (0,0,0,1) GL_POSITION (0,0,1,0) GL_SPOT_DIRECTION (0,0,-1) GL_SPOT_EXPONENT 0 GL_SPOT_CUTOFF 180 GL_CONSTANT_ATTENUATION 1 GL_LINEAR_ATTENUATION 0 GL_QUADRATIC_ATTENUATION 0 Źródła światła GL_LIGHT1 GL_LIGHT7 różnią się do światła GL_LIGHT0 tylko barwą światła rozproszonego i odbitego.
Przykład
Oświetlenie Uwaga! Wartość oświetlenia powierzchni wyliczana jest na podstawie wierzchołków
Parametry modelu oświetlenia Do definiowania modelu oświetlenia stosuje się funkcje grupy gllightmodel void gllightmodelf (GLenum pname, GLfloat param) void gllightmodeli (GLenum pname, GLint param) void gllightmodelfv (GLenum pname, const GLfloat *params) void gllightmodeliv (GLenum pname, const GLint *params) Funkcje te podobnie jak gllight występują w dwóch wersjach różniących się przekazywaniem parametrów Parametr pname określa właściwość modelu oświetlenia, Param wartość nadawana danej właściwości
Właściwości modelu oświetlenia GL_LIGHT_MODEL_LOCAL_VIEWER - określa sposób liczenia kąta przy odbiciu. Dokładnie w kierunku kamery (1) lub w sposób uproszczony, ale szybszy, w kierunku osi z (0). GL_LIGHT_MODEL_TWO_SIDE - określa strony wielokątów, które będą brane pod uwagę przy wyliczaniu oświetlenia: przednia i tylna (1) lub tylko przednia (0). GL_LIGHT_MODEL_AMBIENT - ustala parametry światła otoczenia, które jest obecne nawet pod nieobecność innych źródeł światła. Początkowo ustawione jest dość ciemne światło: (2/10, 2/10, 2/10, 1) GL_LIGHT_MODEL_COLOR_CONTROL - parametr istotny dopiero przy nakładaniu tekstur. Kontroluje sposób mieszania oświetlenia z teksturą (czy najpierw tekstura później oświetlenie, czy oba na raz).
Właściwości modelu oświetlenia GL_LIGHT_MODEL_LOCAL_VIEWER - 0 GL_LIGHT_MODEL_TWO_SIDE - 0 GL_LIGHT_MODEL_AMBIENT - (2/10, 2/10, 2/10, 1) GL_LIGHT_MODEL_COLOR_CONTROL - GL_SINGLE_COLOR
Materiały Modyfikowanie właściwości materiałów umożliwiają funkcje z grupy glmaterial. Funkcje występują w dwóch wersjach różniących się sposobem przekazywania parametrów. void glmaterialf (GLenum face, GLenum pname, GLfloat para) void glmateriali (GLenum face, GLenum pname, GLint para) void glmaterialfv (GLenum face, GLenum pname, const GLfloat *params) void glmaterialiv (GLenum face, GLenum pname, const GLint *params) face ustala, która stronę wielokąta dotyczy modyfikowany parametr. GL_FRONT przednia strona wielokąta, GL_BACK - tylna strona wielokąta GL_FRONT_AND_BACK - obie strony wielokąta. pname określa zmieniana wartość parametru materiału.
Parametry materiału GL_AMBIENT - składowe RGBA określające stopień odbicia światła otaczającego, GL_DIFFUSE - składowe RGBA określające stopień rozproszenia światła rozproszonego, GL_AMBIENT_AND_DIFFUSE - składowe RGBA określające jednocześnie stopień odbicia światła otaczającego i stopień rozproszenia światła 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 (ang. specular exponent) czyli regulacje stopnia występowania efektu rozbłysku obiektu; im większa wartość parametru, 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 indeksowym trybie kolorów trzy indeksy do tablicy kolorów określające kolejno składowe RGBA określające reakcje na światło otaczające, rozproszone i odbite.
Parametry materiału Parametry domyślne GL_AMBIENT (2/10, 2/10, 2/10, 1), GL_DIFFUSE (8/10, 8/10, 8/10, 1), GL_AMBIENT_AND_DIFFUSE - GL_SPECULAR (0,0,0,1), GL_SHININESS - 0 GL_EMISSION (0,0,0,1), GL_COLOR_INDEXES (0,1,1)
Materiały Przykładowe parametry Chrom Złoto Czarny plastik GL_AMBIENT 0.25, 0.25, 0.25 0.25, 0.2, 0.07 0.0, 0.0, 0.0 GL_DIFFUSE 0.4, 0.4, 0.4 0.75, 0.61, 0.23 0.01, 0.01, 0.01 GL_SPECULAR 0.77, 0.77, 0.77 0.63, 0.56, 0.37 0.5, 0.5, 0.5 GL_SHININESS 76.8 52.2 32.0
Śledzenie kolorów Możliwe jest definiowanie parametrów materiałów na podstawie kolorów wierzchołków określanych przy pomocy funkcji z grupy glcolor. Wybór parametrów materiału, które będą określane poprzez kolory wierzchołków, określa funkcja: void glcolormaterial (GLenum face, GLenum mode) Parametr face ustala, która stronę wielokąta dotyczy modyfikowany parametr. Dopuszczalne są GL_FRONT, GL_BACK, GL_FRONT_AND_BACK. Wartością domyślną jest GL_FRONT_AND_BACK. Parametr mode wskazuje, która z właściwości materiału ma być definiowana zgodnie z bieżącym kolorem wierzchołka. Dopuszczalne są niemal wszystkie opisane wcześniej własności materiałów: GL_EMISSION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR i GL_AMBIENT_AND_DIFFUSE. Wartością domyślną jest GL_AMBIENT_AND_DIFFUSE. Przed użyciem funkcji glcolormaterial trzeba wywołać funkcje glenable z parametrem GL_COLOR_MATERIAL
Wektory normalne Wektor normalny do danej powierzchni jest do niej prostopadły w określonym punkcie. Wykorzystywaliśmy pojęcie wektora normalnego w modelu obliczania natężenia światła odbitego. W OpenGL, gdzie powierzchnie reprezentowane są przez siatki wielokątów wektor normalny może być stowarzyszony z wielokątem (jest to wtedy rzeczywista normalna w sensie matematycznym)
glnormal3f( nx, ny, nz); glbegin( GL_TRIANGLES); glvertex3fv( v1); glvetrex3fv( v2); glvertex3fv( v3); glend();
Załóżmy, że trójkąt opisany jest wierzchołkami A, B i C. Wtedy określamy wektory v i w: v = [ Bx-Ax, By-Ay, Bz-Az ] w = [ Cx-Ax, Cy-Ay, Cz-Az ] Wektor normalny n obliczamy jako v*w, czyli: n = [ vy*wz-vz*wy, vz*wx-vx*wz, vx*wy-vy*wx ] OpenGL korzysta z wektorów normalnych jednostkowych, czyli o długości równej 1. Obliczony wyżej wektor n należy jeszcze znormalizować, to znaczy każdą jego współrzędną podzielić przez długość wektora (oznaczmy ją jako d): d = sqrt(nx 2 +ny 2 +nz 2 ) n = [ nx/d, ny/d, nz/d ]
Obliczanie oświetlenia w OpenGL 1. Wyznaczamy wektory normalne w każdym wierzchołku każdego obiektu. 2. Definiujemy źródła światła 3. Definiujemy model oświetlenia 4. Definiujemy własności materiałowe obiektów na scenie
Przykłady