Potok graficzny 3D Radosław Mantiuk Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny
Eksperyment Rafal Piórkowski rpiorkowski@wi.zut.edu.pl
System graficzny scena 3D algorytm graficzny obraz 2D Dane wejściowe Algorytm tworzący obraz wyjściowy na podstawie sceny 3D Dane wyjściowe System graficzny czasu rzeczywistego Oświetlenie lokalne
Scena 3D Zbiór trójwymiarowych danych wejściowych wykorzystywanych do wygenerowania obrazu wyjściowego 2D. - Definicja geometrii obiektów 3D. - Definicja materiałów pokrywających obiekty. - Kolor powierzchni obiektów. - Tekstura. - Własności powierzchni. - Kamera. - Źródła światła. - Parametry środowiska (mgła, dym, itp.). OBIEKTY Scena 3D KAMERA ŚWIATŁO
Sceny 3D - Parametry środowiska Parametryzacja przestrzeni sceny. Mgła
Scena 3D - Reprezentacje geometrii obiektów Reprezentacja obiektów geometrycznych - obiekty parametryczne opisane równaniami matematycznymi, - reprezentacja wielokątowa, - obiekty złożone, - reprezentacja fraktalna, - krzywe i powierzchnie, - obiekty CSG.
Scena 3D - Modelowanie 3D
Scena 3D - Reprezentacja wielokątowa (1)! Trójkąt - obiekt podstawowy (współpłaszczyznowość wierzchołków trójkąta)! Duża liczba identycznych obiektów: wykorzystanie tych samych algorytmów do przetwarzania wszystkich obiektów (architektura SIMD kart graficznych).! Ograniczona dokładkość odwzorowania powierzchni krzywoliniowych (aproksymacje powierzchni krzywoliniowych).! Duża liczba obiektów potrzebna do zbudowania prostego kształtu geom. (przykład kuli).
Scena 3D - Reprezentacja wielokątowa (2) Optymalizacja reprezentacji wielokątowej - unikanie powtórzeń definicji wierzchołków. konfiguracja strip konfiguracja fan v10 v9 v8 konfiguracja mesh
Scena 3D - Reprezentacja hierarchiczna Obiekty złożone składają się z wielu obiektów podstawowych. Powtarzające się elementy reprezentowane są za pomocą transformacji geometrycznych. Courtesy of Andries van Dam
Potok graficzny czasu rzeczywistego Aplikacja Przetwarzanie geometrii Rasteryzacja
Transformacje geometrii
OpenGL: Reprezentacja obiektów - trójkąty Definiowanie trójkąta (ang. triangle) oraz czworoboku (ang. quad). glbegin(gl_triangles); glend(); glvertex3f( 0.0f, +1.0f, 0.0f ); glvertex3f( -1.0f, 0.0f, 0.0f ); glvertex3f( +1.0f, -1.0f, 0.0f ); glbegin(gl_quads); glnormal3f( 0, 0, -1.0f ); gltexcoord2f( 1.0f, 1.0f ); glvertex3f( -0.5f, +0.5f, -0.5f ); gltexcoord2f( 0.0f, 1.0f ); glvertex3f( +0.5f, +0.5f, -0.5f ); gltexcoord2f( 0.0f, 0.0f ); glvertex3f( +0.5f, -0.5f, -0.5f ); gltexcoord2f( 1.0f, 0.0f ); glvertex3f( -0.5f, -0.5f, -0.5f ); glend(); glutsolidsphere()
OpenGL: Tworzenie obiektów
OpenGL: Tworzenie obiektów glutsolidcube(1)
OpenGL: Tworzenie obiektów glscalef( 1.5f, 3.0f, 1.5f ); glutsolidcube(1);
OpenGL: Tworzenie obiektów glrotatef( 10.0f, 0.0f, 1.0f, 0.0f ); glrotatef( 60.0f, 1.0f, 0.0f, 0.0f ); glscalef( 1.5f, 3.0f, 1.5f ); glutsolidcube(1);
OpenGL: Tworzenie obiektów gltranslatef( 1.0f, 1.0f, 0.0f ); glrotatef( 10.0f, 0.0f, 1.0f, 0.0f ); glrotatef( 60.0f, 1.0f, 0.0f, 0.0f ); glscalef( 1.5f, 3.0f, 1.5f ); glutsolidcube(1);
OpenGL: Tworzenie obiektów macierz transformacji obiektów! " x ' y ' z ' 1 $! = % " r 11 s x r 12 r 13 t x r 21 r 22 s y r 23 t y r 31 r 32 r 33 s z t z 0 0 0 1 $! % " x y z 1 $ % glmatrixmode( GL_MODELVIEW ); glloadidentity(); glpushmatrix(); glpopmatrix(); gltranslatef( 1.0f, 1.0f, 0.0f ); glrotatef( 10.0f, 0.0f, 1.0f, 0.0f ); glrotatef( 60.0f, 1.0f, 0.0f, 0.0f ); glscalef( 1.5f, 3.0f, 1.5f ); glutsolidcube(1);
OpenGL: Kolejność przekształceń M' = M * R * T glrotatef( 45.0f, 0.0f, 0.0f, 1.0f ); gltranslatef( 2.0f, 0.0f, 0.0f ); glutwirecube( 1 ); M' = M * T * R gltranslatef( 2.0f, 0.0f, 0.0f ); glrotatef( 45.0f, 0.0f, 0.0f, 1.0f ); glutwirecube( 1 );
OpenGL: hierarchia obiektów glpushmatrix(); glrotatef( 20.0f, 0.0f, 1.0f, 0.0f ); glrotatef( 10.0f, 1.0f, 0.0f, 0.0f ); glpushmatrix(); glscalef( 0.7f, 0.7f, 0.7f ); gltranslatef( 1.2f, 1.0f, 0.0f ); glutwiresphere( 1, 20, 20 ); glpopmatrix(); glpushmatrix(); glscalef( 0.7f, 0.7f, 0.7f ); gltranslatef( -1.2f, 1.0f, 0.0f ); glutwiresphere( 1, 20, 20 ); glpopmatrix(); glpushmatrix(); glscalef( 0.5f, 1.0f, 1.0f ); gltranslatef( 0.0f, -0.7f, 0.0f ); glutwirecube( 1 ); glpopmatrix(); glpushmatrix(); glscalef( 2.0f, 0.5f, 1.0f ); gltranslatef( 0.0f, -3.5f, 0.0f ); glutwirecube( 1 ); glpopmatrix(); glpopmatrix();
Kamera otworkowa (ang. pinhole camera) Kamera komputerowa symuluje kamerę otworkową z nieskończenie małym otworem przesłony, bez soczewek.
Scena 3D: Definicja kamery! Definiuje jaka część przestrzeni trójwymiarowej będzie widoczna na wyjściowym obrazie 2D.! Określa sposób rzutowania (prostokątne, perspektywiczne, itp.). up lookp! kąt patrzenia FOV (ang. Field of View)! punkt położenia kamery! punkt, na który patrzy kamera! orientacja obrazu! aspekt (ang. aspect ratio) fovy eyep Courtesy of Andries van Dam
Scena 3D: Field of View kąt patrzenia (FOV) powierzchnie obcinające (ang. clipping planes) Courtesy of Andries van Dam
OpenGL: Kamera macierz projekcji (GL_PROJECTION) glmatrixmode(gl_projection); glloadidentity(); gluperspective( fovy, aspect, znear, zfar ); glmatrixmode(gl_modelview); glloadidentity(); glulookat( eyepx, eyepy, eyepz, lookpx, lookpy, lookpz, upx, upy, upz ); Y up lookp zfar X eyep Z znear gluperspective( 50, 1, 1, 1000); glulookat( 0, 0, 7, 0, 0, 0, 0, 1, 0 );
OpenGL: Transformacje geometryczne dane wierzchołków macierz ModelView macierz Projection dzielenie przez w transformacja okna widzenia współ. obiektu współ. kamery współ. obcinania współ. znormal. (NDC) współ. ekranu (rastra)
OpenGL: Transformacja z układu modelu do widoku dane wierzchołków M ModelView = M View * M Model współ. obiektu macierz ModelView współ. kamery glulookat(...) glscale() gltranslate() glrotate() macierz Projection dzielenie przez w transformacja okna widzenia współ. obcinania współ. znormal. (NDC)! " x cam y cam z cam 1 $! = M modelview % " x obj y obj z obj 1 $! = M view M model % " x obj y obj z obj 1 $ % współ. ekranu (rastra)
OpenGL: Transformacja z układu modelu do widoku dane wierzchołków macierz ModelView macierz Projection dzielenie przez w transformacja okna widzenia współ. obiektu współ. kamery współ. obcinania współ. znormal. (NDC) współ. ekranu (rastra)
OpenGL: Rzutowanie oraz clipping dane wierzchołków współ. obiektu Macierz GL_PROJECTION gluperspective(...) macierz ModelView macierz Projection współ. kamery void gluperspective(double fovy, double aspectratio, double front, double back) { const double DEG2RAD = 3.14159265 / 180; dzielenie przez w transformacja okna widzenia współ. obcinania współ. znormal. (NDC) współ. ekranu (rastra) } double tangent = tan(fovy/2 * DEG2RAD); // tangent of half fovy double height = front * tangent; // half height of near plane double width = height * aspectratio; // half width of near plane // params: left, right, bottom, top, near, far glfrustum(-width, width, -height, height, front, back);
OpenGL: Rzutowanie oraz clipping dane wierzchołków Macierz GL_PROJECTION współ. obiektu macierz ModelView współ. kamery macierz Projection współ. obcinania dzielenie przez w współ. znormal. (NDC) transformacja okna widzenia współ. ekranu (rastra)! " x clip w y clip w z clip w w! $ = % " 2 near right left 0 0 2 near bottom top 0 0 (right + left) right left (bottom + top) bottom top far + near far near 0 0 2 near far far near 0 0 1 0 $! " % x cam y cam z cam 1 $ %
OpenGL: Rzutowanie oraz clipping gluortho2d(...) dane wierzchołków Rzut perspektywiczny współ. obiektu macierz ModelView współ. kamery macierz Projection dzielenie przez w współ. obcinania Rzut prostokątny transformacja okna widzenia współ. znormal. (NDC) współ. ekranu (rastra) gluortho2d(...)
OpenGL: Clipping (obcinanie) dane wierzchołków współ. obiektu macierz ModelView Clipping usuwanie obiektów znajdujących się poza polem widzenia, obiekty częściowo znajdujące się w polu widzenia są dzielone na mniejsze macierz Projection dzielenie przez w transformacja okna widzenia współ. kamery współ. obcinania współ. znormal. (NDC) współ. ekranu (rastra) Culling - usuwanie obiektów zasłoniętych przez inne obiekty (np. ang. backface culling).
OpenGL: NDC oraz współrzędne ekranu dane wierzchołków współ. obiektu macierz ModelView współ. kamery macierz Projection Normalised Device Coordinates (NDC)! " x ndc y ndc z ndc $! = % " x clip / w y clip / w z clip / w $ % dzielenie przez w transformacja okna widzenia współ. obcinania współ. znormal. (NDC) współ. ekranu (rastra)
OpenGL: NDC oraz współrzędne ekranu dane wierzchołków współ. obiektu macierz ModelView współ. kamery macierz Projection współ. obcinania dzielenie przez w Współrzędne ekranu: x w = x +1 ndc width 2 y w = y +1 ndc height 2 (0,0) transformacja okna widzenia współ. znormal. (NDC) współ. ekranu (rastra) (w,h)
OpenGL: NDC oraz współrzędne ekranu dane wierzchołków macierz ModelView macierz Projection dzielenie przez w transformacja okna widzenia współ. obiektu współ. kamery współ. obcinania współ. znormal. (NDC)! " x w y w z w Współrzędne okna na ekranie: glviewport(x, y, w, h);! $ = % " width x ndc + (x + width 2 2 ) height y ndc + (y + height ) 2 2 far near far + near z ndc + 2 2 $ % współ. ekranu (rastra)
Model oświetlenia
Scena 3D: Źródła światła (1) Emisja fali elektromagnetycznej w zakresie widzialnym. światło punktowe (point light) światło kierunkowe (distant light) światło stożkowe (spot light)
Scena 3D: Źródła światła (2) Naturalne źródła światła - generowanie miękkich cieni (ang. soft shadows). światło liniowe (linear light) światło powierzchniowe (area light)
OpenGL: Punktowe źródła światła glenable( GL_NORMALIZE ); // włączenie automatycznej normalizacji wektorów po skalowaniu float g_lightpos[4] = { 0.0f, 0.0f, 2.0f, 1.0f }; gllightfv(gl_light1, GL_POSITION, g_lightpos); GLfloat color[] = { 1.0f, 1.0f, 1.0f }; gllightfv(gl_light1, GL_AMBIENT, color); gllightfv(gl_light1, GL_DIFFUSE, color); gllightfv(gl_light1, GL_EMISSION, color); gllightfv(gl_light1, GL_SPECULAR, color); glenable(gl_light1); glenable(gl_lighting);
OpenGL: Kierunkowe źródła światła glenable( GL_NORMALIZE ); // włączenie automatycznej normalizacji wektorów po skalowaniu float g_lightdir[4] = { 0.0f, 0.0f, -1.0f, 0.0f }; gllightfv(gl_light1, GL_POSITION, g_lightpos); GLfloat color[] = { 1.0f, 1.0f, 1.0f }; gllightfv(gl_light1, GL_AMBIENT, color); gllightfv(gl_light1, GL_DIFFUSE, color); gllightfv(gl_light1, GL_EMISSION, color); gllightfv(gl_light1, GL_SPECULAR, color); glenable(gl_light1); glenable(gl_lighting);
OpenGL: Źródła światła typu spot glenable( GL_NORMALIZE ); // włączenie automatycznej normalizacji wektorów po skalowaniu float g_lightpos[4] = { 0.0f, 0.0f, 2.0f, 1.0f }; gllightfv(gl_light1, GL_POSITION, g_lightpos); GLfloat color[] = { 1.0f, 1.0f, 1.0f }; gllightfv(gl_light1, GL_AMBIENT, color); gllightfv(gl_light1, GL_DIFFUSE, color); gllightfv(gl_light1, GL_EMISSION, color); gllightfv(gl_light1, GL_SPECULAR, color); // dodatkowe parametry gllightf(gl_light0,gl_spot_cutoff,95.0); // kąt odcięcia pola świecenia gllightf(gl_light0,gl_spot_exponent,2.0); // współczynnik osłabienia gllightfv(gl_light0,gl_spot_direction,spotdir); // kierunek świecenia glenable(gl_light1); glenable(gl_lighting);
Scena 3D: Materiał Dla materiałów definiuje się ich własności odbijania światła. ambient diffuse specular ambinet + diffuse ambinet + diffuse + specular
OpenGL: Materiał float colw[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; glmaterialfv( GL_FRONT, GL_SPECULAR, colw); glmaterialf( GL_FRONT, GL_SHININESS, 40.0f ); float col[4] = { 0.01f, 0.6f, 0.01f, 1.0f }; glmaterialfv( GL_FRONT, GL_DIFFUSE, col); float cola[4] = { 0.01f, 0.2f, 0.01f, 1.0f }; glmaterialfv( GL_FRONT, GL_AMBIENT, cola);
Scena 3D: Materiał - Rodzaje powierzchni Własności powierzchni obiektów: - powierzchnie rozpraszające, - powierzchnie odbijające (lustrzane), - powierzchnie załamujące (przezroczyste). α powierzchnia rozpraszająca (ambient + diffuse + specular) α α powierzchnia odbijająca - kąt padania równy jest kątowi odbicia β powierzchnia załamująca
Rasteryzacja
Rasteryzacja (ang. rasterization) Operacje wykonywane w przestrzeni rastrowej, prowadzące do obliczenia koloru RGB wszystkich pikseli wyjściowego obrazu rastrowego i umieszczenie ich we buforze ramki (ang. frame buffer). Przygotowanie danych trójkątów (ang. triangle setup) Wypełnianie trójkątów (ang. scan conversion) Cieniowanie pikseli (ang. pixel shading) Łączenie danych (ang. merging)
Wypełnianie trójkątów (ang. scan conversion) Określanie, które fragmenty trókątów należą do poszczególnych pikseli obrazu.
Rasteryzacja trójkąta - Ang. Edge walking Brzegowa (ang. edge walking) 1. Posortowanie wierzchołków w kierunkach x i y, wybranie kierunku wypełniania (np. z lewej do prawej i z góry na dół). 2. Obliczenie pikseli brzegowych dla każdej poziomej linii (ang. spans). 3. Wypełnianie liniami poziomymi od punktu p0 do p2. Bardzo szybki algorytm. Pictures courtesy of MIT (lecture 6.837)
Cieniowanie pikseli (ang. pixel shading) Obliczanie kolorów fragmentów trójkątów.
Teksturowanie Modyfikacja koloru pikseli
Łączenie danych (ang. merging) Obliczenie koloru RGB pikseli na podstawie danych fragmentów poszczególnych trójkątów obejmujących ten piksel. Umieszczenie danych w buforze kolorów/ramki (ang. frame buffer) Obliczanie widoczności (bufor Z). Obliczanie przezroczystości (kanał Alfa). Mieszanie za pomocą bufora szablonu (ang. stencil buffer). Wykorzystanie bufora akumulacyjnego (ang. accumulation buffer). Wykorzystanie podwójnego buforowania (ang. double buffering). fragment - zbiór danych, na podstawie których oblicza się kolor piksela
Testowanie widoczności obiektów Bufor Z (ang. Z-buffer) Miejsce w pamięci osobne dla każdego piksela przeznaczone na zapamiętanie aktualnej wartości Z piksela. Wielkość bufora Z decyduje o precyzji testowania widoczności (obecnie stosuje się Z-bufory 32-bitowe). Wartość bufora uaktualniana jest dla każdego piksela i każdego trójkąta. Wartości z dla pikseli z wnętrza trójkąta są interpolowane na podstawie położenia wierzchołków trójkąta.
Potok graficzny Scena 3D wielokąty (położenie wierzchołków XYZ)) kolory (wektor RGB) wektory normalne (N) tekstury (współ. tektury (u,v)) Wykonywanie kolejnych operacji, dane wyjściowe z danej operacji są wejściem dla kolejnej. Potok akumuluje błędy. Zakres informacji nie powiększa się w kolejnych krokach potoku. bufor ramki (ang. frame buffer) transformacja modelu i widoku (współ. lokalne do współ. kamery) rzutowanie (macierz rzutowania) przejście do współ. rastrowych teksturowanie clipping cieniowanie pomijanie niewidocznych pikseli (bufor Z)
Literatura 1. Tomas Akenine-Moller, Eric Haines, Naty Hoffman, Real-Time Rendering (3rd edition), A K Peters, 2008.