Potok graficzny 3D

53
Grafika komputerowa Potok graficzny 3D Radosław Mantiuk Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny

Transcript of Potok graficzny 3D

Page 1: Potok graficzny 3D

Grafika komputerowa

Potok graficzny 3D Radosław Mantiuk

Wydział Informatyki

Zachodniopomorski Uniwersytet Technologiczny

Page 2: Potok graficzny 3D

Grafika komputerowa

System graficzny

Dane wejściowe

scena 3D algorytm graficzny obraz 2D

Algorytm tworzący obraz wyjściowy na podstawie sceny 3D

Dane wyjściowe

System graficzny czasu rzeczywistego

Oświetlenie lokalne

Page 3: Potok graficzny 3D

Grafika komputerowa

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.).

Scena 3D

KAMERA

OBIEKTY

ŚWIATŁO

Page 4: Potok graficzny 3D

Grafika komputerowa

Sceny 3D - Parametry środowiska Parametryzacja przestrzeni sceny.

Mgła

Page 5: Potok graficzny 3D

Grafika komputerowa

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.

Page 6: Potok graficzny 3D

Grafika komputerowa

Scena 3D - Modelowanie 3D

Page 7: Potok graficzny 3D

Grafika komputerowa

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).

Page 8: Potok graficzny 3D

Grafika komputerowa

Scena 3D - Reprezentacja wielokątowa (2) Optymalizacja reprezentacji wielokątowej - unikanie powtórzeń definicji

wierzchołków.

konfiguracja „fan”

konfiguracja „mesh”

v8 v9

v10

konfiguracja „strip”

Page 9: Potok graficzny 3D

Grafika komputerowa

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

Page 10: Potok graficzny 3D

Grafika komputerowa

Potok graficzny czasu rzeczywistego

Aplikacja

Przetwarzanie geometrii

Rasteryzacja

Page 11: Potok graficzny 3D

Grafika komputerowa

Transformacje geometrii

Page 12: Potok graficzny 3D

Grafika komputerowa

OpenGL: Reprezentacja obiektów - trójkąty Definiowanie trójkąta (ang. triangle) oraz czworoboku (ang. quad).

glBegin(GL_TRIANGLES);

glVertex3f( 0.0f, +1.0f, 0.0f ); glVertex3f( -1.0f, 0.0f, 0.0f ); glVertex3f( +1.0f, -1.0f, 0.0f );

glEnd();

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()

Page 13: Potok graficzny 3D

Grafika komputerowa

OpenGL: Tworzenie obiektów

Page 14: Potok graficzny 3D

Grafika komputerowa

OpenGL: Tworzenie obiektów

glutSolidCube(1)

Page 15: Potok graficzny 3D

Grafika komputerowa

OpenGL: Tworzenie obiektów

glScalef( 1.5f, 3.0f, 1.5f ); glutSolidCube(1);

Page 16: Potok graficzny 3D

Grafika komputerowa

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);

Page 17: Potok graficzny 3D

Grafika komputerowa

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);

Page 18: Potok graficzny 3D

Grafika komputerowa

OpenGL: Tworzenie obiektów

glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glPushMatrix();

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);

glPopMatrix();

macierz transformacji obiektów

x '

y'

z '

1

!

"

#####

$

%

&&&&&

=

r11sx r12 r13 txr21 r22sy r23 tyr31 r32 r33sz tz0 0 0 1

!

"

#####

$

%

&&&&&

xyz1

!

"

####

$

%

&&&&

Page 19: Potok graficzny 3D

Grafika komputerowa

OpenGL: Kolejność przekształceń

glRotatef( 45.0f, 0.0f, 0.0f, 1.0f ); glTranslatef( 2.0f, 0.0f, 0.0f ); glutWireCube( 1 );

glTranslatef( 2.0f, 0.0f, 0.0f ); glRotatef( 45.0f, 0.0f, 0.0f, 1.0f ); glutWireCube( 1 );

M' = M * R * T

M' = M * T * R

Page 20: Potok graficzny 3D

Grafika komputerowa

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();

Page 21: Potok graficzny 3D

Grafika komputerowa

Kamera otworkowa (ang. pinhole camera)

Kamera “komputerowa” symuluje kamerę otworkową z nieskończenie małym otworem przesłony, bez soczewek.

Page 22: Potok graficzny 3D

Grafika komputerowa

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.).

eyep

fovY

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)

Courtesy of Andries van Dam

Page 23: Potok graficzny 3D

Grafika komputerowa

Scena 3D: Field of View

kąt patrzenia (FOV)

powierzchnie obcinające (ang. clipping planes)

Courtesy of Andries van Dam

Page 24: Potok graficzny 3D

Grafika komputerowa

OpenGL: Kamera

glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( fovy, aspect, zNear, zFar ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( eyepX, eyepY, eyepZ, lookpX, lookpY, lookpZ, upX, upY, upZ );

macierz projekcji (GL_PROJECTION)

gluPerspective( 50, 1, 1, 1000); gluLookAt( 0, 0, 7, 0, 0, 0, 0, 1, 0 );

eyep

lookp

zNear

zFar

up

X

Z

Y

Page 25: Potok graficzny 3D

Grafika komputerowa

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)

Page 26: Potok graficzny 3D

Grafika komputerowa

OpenGL: Transformacja z układu modelu do widoku

MModelView = MView * MModel

gluLookAt(...) glScale() glTranslate() glRotate()

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)

xcamycamzcam1

!

"

#####

$

%

&&&&&

=MmodelView

xobjyobjzobj1

!

"

#####

$

%

&&&&&

