Referencje Metoda śledzenia promieni (ang. ray tracing) Kevin Suffern, "Ray Tracing from the Ground Up", A K Peters/CRC Press, 007. Andrew S. Glassner, "An Introduction to Ray Tracing", Morgan Kaufmann, 1989. Wann Jensen, "Realistic Image Synthesis Using Photon Mapping", AK Peters, 001 Radosław Mantiuk Metoda śledzenia promieni (ang. ray tracing) Śledzenie promienia od kamery do obiektów. Algorytm ray tracingu Śledzenie drzewa promieni. Grafika czasu rzeczywistego próbkowanie obiektów sceny promień testujący cienie (ang. shadow ray) promień wtórny odbity (reflected) Backward ray tracing Forward rendering normalna do powierzchni Próbkowanie pikseli obrazu. Cienie, powierzchnie odbijające i przezroczyste (elementy oświetlenia globalnego). Właściwe przesłanianie się obiektów. Brak wzajemnego oświetlania się obiektów o powierzchniach dyfuzyjnych (oświetlenie lokalne). dla każdego piksela obrazu promień pierwotny promień wtórny załamany (refracted) ray casting - bez promieni wtórnych Algorytm ray tracingu (algorytm standardowy) for each PIXEL in the image { generate primary RAY (crossing the pixel) COLOR = background color ENERGY = 1.0 (1) for each OBJECT in the scene { check if RAY intersects OBJECT if( is intersection ) store the closest INTERSECTION (from camera) if( no INTERSECTION at all ) continue (analyse next PIXEL) generate SHADOW_RAY from INTERSETION point for each OBJECT in the scene { check if SHADOW_RAY intersects OBJECT if( is intersection ) break (INTERSECTION point in the shadow) if INTERSETION not in the SHADOW { compute color (solve light equation) COLOR = COLOR + ENERGY * color decrease ENERGY compute secondary RAY Algorytm ray tracingu (algorytm rekurencyjny) (1) for each PIXEL in the image { ENERGY = 1.0 generate primary RAY (crossing PIXEL) COLOR = trace_ray( RAY, background color, ENERGY ) set pixel COLOR function COLOR trace_ray( RAY, &COLOR, &ENERGY ) { INTERSECTION = find_intersection( RAY, true ) if( INTERSECTION == NULL ) return COLOR generate SHADOW_RAY from INTERSETION point INTERSECTION = find_intersection( SHADOW_RAY, false ) if( INTERSECTION!= NULL ) compute color (solve light equation) COLOR = COLOR + ENERGY * color decrease ENERGY if( ENERGY < small value ) return COLOR compute SECONDARY_RAY trace_ray( SECONDARY_RAY, &COLOR, &ENERGY ) goto (1) return COLOR
Algorytm ray tracingu (algorytm rekurencyjny) () Ray tracing, Albrecht Durer (16-ty wiek) function INTERSECTION find_intersection( RAY, closest_intersection ) { INTERSECTION = NULL for each OBJECT in the scene { check if RAY intersects OBJECT if( is intersection ) if(closest_intersection == true ) store the closest INTERSECTION continue else store INTERSECTION break; return INTERSECTION; Kamera Obscura Kamera Aparat fotograficzny Definicja kamery! Definiuje jaka część przestrzeni trójwymiarowej będzie widoczna na wyjściowym obrazie D.! Określa sposób rzutowania (prostokątne, perspektywiczne, itp.). xres up lookp twist! kąt patrzenia FOV (ang. Field of View)! punkt położenia kamery! punkt, na który patrzy kamera! kąt skręcenia kamery! rozdzielczość pionowa i pozioma yres! orientacja obrazu! aspekt (ang. aspect ratio) FOV eyep Courtesy of Andries van Dam
Parametryczne równanie wektora/promienia Równanie promienia w postaci uwikłanej (ang. implicit): ray = pos + t dir Obliczanie kierunku promienia pierwotnego (1) Obliczenia dla piksela o współrzędnych (i,j) i obrazu o maksymalnej rozdzielczości (width, height). ray.x = pos.x + t dir.x ray.y = pos.y + t dir.y ray.z = pos.z + t dir.z! # u x v x o x dir = # u y v y o y # "# u z v z o z $! & i $ # & & # j & & # %& " 1 & % (i, j) pos Obliczanie kierunku promienia pierwotnego () up look u = up look o look u v v = u look u look o = look look width tan( FOV ) width u height v width u Obliczanie przecięć promienia z obiektami Wyrażenie wektorów w proporcjach wielkości obrazu. x tan FOV = look width x width x height v Obliczanie przecięć: przecięcie promienia z kulą Przecięcie promienia z kulą: szukanie punktów wspólnych wektora i kuli. x o = r x = pos + t dir pos + t dir o = r v = pos o v + t dir = r v + t dir + v t dir = r położenie kamery (dir )t + (v dir)t + (v r ) = 0 równanie kuli (w postaci uwikłanej, ang. implicit) równanie promienia pos t punkt przecięcia o środek kuli t - odległość od kamery do punktu przecięcia liczona wzdłuż promienia. Wybieramy najmniejszy dodatni parametr t r Obliczanie przecięć: przecięcie promienia z kulą Przecięcie promienia z kulą: szukanie punktów wspólnych wektora i kuli. Δ < 0 Δ > 0 Δ = 0 Wybieramy punkt przecięcie z najmniejszym dodatnim parametrem t A t + B t + C = 0 Δ = B 4 A C t = B ± Δ A
Obliczanie przecięć: przecięcie promienia z trójkątem Obliczanie przecięć: przecięcie promienia z trójkątem 1. Przecięcie z płaszczyzną A x + B y + C z + D = 0 t = -(A*pos.x + B*pos.y + C*pos.z + D) / (A*dir.x + B*dir.y + C*dir.z). Rzutowanie punktów na płaszczyznę (z zachowaniem maksymalnej powierzchni trójkąta po rzutowaniu) 3. Sprawdzenie czy punkt przecięcia leży wewnątrz trójkąta (http://www.blackpawn.com/texts/ pointinpoly/default.html) Tomas Moller, Ben Trumbore, "Fast, Minimum Storage Ray/Triangle Intersection" Tomas Moller, Ben Trumbore, "Fast, Minimum Storage Ray/Triangle Intersection" Model oświetlania (model Phong'a) Równanie oświetlenia obliczane dla każdego punktu przecięcia i każdego źródła światła. Obliczanie koloru powierzchni i tot = i amb + N k=1 k (i diff k + i spec ) i amb = m amb s amb i diff = m diff s diff (l n) i spec = m spec s spec (v r) m shi v r vρ r n l n l p r = (n l) n l Równanie oświetlenia (model Blinna) Obliczenie koloru w wierzchołkach wielokątów na podstawie parametrów powierzchni oraz parametrów źródeł światła. i tot = i amb + N k (i diff k=1 k + i spec ). Wektor normalny: Sfera punkt przecięcia: p = ray.pos + t ray.dir i amb = m amb s amb i diff = m diff s diff (l n) i spec = m spec s spec (n h) m shi v ρ h 1 / 1 / p n l h = l + v l + v kierunek wektora normalnego: n = normalize(p o) o p
Promień wtórny odbity (ang. reflection) Kierunek promienia odbitego od powierzchni: Promienie wtórne v ' = v ( v n) n v s s dla znormalizowanych wektorów v i n v s v ' = v + s = v + n cosφ in = v + n ( v n) = v ( v n) n Prawo Snell'a: promień wtórny załamany (ang. refraction) Zależność pomiędzy kątem padania i kątem załamania promienia: Drzewo promieni Śledzenie drzewa promieni: funkcje rekurencyjne, - współczynniki załamania ośrodków (stosunek prędkości światła w próżni do prędkości w danym ośrodku) Materiały przezroczyste Absorbcja światła (eneria zamienia się na ciepło), prawo Beer'a-Lambert'a: I - intensywność światła po przejściu przez ośrodek, Io - Intensywność światła wchodzącego do matariału - współczynnik absorbcji zależny od rodzaju matariału x - grubość matariału Teksturowanie Modyfikacja koloru obliczonego za pomocą równania oświetlenia. Etapy tekturowania: 1. Mapowanie tekstury: obliczenie współrzędnych (u,v) testury dla danego punktu przecięcią.. Filtracja tekstury i obliczenie współrzędnych teksela (s,t). 3. Modyfikacja koloru poprzez wymnożenie wartości koloru razy kolor teksela. Dyfuzja/rozproszenie (ang. diffusion/scattering) - odbicie lub załamanie światła jednocześnie w wielu kierunkach. Stopień i charakter rozproszenia zależy od wartości współczynników załamania dwóch ośrodków oraz od stosunku długości fali świetlnej do wielkości molekuł w ośrodku rozpraszającym.
Teksturowanie: mapowanie sferyczne Obliczenie współrzędnych teksela (s,t) dla puntu przecięcia (x,y,z) (r promień kuli, s,t w zakresie <0,1>): Figury otaczające (ang. bounding volumes) Przyśpieszanie obliczania przecięć. s = acos(z / r) / pi t = acos(x / (rsin(pi * s))) / pi Modyfikacja koloru piksela bądź składowej diffuse koloru piksela. Hierarchia figury otaczających Łączenie figur otaczających w podgrupy.. Jednorodny podział przestrzeni (ang. uniform spatial subdivision) Podział przestrzeni sceny na woksele i przyporządkowanie każdemu wokselowi listy obiektów. grid - struktura wokseli wskazniki do list obiektów występujących w poszczególnych wokselach: void* cells[x][y][z] Algorytm 3DDDA Szukanie kolejnych wokseli, przez które przechodzi promień. ray = pos + t *dir Struktura drzewa ósemkowego (ang. octree) Efektywniejszy podział przestrzeni (mniej pustych wokseli). Bardziej skomplikowane śledzenie promienia przez woksele. (x+1,y+1) (x+,y+1) ysize ystart (x,y) xstart (x+1,y) xsize (x,y) = indeks początkowego woksela xstep = xsize/dir.x ystep = ysize/dir.y dx = xstart/dir.x dy = ystart/dir.y while((x,y) in grid) { if( dx < dy ) { x++; dx += xstep; else { y++; dy += ystep;
Podział k-d Tree Podział podobny jak dla octree, ale rozmiary wokseli mogą być dowolne i różne w kierunkach x,y i z. Struktura drzewa BSP (ang. BSP tree) Podział przestrzeni płaszczyznami o dowolnym położeniu (nie muszą być ortogonalne). Trudne szacowanie dobrego podziału przestrzeni. Bardziej skomplikowane śledzenie promienia przez woksele. Efektywniejszy podział przestrzeni w stosunku do oct-tree. Anty-aliasing (ang. anti-aliasing) (1) Zmniejszanie aliasingu w syntezowanych obrazach. Anty-aliasing (ang. anti-aliasing) () Próbkowanie stochastyczne (ang. stochastic sampling) - podział piksela na regiony i wysyłanie promieni pierwotnych przez losowy punkt w każdym z regionów. Końcowy kolor jest sumą ważoną wartości koloru dla poszczególnych próbek. Supersampling - kilka promieni pierwotnych na jeden piksel i uśrednianie rezultatów Antyaliasing adaptacyjny Obliczanie koloru dla dodatkowych promieni pierwotnych wysyłanych pomiędzy pikselami, dla których: różnica kolorów jest duża, promienie trafiają w różne obiekty, różnica pomiędzy kierunkami wektorów normalnych jest duża. Kolor piksela obliczany jest jako średnia arytmetyczna wszystkich kolorów obliczonych dla promieni wysyłanych w obrębie tego piksela.
: Głębia ostrości