Daniele Marini Modelli di illuminazione globali: ray tracing Introduzione • Ad oggi abbiamo visto modelli locali in cui le primitive sono trattate in modo indipendente le une dalle altre in base a: – Proprietà della primitiva – Posizione della camera/osservatore – Posizione delle luci • Vantaggi: semplicità, parallelizzazione, costo costante per primitiva Ray tracing e scan conversion for each triangle in scene… • Nella scan conversion (pipeline grafica) considero i poligoni uno alla volta e li proietto sull immagine • Eseguo la discretizzazione alla fine A.vanDam Modelli locali I = I a ka + ∑m f att I p [kd n ⋅ l + k s (r ⋅ v) n ] ! % $ # % "$" # ambiente diffusa v r n θ θ l speculare • Non mi serve conoscere l intera scena • La componente di luce ambiente è una approssimazione dell illuminazione gobale • Il modello di Phong descrive le superfici glossy Modelli locali • Il modello di Lambert e quello di Phong sono approssimazioni della BDRF Lr (θ r , φr ) = ∫ f r (θ i , φi ,θ r , φr )dLi (θ i , φi ) cosθ i dωi Ω Limitazioni dei modelli locali • Ombre portate: il modello locale non calcola le ombre • Non riesco a rappresentare l effetto che il colore di una superficie ha sulle superfici adiacenti (interriflessione, color bleading) Cosa vogliamo ottenere ? • Il calcolo delle ombre • La riflessione speculare tra gli oggetti – Nei modelli locali la riflessione è solo tra superficie e sorgente di illuminazione • La riflessione diffusiva tra gli oggetti nella scena (inter-riflessione) Modelli globali • Paradigmi di rendering basati sull effetto complessivo della scena • La luce non proviene direttamente dalle sorgenti ma può arrivare da altre superfici • Ray Tracing – Basato su ray casting (tracciamento dei raggi), ottica geometrica • Radiosity – Ottica radiativa Riflessione tra superfici • Assumendo che vi siano due tipi di superfici ideali nella scena (diffusive e speculari) vi sono 4 meccanismi di trasmissione della luce tra superfici: • Ray tracing modella la situazione a), Radiosity la situazione d). Esempio Philipp Slusallek Ray tracing • Considera i raggi luminosi nella scena ed il loro contributo nel determinare il flusso di energia luminosa che raggiunge l osservatore Ray tracing • I raggi luminosi prodotti dalla sorgente di luce possono giungere all osservatore direttamente o dopo riflessione/rifrazione/ trasmissione sulle superfici della scena Ray tracing • La maggior parte dei raggi prodotti dalla sorgente di luce non raggiungono l osservatore • Calcolo all indietro la storia del cammino percorso dalla radiazione luminosa che ha raggiunto l osservatore Ray tracing • Non considero gli infiniti raggi che arrivano alla camera • Si considerano tutti i pixel e si traccia il raggio di proiezione (raggio primario) • Il raggio è una semiretta uscente dal COP che interseca il piano di vista Ray tracing e scan conversion for each sample in pixel image… • Nel ray tracing parto dai pixel • Eseguo la discretizzazione all inizio Ray casting Algoritmo: Per ogni pixel: traccio il raggio ottico che lo attraversa determino le intersezioni del raggio con gli oggetti considero l intersezione più vicina all osservatore ..... Ray casting • Risolvo un problema di visibilità Ray casting • Il raggio viene rappresentato in forma parametrica: l intersezione con valore più piccolo del parametro è quella più vicina p(t ) = p0 + td Ray casting l n v .... Determino il colore del punto in base alla normale della superficie e alla posizione della luce Ray casting • Fin qui sto facendo un ray-casting, ed il risultato non è diverso da ciò che avrei ottenuto con I modelli locali, con il vantaggio che è più facile il rendering di superfici semplici tipo sfere Ray tracing • Se si usa un modello di shading locale (Phong) fin’ora il risultato sarebbe uguale • Con tutta la scena a disposizione, per determinare lo shading di un punto ci possiamo guardare intorno e calcolare – Ombre proiettate – Riflessione – Trasparenza e rifrazione Ray tracing • Whitted (1979) • Il raggio non viene arrestato alla prima intersezione ma vengono considerati ulteriori raggi Ray tracing: ombre • Quanta luce nel punto? • Traccio un raggio ombra per stabilire se il punto è illuminato direttamente dalla sorgente • Se il raggio ombra interseca degli oggetti, il punto è in ombra Ray tracing: ombre B A n v raggio ombra L oggetto riceve luce direttamente dalla sorgente: non è in ombra Ray tracing: ombre A n B v raggio ombra Il raggio ombra interseca l oggetto B: l oggetto A è in ombra rispetto alla sorgente Ombre • Le ombre proprie sono quelle che si producono sui corpi nelle zone che non ricevono la luce; le ombre portate (o proiettate) sono quelle che il corpo proietta nell'ambiente circostante, interrompendo il flusso luminoso. • Le ombre autoportate sono quelle che il corpo proietta su sé stesso, ad esse è dovuto l'effetto di rilievo. Da R. Migliari, La prospettiva della luce Raggi ombra • Il tracciamento dei raggi ombra consente di determinare sia le ombre proprie che le ombre portate Riflessione speculare • Se la superficie ha riflettività speculare devo valutare il raggio di riflessione speculare • Il colore dipende dalla luce incidente nel punto dalla direzione da cui può provenire la radiazione riflessa • Traccio il raggio corrispondente e vedo da dove proviene v n θ θ l Ray tracing: riflessioni B raggio riflesso lr A lr v n v n l Rifrazioni • Con analoga strategia posso tracciare anche un raggio secondario in caso di oggetto trasparente (raggio di rifrazione) lt lt Rifrazione Un raggio che colpisce un oggetto totalmente o parzialmente trasparente è rifratto secondo la legge di Snell: sin θ1 η 2 = = ηr sin θ 2 η1 l n η1 θ1 θ2 t t = nηr (n ⋅ l) − n 1 −ηr2 (1 − (n ⋅ l) 2 ) −ηrl η2 Ray tracing Algoritmo: Per ogni pixel: traccio il raggio che lo attraversa determino le intersezioni del raggio con gli oggetti considero l intersezione più vicina all osservatore considero i raggi secondari (ombra, riflessione, trasmissione) Ray tracing • Modello di Whitted (estensione di Phong): I = I a k a + ∑l f att I l [k d (n ⋅ l) + k s (r ⋅ v) n ] + k s I s + kt I t ! ! ! %$# % "$" # ambiente riflessa trasmessa / rifratta diffusa speculare %"" " $""" # ricorsive n r l n r θ θ l v Ldiffusa = k d Li cosθ i = k d Li (l⋅ n) Dalle altre superfici considero solo il contributo per riflessione speculare o trasmissione Ray tracing • L algoritmo è ricorsivo, ogni raggio primario genera dinamicamente un albero di raggi Raggi T3 R2 N2 T1 R1 L2 N3 N1 L1 Eye R3 L1 L3 R1 Eye T1 L2 L3 Ni normale alla superficie Ri raggio riflesso R2 R3 Li raggio ombra Ti raggio trasmesso (rifratto) Cutler and Durand T3 Ricorsione • Quando termino? – Profondità massima di ricorsione • Mi fermo dopo aver generato un certo numero di raggi – Soglia minima di contributo 0 ricorsione 1 ricorsione 2 ricorsione Cutler and Durand Riassumendo • Assunzione: lo spazio è trasparente (mezzo nonpartecipante) • Superfici: modelli geometrici 3D • Sono note le caratteristiche delle superfici – Riflessione, rifrazione, … • Illuminazione – Sono note le posizioni delle sorgenti e le loro caratteristiche Riassumendo Passi fondamentali: • Generazione dei raggi primari • Intersezione con gli oggetti • Shading – Determinare l intensità luminosa lungo il raggio primario (colore del pixel) – L intensità in arrivo sulla superficie è determinata dai raggi secondari • Raggi ombra • Raggio speculare: nella direzione di riflessione speculare perfetta • Raggio di rifrazione: nella direzione di trasmissione della luce Implementazione • L aspetto fondamentale dell algoritmo è il calcolo dell intersezione raggio-superficie, cioè quanto è efficiente il calcolo dell intersezione tra un segmento 3D e una primitiva di modellazione • La maggior parte del tempo di esecuzione di un ray tracer è nel calcolo delle intersezioni raggio-oggetti Tracciare i raggi • Il modello è la pinhole camera – – – – o: Origine (COP) f: Vettore al centro del piano di vista x, y: Coordinate sul piano di vista xres, yres: Dimensione del piano for (x= 0; x < xres; x++) for (y= 0; y < yres; y++) { d= f + 2(x/xres - 0.5)⋅x + 2(y/yres - 0.5)⋅y; d= d/|d|; // Normalize col= trace(o, d); write_pixel(x,y,col); } x y u d o f Calcolo delle intersezioni • Rappresentazione implicita di una superficie f (x, y, z) = f (p) = 0 • Raggio in forma parametrica • Le intersezioni sono date dalle soluzioni dell equazione: p(t ) = p0 + td f (p0 + td) = 0 Raggio-sfera • L intersezione si può calcolare in modo semplice per superfici quadriche. Consideriamo una sfera di raggio r: (p − p c )(p − p c ) − r 2 = 0 • Otteniamo l equazione d ⋅ dt 2 + 2(p 0 − p c ) ⋅ dt + (p 0 − p c ) ⋅ (p 0 − p c ) − r 2 = 0 Raggio-piano • Equazione del piano p ⋅n − c = 0 • Equazione del raggio p(t ) = p0 + td • Calcolo il punto di intersezione c − p0 ⋅ n t= d ⋅n raggio n d xn x + yn y − c = 0 n = (−1,1) • Nell esempio, se p0=(0,0) e d=(-1,1) risulta t=1 c = 2 y = 2+ x Raggio-triangolo • Equazione del triangolo c p(α , β , γ ) = αa + βb + γc α + β +γ =1 α ≥ 0, β ≥ 0, γ ≥ 0 α = 1− β − γ p( β , γ ) = a + β (b − a) + γ (c − a) a p b • Ho un sistema lineare in 3 equazioni e tre incognite p0 + td = a + β (b − a) + γ (c − a) Raggio-triangolo boolean RayTri(ray r, vec3 a, vec3 b, vec3 c, interval[t0, t1] compute t if(t<t0)or(t>t1) then return false compute γ if(γ<0)or(γ>1) then return false compute β if(β<0)or(β>1-γ) then return false return true Problemi • Ci possono essere problemi di precisione Cutler and Durand Costo computazionale • L algoritmo è computazionalmene oneroso • Il costo dipende dall enorme numero di test di intersezione tra raggio e superficie • Tecniche per velocizzare: • Implementazioni parallele in cui l immagine da realizzare viene partizionata su più nodi di calcolo • Adozione di opportune strutture dati: – Bounding volume – Suddivisione dello spazio Bounding volume • Per semplificare il test di intersezione, racchiudo l oggetto con una superficie semplice • Posso usare strutture gerarchiche ( Hierarchical bounding volumes) • Quali tipi di volumi? Partizionamento dello spazio • Partizionamento dello spazio in regioni non sovrapposte: – Griglia uniforme – Octree – kD tree Griglia uniforme • Viene fatto il test sulle primitive che sono all interno dei voxel attraversati dal raggio • Limitazioni: risoluzione costante, non si adatta alla scena Octree • Suddivisione non uniforme dello spazio • Limitazioni: algoritmo di attraversamento più complesso kD trees • Suddivisione non regolare dello spazio mediante piani paralleli al sistema di riferimento • Input: – volume che contiene la scena (bounding box) – lista di primitive kD trees • PASSI: – Suddivisione dello spazio (cella) in due parti (left, right) usando un piano ortogonale a un asse. DOVE? – Ricorsione – STOP • La strategia di suddivisione implica minimizzare una funzione costo: Costo (cella) = Cattraversamento + cella P(left cella )C (left ) + P(right cella )C (right ) kD trees • Probabilità condizionata: sapendo che il raggio attraversa la cella, qual è la probabilità che attraversi la porzione left? raggi che attraversano la porzione left )= cella raggi che attraversano la cella • Si può rappresentare con il rapporto tra aree: P(left Aleft Acella kD trees Costo(cella) = Cattraversamento + cella Aleft Acella C (left ) + Aright Acella C (right ) • Il costo di ciascuna porzione è il tempo per calcolare le intersezioni con le primitive, che consideriamo proporzionale al numero di primitive Distributed ray tracing • Le immagini prodotte con il ray tracing visto sino ad ora sono molto innaturali: – Riflessioni speculari nette – Ombre nette – Seghettature R.L.Cook, T.Porter,L.Carpenter, Distributed Ray Tracing, Computer Graphics, 1984 Distributed ray tracing • E una strategia di ray tracing che permette la simulazione di numerosi effetti mediante il tracciamento di più raggi: – – – – – Riflessioni speculari sfumate (glossy) Traslucenza Penombra Profondità di campo Motion-blur Distributed ray tracing • La soluzione dell equazione del rendering richiede il calcolo di integrali .... d ω ∫ • Con il ray tracing discretizziamo l integrale ad un solo punto • Con il distributed ray tracing prevediamo più campioni Ombra • Il meccanismo del raggio ombra assume che la sorgente di luce sia puntiforme: assenza di penombra: un solo raggio produce ombre nette Cutler and Durand Ombra • La penombra la posso generare in un ray tracer tradizionale sostituendo la sorgente con N sorgenti puntiformi Ombra • Svantaggi: – Aumento la complessità – Ho delle ombre nette nella penombra • Soluzione: considero un insieme infinito di sorgenti che scelgo in modo casuale I(i,j) I(p) u v p = ξ uu + ξ v v Esempio Aliasing • Aliasing-> non ho abbastanza campioni • Se considero un solo raggio per pixel ho delle seghettature (jaggies) per effetto della discretizzazione Andrew Zaferakis Antialiasing • Così come per le texture, la strategia di antialiasing si basa sulla media di punti adiacenti • Se uso una griglia regolare posso avere artefatti, tipo pattern moirè Pixel Samples Sub-Pixel Samples Vince Scheib Antialiasing • Una tecnica usata è considerare più campioni distribuiti in modo non uniforme (random sampling o jittering) • In pratica si evita il problema dei pattern, ma si aggiunge rumore Riflessione glossy • Potrei sparare molti raggi nelle riflessioni speculari per simulare la riflessione glossy n r l Motion blur Cook, Porter, Carpenter - 1984 Profondità di campo Implementazione Posso fare ray tracing con le GPU? • General-Purpose computation on GPUs www.gpgpu.org/ http:// • OpenRT: The OpenRT Real-Time Ray-Tracing Project http://www.openrt.de Ray tracers • Yafray (Yet Another Free RAYtracer) (www.yafray.org) • POVray (Persistence of Vision Raytracer) (www.povray.org) Vantaggi • Realizzazione naturale delle ombre; non ho parametri oscuri da settare (tipo il bias delle shadow maps) • Parallelizzabile Cosa manca? • Non considera la luce che proviene per riflessione/ trasmissione diffusa da altri oggetti (questa componente viene approssimata con un termine costante di luce ambientale) • Se considerassimo anche i raggi di riflessione diffusa avremmo una quantità improponibile di raggi..... • Si fa precedere il ray tracing da una valutazione della radiosity