Metoda globalne osvetlitve Simulacija svetlobnih žarkov naravna osvetlitev odboji lom svetlobe mehke sence globinska ostrina zabrisano gibanje Uporaba v animaciji, filmih/reklamah, simulaciji Začetki Appel 1968 (metanje žarka), Whitted 1980 (sledenje žarku) Sledenje žarku Christmas Baubles" by Jaime Vives Piqueres POV-Ray Disney/Pixar: Cars 2
Sledenje žarku kako Realnost: žarke generirajo svetlobni viri in potujejo do očesa za tovrsten izračun moramo slediti veliko žarkom, le malo pa jih pride do očesa Oko Slika Luč Žarki svetlobe Obrnemo situacijo: Predmet sledimo žarkom od očesa preko vseh pikslov v sliki in gledamo kam se zaletijo Luč Slika Oko Predmet
Metanje žarka: je prvi del algoritma sledenja žarku, uporablja se tudi pri prikazu polnih teles (CSG) prikazu vokslov odstranjevanju zakritih površin Koncept: sledimo žarku svetlobe od očesa do presečišča s prvim predmetom en žarek skozi vsak piksel v končni sliki v presečišču s predmetom izračunamo barvo z osvetlitvenim modelom če žarek ne seka nobenega predmeta, je piksel črn Metanje žarka ray casting gledalec (kamera) Luč ravnina gledanja (slika) predmeti
Metanje žarka ray casting // okvirni algoritem Image image = new Image (width, height) ; for (int i = 0 ; i < height ; i++) for (int j = 0 ; j < width ; j++) { } return image ; Ray ray = RayThruPixel (cam, i, j) ; Intersection hit = Intersect (ray, scene) ; image[i][j] = FindColor (hit) ; gledalec (kamera) Luč predmeti ravnina gledanja (slika)
Kako za nek piksel slike izračunati smer žarka Konstrukcija žarka: koordinatni system kamere je u, Ԧv, w slika (velikosti n x n y ) je pravokotna na w kamere in na razdalji d od kamere koordinate (u, v, w) piksla (i, j) v koordinatah kamere so: u = l + r l i+0.5 n x v = b + t b j+0.5 n y w = d izvor žarka je e smer žarka: Ԧd = uu + v Ԧv dw piksel na sliki: p = e + Ԧd Parametrična enačba žarka: r t = e + t p e = e + t Ԧd w gledalec (kamera) Konstrukcija žarka e Ԧv u Ԧd l p r t b ravnina gledanja (slika)
Kako ugotovimo ali in kje žarek preseka predmet? odvisno od prestavitve predmeta poligoni, parametrična itn. Žarek je predstavljen parametrično kot Luč Preseki predmeti r t = e + t Ԧd Iščemo torej vrednost t pri kateri žarek preseka nek predmet najmanjši t > 0 bo najbližji presek Iskanje presekov je najbolj časovno zahteven del pri tej metodi in iz nje izpeljanih (npr. sledenje žarku) gledalec (kamera) ravnina gledanja (slika)
Enostaven primer se večkrat uporablja, saj krogla pogosto predstavlja očrtano telo (bounding ball) predmeta Kroglo implicitno predstavimo kot: p c p c r 2 = 0 Vstavimo enačbo žarka e + t Ԧd c e + t Ԧd c r 2 = 0 t 2 Ԧd Ԧd + 2t Ԧd e c + e c e c r 2 = 0 e Ԧd Presek s kroglo c
Rešimo kvadratno enačbo Presek s kroglo Ԧd e c ± Ԧd e c 2 Ԧd Ԧd e c e c r 2 Ԧd Ԧd 2 realni pozitivni ničli: manjša je prvi presek dvojna ničla: tangenta ena pozitivna ena negativna ničla: žarek se začne v krogli in gre ven kompleksni ničli: žarek ne seka krogle dovolj je, da pogledamo, če je izraz pod korenom negativen, da vemo ali žarek seka kroglo ali ne
Za izračun osvetlitve v točki preseka potrebujemo tudi normalo Pri krogli enostavno: točka preseka je p n = p c p c n p Presek s kroglo c
Presek s trikotnikom V težiščnem k.s. predstavimo točko p kot p = a + β b a + γ c a c p = αa + βb + γc, α + β + γ = 1 Vstavimo enačbo žarka g c-a p e + t Ԧd = a + β b a + γ(c a) Dobimo sistem treh enačb (x, y, z) in treh neznank (t, β, γ), ki ga rešimo Če velja a b b-a b t > 0 in 0 < γ < 1 in 0 < β < 1 γ je točka znotraj trikotnika
Ker je poligon planaren, lahko najprej izračunamo presek z ravnino, na kateri je poligon Enačba ravnine p p 1 n = 0 Vstavimo enačbo žarka in dobimo t: t = p 1 e n Ԧd n Ostane t.i. point in polygon problem: ali je točka preseka v poligonu npr. štetje kolikokrat vodoraven žarek iz točke preseka seka poligon: če lihokrat, je točka v poligonu, sicer ni Presek s planarnim poligonom p 1
Ostali preseki Algoritmov za določanje presekov je cela vrsta, ker je to časovno najbolj kritičen del algoritma metanja (in sledenja) žarka stožci, valji, elipsoidi, kocke (veliko se uporabljajo za omejevanje bounding box)
Presek z najmanjšim t Kako najti prvi presek v sceni
Ko izračunamo presek žarka s telesom, izračunamo še osvetlitev osvetlitev se torej računa v vsaki točki (pikslu slike) Osvetlitveni model je lahko Phongov I = k a I a + I i k d L N + k s V R p k a - ambientalna svetloba k d, k s - difuzna in zrcalna komponenta p zrcalni koeficient Metanje žarka - osvetlitev gledalec (kamera) luč jakost luči I a, I i
Metanje žarka upošteva tudi sence v vsaki točki preseka pošljemo senčni žarek (shadow ray) proti vsaki luči če je na poti kak predmet, je točka v senci (V i = 0), sicer ni (V i = 1) Sence luč I = k a I a + V i I i k d L N + k s V R p gledalec (kamera)
Sledenje žarku Metoda globalne osvetlitve Osnova je metanje žarka Žarku sledimo tudi po prvem dotiku s predmetom v dve smeri: popolni odboj za materiale, ki imajo zrcalno komponento v primeru prozornega materiala tudi prepuščeni žarek Pri obeh novih žarkih ponovimo celoten postopek sledenja Postopek rekurzivno ponavljamo gledalec (kamera) Turner Whitted 1980 senčni žarek prepuščeni žarek odbiti žarek
Kdaj rekurzijo pri nekem žarku ustavimo? ko žarek zadene luč (dobi barvo luči) ko žarek ne zadene ničesar (tema) Ta dva pogoja nista dovolj, omejiti moramo globino rekurzije koliko nivojev rekurzije rabimo? Odvisno od kompleksnosti scene, npr. 4 z večjo globino raste tudi kompleksnost, saj moramo slediti vse več žarkom in računati vse več presekov gledalec (kamera) s 3 r 1 s 1 Rekurzija t 1 s 2 t 3 r 3 r 2 t 2
Odboj Odbiti žarek računamo kot popolni odboj m = n n Ԧd Ԧs = Ԧd + m Ԧr = m + Ԧs = Ԧd + 2m = Ԧd 2n n Ԧd S n m S d - vstopni žarek Nov odbiti žarek je torej parametrično zapisan kot: odbiti žarek r p r t = p + t Ԧr
Prosojni materiali (steklo, voda itn.) prepuščajo svetlobo in jo tudi lomijo svetloba se upočasni, ko preide v bolj gost medij Velja Snellov zakon: η d sin θ d = η t sin θ t η d - lomni količnik v snovi vstopnega žarka η = η t - lomni količnik v snovi prepuščenega žarka hitrost svetlobe v vakuumu hitrost svetlobe v mediju η zrak ~1, η voda += 1,33, η steklo = 1,5 prepuščeni žarek t Lom svetlobe n vstopni žarek d d t P
Primer voda η = 1.333 hitrost svetlobe v vodi ~ 225056 km/s Zrak-voda Vstopni kot: θ i : 60 η d sin θ d = η t sin θ t Prepuščeni kot θ t : 40.53 v vodi je svetloba počasnejša, se lomi navznoter Voda-zrak (nazaj) Vstopni kot θ d : 40.53 Prepuščeni kot θ t : 60 na zraku je svetloba hitrejša, se lomi navzven Pri vstopu v hitrejši medij lahko pride do popolnega notranjega odboja ko je kot vstopne svetlobe prevelik Primer θ d voda Lom svetlobe wiki θ d θ t voda θ t zrak zrak
Smer prepuščenega žarka izpeljemo iz Lom svetlobe η d sin θ d = η t sin θ t Dobimo: n vstopni žarek Ԧd Ԧt = η d Ԧd n n Ԧd n 1 η 2 d η i η 2 1 n Ԧd 2 i d P t prepuščeni žarek Ԧt
Osvetlitev v točki računamo kot pri metanju žarka, le da prištejemo še deleže svetlobe I r in I t, ki pridejo od obeh novih žarkov (po rekurzivnem sledenju) I = k a I a + I i k d L N + k s V R p + s 1 Osvetlitev k r I r + k t I t I r rekurzivni zrcalni prispevek k r - zrcalni koeficient (Fresnel) I t rekurzivni prepustni prispevek k t - prepustni koeficient (Fresnel) Dejansko osvetlitev torej lahko izračunamo šele po koncu rekurzije s 3 s 2 t 1 r 1 t 3 r 3 r 2 t 2
Osnovni algoritem sledenja žarku ima pomanjkljivosti, izgled slik je precej umeten ostri robovi trde sence vse je v fokusu površine perfektno sijejo steklo perfektno prepušča svetlobo Veliko pomanjkljivosti odpravlja t.i. sledenje porazdeljenim žarkom - distribution/distributed ray tracing Namesto enega žarka delamo v vsaki fazi z več žarki (porazdelitev žarkov) Sledenje porazdeljenim žarkom
Mehčanje robov Namesto enega žarka iz očesa pošljemo skozi vsak piksel več žarkov supersampling fiksno število žarkov adaptivno (začnemo z majhnim številom, če so rezultati zelo različni, število povečamo) navadno žarke naključno stresemo (jitter) Končna barva piksla je uteženo povprečje barv vseh žarkov Dobimo bolj mehke prehode med ostrimi kontrasti (antialiasing) En žarek Več enakomerno porazdeljenih žarkov Več žarkov, naključno stresenih (jitter)
Mehčanje robov En žarek Več žarkov
Mehke sence Točkasta luč ni realističen model trde sence Luči naj zajemajo večjo površino površinska luč (area light) polsenca senca polsenca
Mehke sence V luč pošljemo več (nekoliko naključno porazdeljenih) senčnih žarkov, porazdeljenih po njeni površini, seštejemo doprinose število zadetkov/število žarkov = %osvetlitve
Mehki odboji Pri standardnem sledenju žarkov so odboji preveč podobni zrcalu idealni Zaradi grobosti materialov so v realnosti precej bolj zabrisani Idejo prenesemo tudi na odbite žarke; namesto enega jih ustvarimo več v (nekoliko naključnih) smereh uporabimo lahko lastnosti materiala (BRDF ali Phong) za določanje števila in smeri
Prosojnost - translucency Difuzna prozornost Kot za odbite žarke, lahko tudi pri prepuščenih žarkih ustvarimo več naključno porazdeljenih žarkov okoli idealnega žarka Dobimo efekt prosojnosti oz. polprozornosti
Globinska ostrina: področje okoli fokusne razdalje, v katerem je slika še vedno sprejemljivo ostra Globinska ostrina neostro fokus ostro neostro globinska ostrina Lord of the Rings, Newline Cinema
Globinska ostrina RG kamera: idealna, vsi žarki gredo iz ene točke (leča velikosti 0), vse je ostro ena točka v sceni = ena točka na sliki Leča: bolj realističen model, žarki razporejeni po leči ena točka na sceni = krožec na sliki, razen za točke v fokusni ravnini slika leča fokusna ravnina neostrinski krožec
Simuliramo jo s porazdelitvijo žarkov po površini leče Slika je postavljena na fokusno ravnino Primer na desni: idealna RG kamera: vsi žarki gredo iz B piksel D dobimo z žarkom BD piskel E dobimo z žarkom BE z globinsko ostrino: žarki so porazdeljeni po ravnini leče slika je na fokusni ravnini piksel D dobimo iz AD, BD, CD piskel E dobimo iz AE, BE, CE leča A B C Globinska ostrina fokusna ravnina slika E D
Zabrisano gibanje Zabrisano gibanje - motion blur žarke porazdelimo po času in povprečimo Predmeti, ki se premikajo, bodo zamegljeni
Sledenje žarkov - pohitritve Sledenje žarkov je počasna metoda, predvsem zaradi potrebe po računanju presekov Primer slika 1280x1024, 10 žarkov/piksel 1000 predmetov (trikotniki, CSG, NURBS) 3 nivoji rekurzije 39.321.600.000 testov presekov 1.000.000 testov/sekundo -> 10.9 ur! Moramo uporabiti metode za pohitritev!
Kompleksne predmete postavimo v telesa, s katerimi lahko enostavno izračunamo preseke očrtana telesa (glej poglavje o tehnikah razdelitve prostora) če žarek ne seka očrtanega telesa, ne seka predmeta v njem Očrtana telesa (npr. z osmi poravnane kvadre) postavimo v drevo (glej prej omenjeno poglavje o AABB, OBB drevesih) vozlišče drevesa je očrtano telo celotnega poddrevesa v listih so predmeti Ko sledimo žarkom, začnemo pri korenu drevesa (celotna scena) in nadaljujemo proti predmetom v listih Hierarhije očrtanih teles (BVH)
Razdeljevanje prostora Uporabimo lahko tudi druge tehnike razdelitve prostora (glej poglavje o tehnikah razdelitve prostora) navadna mreža, octree, BSP drevo, kd drevo Prostor razdelimo na podprostore (največkrat drevo podprostorov) Hierarhično računamo preseke žarka, dokler ne pridemo do posameznih primitivov (trikotnikov ipd.), s katerimi računamo presek
Navadna mreža Sceno razdelimo z mrežo kock Problem je v ločljivosti mreže premalo pridobimo, če je mreža pregroba preveč računanja je potrebno, če je mreža prefina
Octree Adaptivna mreža Sceno rekurzivno delimo na kocke vsaka kocka ima 8 podkock deljenja v globino npr. ustavimo, ko kocka vsebuje le en predmet Dobimo hierarhično drevo manj testov presekov kot z navadno mrežo
BSP drevo Prostor rekurzivno delimo z ravninami vsaka ravnina razdeli prostor na 2 polovici Dobimo binarno drevo Gradnja počasna (izbira ravnine, dosega uravnoteženosti), zato pa potrebujemo malo testov presekov v nasprotju z ostalimi tehnikami, ki temeljijo na kockah, zelo primerna za trikotnike ravnine so lahko poševne
Sledenje žarku v realnem času S povečevanjem hitrosti in pojavom GPU prihajamo v čas, ko je sledenje žarku z ustreznimi kompromisi že mogoče v realnem času ključ je v različnih tehnikah pohitritve Nvidia RTX demo Nvidia OptiX API for real-time ray tracing Microsoft DXR API for real-time ray tracing Metro Exodus: GeForce RTX Real-Time Ray Tracing (2018)
Sledenje žarka vs. prava globalna osvetlitev Sledenje žarka upoštevamo le zrcalne odboje Sledenje poti (path tracing) upoštevamo tudi difuzne odboje
+ Prosojnost + Odboji + Sence + Dokajšen realizem z dodatki, kot je sledenjem porazdeljenim žarkom + Kar se hitrosti tiče, s primerno razdelitvijo prostora ni zelo občutljivo na število poligonov pri res velikih scenah je lahko hitrejše od konvencionalnih metod - Za res realistične efekte moramo računati z veliko količino žarkov -> počasno, kljub pohitritvam - Ni popolna globalna osvetlitev - ni pravih difuznih odbojev, ni puščanja barve (color bleeding), kavstike (caustic) Sledenje žarku - zaključek Gilles Tran, POV-Ray
P.H. Christensen et al. Ray Tracing for the Movie Cars J.P. Schulze: Introduction to Computer Graphics (slides) N. Guid: Računalniška grafika, FERI Maribor REFERENCE J.D. Foley, A. Van Dam et al.: Computer Graphics: Principles and Practice in C, Addison Wesley