=Mview •Mmodel

xobjyobjzobj1

!

"

#####

$

%

&&&&&

Page 27: Potok graficzny 3D

Grafika komputerowa

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)

Page 28: Potok graficzny 3D

Grafika komputerowa

OpenGL: Rzutowanie oraz clipping Macierz GL_PROJECTION

gluPerspective(...)

void gluPerspective(double fovY, double aspectRatio, double front, double back) { const double DEG2RAD = 3.14159265 / 180; 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); }

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)

Page 29: Potok graficzny 3D

Grafika komputerowa

OpenGL: Rzutowanie oraz clipping Macierz GL_PROJECTION

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) xclipw

yclipw

zclipw

w

!

"

#####

$

%

&&&&&

=

2 ⋅nearright − left

0 −(right + left)right − left

0

0 2 ⋅nearbottom− top

−(bottom+ top)bottom− top

0

0 0 far + nearfar − near

−2 ⋅near ⋅ farfar − near

0 0 1 0

!

"

#########

$

%

&&&&&&&&&

xcamycamzcam1

!

"

#####

$

%

&&&&&

Page 30: Potok graficzny 3D

Grafika komputerowa

OpenGL: Rzutowanie oraz clipping

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)

Rzut perspektywiczny

Rzut prostokątny

gluOrtho2D(...)

gluOrtho2D(...)

Page 31: Potok graficzny 3D

Grafika komputerowa

OpenGL: Clipping (obcinanie)

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)

Clipping usuwanie obiektów znajdujących się poza polem widzenia, obiekty częściowo znajdujące się w polu widzenia są dzielone na mniejsze

Culling - usuwanie obiektów zasłoniętych przez inne obiekty (np. ang. backface culling).

Page 32: Potok graficzny 3D

Grafika komputerowa

OpenGL: NDC oraz współrzędne ekranu

Normalised Device Coordinates (NDC) 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)

xndcyndczndc

!

"

####

$

%

&&&&

=

xclip /w

yclip /w

zclip /w

!

"

####

$

%

&&&&

Page 33: Potok graficzny 3D

Grafika komputerowa

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)

współ. ekranu (rastra)

xw =xndc +12

⋅width

yw =yndc +12

⋅height

(0,0)

(w,h)

Współrzędne ekranu:

Page 34: Potok graficzny 3D

Grafika komputerowa

OpenGL: NDC oraz współrzędne ekranu

Współrzędne okna na ekranie: glViewport(x, y, w, h);

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)

xwywzw

!

"

####

$

%

&&&&

=

width2

xndc + (x +width2

)

height2

yndc + (y+height2

)

far − near2

zndc +far + near

2

!

"

#######

$

%

&&&&&&&

Page 35: Potok graficzny 3D

Grafika komputerowa

Model oświetlenia

Page 36: Potok graficzny 3D

Grafika komputerowa

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)

Page 37: Potok graficzny 3D

Grafika komputerowa

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)

Page 38: Potok graficzny 3D

Grafika komputerowa

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);

Page 39: Potok graficzny 3D

Grafika komputerowa

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);

Page 40: Potok graficzny 3D

Grafika komputerowa

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);

Page 41: Potok graficzny 3D

Grafika komputerowa

Scena 3D: Materiał Dla materiałów definiuje się ich własności odbijania światła.

ambient diffuse specular

ambinet + diffuse ambinet + diffuse + specular

Page 42: Potok graficzny 3D

Grafika komputerowa

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);

Page 43: Potok graficzny 3D

Grafika komputerowa

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)

powierzchnia odbijająca (specular) - kąt padania równy jest kątowi odbicia

powierzchnia załamująca

Page 44: Potok graficzny 3D

Grafika komputerowa

Rasteryzacja

Page 45: Potok graficzny 3D

Grafika komputerowa

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)

Page 46: Potok graficzny 3D

Grafika komputerowa

Wypełnianie trójkątów (ang. scan conversion)

Określanie, które fragmenty trókątów należą do poszczególnych pikseli obrazu.

Page 47: Potok graficzny 3D

Grafika komputerowa

Rasteryzacja trójkąta - Ang. Edge walking

Pictures courtesy of MIT (lecture 6.837)

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.

Page 48: Potok graficzny 3D

Grafika komputerowa

Cieniowanie pikseli (ang. pixel shading) Obliczanie kolorów fragmentów trójkątów.

Page 49: Potok graficzny 3D

Grafika komputerowa

Teksturowanie Modyfikacja koloru pikseli

Page 50: Potok graficzny 3D

Grafika komputerowa

Łą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

Page 51: Potok graficzny 3D

Grafika komputerowa

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 w każdym kolejnym trójkącie.

Wartości z dla pikseli z wnętrza trójkąta są interpolowane na podstawie położenia wierzchołków trójkąta.

Page 52: Potok graficzny 3D

Grafika komputerowa

Potok graficzny Scena 3D •  wielokąty (położenie wierzchołków XYZ)) •  kolory (wektor RGB) •  wektory normalne (N) •  tekstury (współ. tektury (u,v))

bufor ramki (ang. frame buffer)

transformacja modelu i widoku (współ. lokalne do współ. kamery)

rzutowanie (macierz rzutowania)

przejście do współ. rastrowych

clipping

teksturowanie

cieniowanie

pomijanie niewidocznych pikseli (bufor Z)

•  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.

Page 53: Potok graficzny 3D

Grafika komputerowa

Literatura 1.  Tomas Akenine-Moller, Eric Haines, Naty Hoffman, Real-Time Rendering (3rd

edition), A K Peters, 2008.