System graficzny scena 3D algorytm graficzny obraz 2D Potok graficzny 3D Radosław Mantiuk Dane wejściowe Algorytm tworzący obraz wyjściowy na podstawie sceny 3D Dane wyjściowe Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny 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 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. KAMERA ŚWIATŁO 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). 1
Scena 3D - Reprezentacja wielokątowa (2) Optymalizacja reprezentacji wielokątowej - unikanie powtórzeń definicji wierzchołków. 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. konfiguracja strip v10 konfiguracja fan v9 v8 konfiguracja mesh Courtesy of Andries van Dam 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() glutsolidcube(1) glscalef( 1.5f, 3.0f, 1.5f ); glutsolidcube(1); 2
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); 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); macierz transformacji obiektów x ' $ r # 11 s x r 12 r 13 t $ x # # # y ' # r # = 21 r 22 s y r 23 t y # # # z ' r 31 r 32 r 33 s z t # # z # "# 1 % " # 0 0 0 1 % " x y z 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 ); glmatrixmode( GL_MODELVIEW ); glloadidentity(); 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); 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 Kamera otworkowa (ang. pinhole camera) glrotatef( 20.0f, 0.0f, 1.0f, 0.0f ); glrotatef( 10.0f, 1.0f, 0.0f, 0.0f ); glscalef( 0.7f, 0.7f, 0.7f ); gltranslatef( 1.2f, 1.0f, 0.0f ); glutwiresphere( 1, 20, 20 ); glscalef( 0.7f, 0.7f, 0.7f ); gltranslatef( -1.2f, 1.0f, 0.0f ); glutwiresphere( 1, 20, 20 ); glscalef( 0.5f, 1.0f, 1.0f ); gltranslatef( 0.0f, -0.7f, 0.0f ); glutwirecube( 1 ); glscalef( 2.0f, 0.5f, 1.0f ); gltranslatef( 0.0f, -3.5f, 0.0f ); glutwirecube( 1 ); Kamera komputerowa symuluje kamerę otworkową z nieskończenie małym otworem przesłony, bez soczewek. 3
Scena 3D: Definicja kamery Scena 3D: Field of View Definiuje jaka część przestrzeni trójwymiarowej będzie widoczna na wyjściowym obrazie 2D. Określa sposób rzutowania (prostokątne, perspektywiczne, itp.). lookp up kąt patrzenia (FOV) 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) powierzchnie obcinające (ang. clipping planes) fovy eyep Courtesy of Andries van Dam Courtesy of Andries van Dam OpenGL: Kamera Scena 3D: Źródła światła (1) macierz projekcji (GL_PROJECTION) Emisja fali elektromagnetycznej w zakresie widzialnym. glmatrixmode(gl_projection); glloadidentity(); gluperspective( fovy, aspect, znear, zfar ); glulookat( eyepx, eyepy, eyepz, lookpx, lookpy, lookpz, upx, upy, upz ); Y up gluperspective( 50, 1, 1, 1000); glulookat( 0, 0, 7, 0, 0, 0, 0, 1, 0 ); lookp światło punktowe światło kierunkowe światło stożkowe (point light) (distant light) (spot light) X zfar eyep znear Z Scena 3D: Źródła światła (2) OpenGL: Punktowe źródła światła Naturalne źródła światła - generowanie miękkich cieni (ang. soft shadows). 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); światło liniowe światło powierzchniowe (linear light) (area light) 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); 4
OpenGL: Kierunkowe źródła światła OpenGL: Źródła światła typu spot glenable( GL_NORMALIZE ); // włączenie automatycznej normalizacji wektorów po skalowaniu 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); 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); 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_lighting); glenable(gl_light1); glenable(gl_lighting); Scena 3D: Materiał OpenGL: Materiał Dla materiałów definiuje się ich własności odbijania światła. 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); ambient diffuse specular ambinet + diffuse float cola[4] = { 0.01f, 0.2f, 0.01f, 1.0f }; glmaterialfv( GL_FRONT, GL_AMBIENT, cola); ambinet + diffuse + specular Scena 3D: Materiał - Rodzaje powierzchni Scena 3D: Materiał -Tekstury Własności powierzchni obiektów: - powierzchnie rozpraszające, - powierzchnie odbijające (lustrzane), - powierzchnie załamujące (przezroczyste). Teksturowanie powierzchni obiektów. " " " powierzchnia rozpraszająca (ambient + diffuse + specular) " powierzchnia odbijająca - kąt padania równy jest kątowi odbicia powierzchnia załamująca 5
Sceny 3D - Parametry środowiska Parametryzacja przestrzeni sceny. Potok graficzny czasu rzeczywistego Aplikacja Przetwarzanie geometrii Rasteryzacja Mgła Przetwarzanie geometrii Transformacjom poddawane są kolejne trójkąty znajdujące się na scenie. Transformacja modelu współrzędne lokalne modelu -> współrzędne globalne Transformacja modelu (ang. model transform) Transformacja widzenia (ang. view transform) Cieniowanie wierzchołków (ang. vertex shading) Rzutowanie (ang. projection) Obcinanie (ang. clipping) Mapowanie do współrzędnych rastrowych (ang. screen mapping) Obiekt znajduje się w początku układu globalnego (ang. model coordinates). glmatrixmode(gl_modelview); glloadidentity(); gltranslatef() glscalef() glrotatef() W wyniku transformacji jest przekształcany do położenia i kształtu docelowego (ang. world coordinates). Transformacja widzenia Transformacja obiektów do znormalizowanego układu współrzędnych. Cieniowanie wierzchołków Obliczanie koloru w wierzchołkach obiektów glmatrixmode(gl_projection); glloadidentity(); glulookat(); Y Rozwiązywanie równania oświetlenia uwzględniającego wzajemne oddziaływanie na siebie źródeł światła, obserwatora i materiałów obiektów. Dla każdego wierzchołka obliczany jest kolor RGB Równanie oświetlenia rozwiązywane jest osobno dla każdej składowej koloru. X i tot = i amb + N k (i diff " k=1 k + i spec ) Z Oś OY przechodzi przez punkt położenia kamery i środek obrazu. Góra obrazu skierowana jest w kierunku osi OY. 6
Rzutowanie perspektywiczne Rzutowanie prostokątne (równoległe) Ang. orthographic (parallel) projection - zachowanie proporcji obiektów - szybka implementacja - brak perspektywy glortho(); gluperspective( FOV, aspect, near, far); Clipping i culling Transformacja do współrzędnych ekranu Clipping usuwanie obiektów znajdujących się poza polem widzenia. x ' = x +1 2 " xres y ' = y +1 2 " yres Obliczenie współrzędnych rastrowych wierzchołków obiektów (0,0) Courtesy of Andries van Dam Culling - usuwanie obiektów zasłoniętych przez inne obiekty (np. ang. backface culling). (xres,yres) 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). Wypełnianie trójkątów (ang. scan conversion) Określanie, które fragmenty trókątów należą do poszczególnych pikseli obrazu. 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) 7
Cieniowanie pikseli (ang. pixel shading) Obliczanie kolorów fragmentów trójkątów. Teksturowanie. Łą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). 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) Wartość bufora uaktualniana jest dla każdego piksela i każdego trójkąta. transformacja modelu (współ. lokalne do współ. globalnych) rzutowanie (macierz rzutowania) przejście do współ. rastrowych teksturowanie clipping cieniowanie Wartości z dla pikseli z wnętrza trójkąta są interpolowane na podstawie położenia wierzchołków trójkąta. pomijanie niewidocznych pikseli (bufor Z) Literatura 1. Tomas Akenine-Moller, Eric Haines, Naty Hoffman, Real-Time Rendering (3rd edition), A K Peters, 2008. 8