Wizualizacja 3D

Transkrypt

Wizualizacja 3D
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(nx2+ny2+nz2)
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

Podobne dokumenty