La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

ALTRI MODELLI LUCE PER LA RESA DI UNA SCENA 3D. per il calcolo del valore di luminosita' (e colore) di un pixel - ovvero di un punto (x,y) dell'immagine.

Presentazioni simili


Presentazione sul tema: "ALTRI MODELLI LUCE PER LA RESA DI UNA SCENA 3D. per il calcolo del valore di luminosita' (e colore) di un pixel - ovvero di un punto (x,y) dell'immagine."— Transcript della presentazione:

1 ALTRI MODELLI LUCE PER LA RESA DI UNA SCENA 3D

2 per il calcolo del valore di luminosita' (e colore) di un pixel - ovvero di un punto (x,y) dell'immagine 2D sullo schermo si puo' procedere in vari modi: un modo e' dato dai modelli di Gouraud e Phong, dove si calcola il valore dell' intensita' RGB nel pixel PX(x,y) da considerazioni locali riguardo la posizione del punto PS(x,y,z) nello spazio 3D della scena rispetto le sorgenti di luce, con PS(x,y,z) punto della scena corrispondente al pixel-punto PX(x,y) considerato; diffetto: non sono calcolate le ombre, ne' sono calcolate le rifrazioni (luce attraverso oggetto trasparente), ne' riflessioni di oggetti

3 ombre in OpenGL dal manuale dell' OpenGL : per ottenere un effetto ombra si deve calcolare la matrice di proiezione dalla luce al piano su cui si vuole l'ombra, moltiplicarla per la matrice corrente sul matrix stack e poi disegnare l'oggetto che risultera' in prospettiva su quel piano, e dare all'oggetto il colore dell' ombra voluta sul piano

4 ombre in OpenGL OpenGL : per ottenere un effetto ombra si deve... non riportiamo il procedimento (vedi lavori studenti AA 06 e 07, ed es. EGD3D_39dinoshade)

5 per ottenere una resa piu' realistica di una scena, che tenga conto delle ombre, della illuminazione indiretta riflessa della riflessione di oggetti in altre supefici riflettenti e delle trasparenze bisogna tener conto della propagazione dei raggi in tutta la scena, quindi di tutti gli oggetti della scena

6 un metodo potrebbe essere il seguente: si seguono i raggi di luce che escono dalle sorgenti di luce fino ad un oggetto della scena, e poi fino all'osservatore; -- ma: la maggior parte dei raggi che escono dalla sorgente di luce finisce fuori dal piano di proiezione che ci interessa, e non interessano l'osservatore: gran parte del lavoro e' a vuoto. osservatore (punto di proiez) sorgente di luce scena 3D PS(x,y,z) PX(x,y) fuori dentro

7 invece di seguire i raggi di luce che escono dalle sorgenti di luce fino ad un oggetto della scena, e poi fino all'osservatore; dove... la maggior parte dei raggi che escono dalla sorgente di luce finisce fuori dal piano di proiezione che ci interessa, e non interessano l'osservatore) meglio: seguo il cammino inverso, ovvero inizio dal punto di vista o punto di proiezione e seguo il raggio all'indietro - dall' osservatore (dal punto di proiezione) - attraverso i pixel dello schermo - fino alle superfici o - alle sorgenti di luce della scena.

8 il raggio primario r (x,y,1) deriva dalla luceche arriva dalle sorgenti, diretta/indiretta: I = amb.+spec.+trasp.+diffusa = I = k a I a + Somma( k s I s + k t I t + k d I pi (n.L i ) ) qui sono presenti due luci,ciascuna contribuisce alla luce I (che esce dal punto PS(x,y,z), per il raggio primario r (x,y,1) verso l'osserv.) con due raggi (secondari rispetto l'osservatore) che arrivano dalle luci al punto PS (da cui poi si diffondono) osservatore sorgenti PX(x,y) r.primario r (x,y,1) n PS(x,y,z) S1S2 r.secondario r (x,y,2-1) r.secondario r (x,y,2-2)

9 si seguono i raggi di luce che interessano l'osservatore, partendo dall'occhio dell'osservatore all' indietro: per tutti i pixel dello schermo si calcolano le intersezioni con gli oggetti della scena 3D del raggio che unisce il punto di vista (osservatore) con il pixel sul piano di proiezione (schermo); osservatore sorgente scena 3D PS2(x,y,z) PX1(x,y) PX3(x,y) PX2(x,y) PS3(x,y,z)

10 un raggio che esce dal punto di vista puo' incontrare piu' oggetti della scena - si sceglie il punto P1 dell'oggetto piu' vicino all'osservatore (superfici nascoste! P2 non si vede) e per tale punto si calcola la luce che dal punto va verso l'osservatore (ad es con la formula di Phong) - nella versione piu' semplice di questo metodo mi fermo qui - osservatore sorgente scena 3D PX(x,y) P1 P2

11 diremo raggio primario r (x,y,1) un raggio che unisce il punto di vista con un oggetto; dopo l'intersezione P i1 possiamo seguire il raggio all' indietro considerando la riflessione speculare, e ottengo il raggio r (x,y,2) secondario che incontra un secondo oggetto in P i2 e da questo secondo un raggio terziario r (x,y,3) che ad es. qui incontra la sorgente di luce osservatore sorgente PX(x,y) r (x,y,1) r (x,y,2) r (x,y,3) a a P i1 P i2

12 nota: con il metodo di ray-tracing vediamo anche oggetti nascosti da altri che stanno loro davanti, ma che si vedono riflessi in altri oggetti: qui l'osservatore vede gli oggetti O1 e O2, non vede direttamente O3 (nascosto da O1); ma vede O3 riflesso in O2 (raggio r 3 ), e anche lo stesso O3 riflesso due volte in O1 e in O2 (raggio r 2 ) z O1 O2 O3 P vista Luce r3r3 r2r2

13 ancora, l' osservatore vede la luce L riflessa in O2, raggio r L, e vede il lato dietro di O1 (riflesso in O2) illuminato dalla luce L direttamente (r d ) e indirettamente (r i ) z O1 O2 O3 P vista Luce r2r2 rdrd riri rLrL

14 MA: in un punto generico di una superficie di un oggetto della scena dobbiamo tener conto di piu' effetti: finora abbiamo parlato solo delle componenti ambiente, diffusa e speculare (Gouraud, Phong) : I diffusa = I ambiente + I RiflessaDiffusa + I RiflessaSpeculare = = K a * I a + I Incidente K d * cos(a) + W(a) * I Incidente * K s * cos n (x) N raggio luce incidente oggetto a osservatore P L R x O a queste tre componenti dobbiamo aggiungere la componente rifratta che viene trasmessa attraverso un oggetto

15 N raggio luce incidente oggetto aiai osservatore P L R T arar ogni raggio incidente L produce (tra altri) un raggio R riflesso specularmente e un raggio T rifratto e trasmesso attraverso l'oggetto : il raggio trasmesso per rifrazione T ha un angolo a r con la normale N nel punto di incidenza che e' determinato dagli indici di rifrazione dei due mezzi, n i e n r come segue: legge di Snell n r *sin(a r ) = n i * sin(a i ) dove n r e n i sono coefficienti di rifrazione del materiale in cui viaggia la luce, e che per materiali trasparenti diversi sono diversi... aiai

16 Vacuum Air Ice 1.31 Water Ethyl Alcohol 1.36 Plexiglas 1.51 Crown Glass 1.52 (*) LightFlintGlass 1.58 (**) DenseFlintGlass 1.66 HeavyFlintGlass 1.92 (***) Zircon Diamond Rutile GalliumPhosphide 3.50 (*)vetro senza additivi (**) flint=selce,pietra focaia(silice) (***) da Comp.Graphics di Hearn e Baker tabella di indici di rifrazione (da rete, con Google cerca "Snell" e "law"), dal mezzo di densita' ottica piu' bassa (dove la luce viaggia piu' veloce) ai mezzi di densita' ottica piu' elevata (Tom Henderson, http: //www. glenbrook. k12. il. us/gbssci/ phys/ Class/ refrn/ u14l2b. htmlhttp: //www. glenbrook. k12. il. us/gbssci/ phys/ Class/ refrn/ u14l2b. html ) legge di Snell = legame tra angolo rifratto e incidente: n r *sin(a r ) = n i * sin(a i )

17 un esempio di immagine resa con ray-tracing, di Jamis Buck,

18 N raggio luce incidente oggetto a osservatore P L R x O T a t legge di Snell da' l' angolo t=a r per il raggio T trasmesso per rifrazione (t angolo del raggio T con la normale N nel punto di incidenza con il raggio incidente L); angoli a i e a r determinati dagli indici di rifrazione dei due mezzi, n i e n r n r *sin(a r ) = n i * sin(a i ) n r e n i sono i coefficienti di rifrazione del materiale in cui viaggia la luce, con t=a r e a=a i da qui si ricava l'angolo del raggio rifratto t rispetto la normale N

19 N raggio luce incidente oggetto aiai osservatore P L R x O T aiai arar n r e n i sono i coefficienti di rifrazione del materiale in cui viaggia la luce, con t=a r e a=a i ; l'angolo del raggio rifratto a r rispetto la normale N e' dato dalla legge di Snell: n r *sin(a r ) = n i * sin(a i ) NOTA: i due indici di rifrazione (luce incidente n i e luce rifratta n r ) cambiano in funzione della temperatura e della lunghezza d'onda della luce (raggio->prisma->colori) in alcuni casi (quarzo) gli indici variano a seconda della direzione nel materiale, altri generano due o piu' raggi rifratti... ma: per la maggior parte dei casi la legge di Snell e' sufficiente

20 N raggio luce incidente oggetto a osservatore P L R x O T a t la legge di Snell lega t=a r = angolo (con la normale N) del raggio T trasmesso per rifrazione con il raggio incidente L, n r *sin(a r ) = n i * sin(a i ), ( t=a r a=a i ) dove n r e n i sono gli indici di rifrazione dei due mezzi in cui viaggia la luce; la formula fornisce l'angolo del raggio rifratto rispetto la normale; cos 2 (t) + sin 2 (t) = 1, cos(t) = sqrt( 1-sin 2 (t) ), essendo sin(t) = n i / n r * sin(a i ), e sin(a i )=sqrt(1-cos(a i ) ), allora cos( t) = sqrt(1-f 2 (1-cos 2 a)) dove il fattore f e' il rapporto f = n i / n r da cui si ricava la formula per calcolare il vettore T: T= f1 * L + f2 * N, con f1 e f2: T= f * L - (cos(t)-f*cos(a) ) *N

21 un esempio di calcolo per la luce rifratta luce incidente a 30 0 (rispetto la N) e superficie che separa aria/vetro (indice 1.6) ottengo un angolo di rifrazione di 18 0 ma: spesso si ignora lo spostamento del raggio che attraversa un mezzo trasparente, o lo si calcola in modo fisso; per la trasparenza spesso tengo conto del contributo all'intensita'di luce con una formula del tipo: I = I xx +k t *It vediamo...

22 per passare dal raggio primario r (x,y,1) ai raggi secondari si tiene conto che la luce in PS(x,y,z) e' data da 4 componenti I = k a I a + k s I s + k t I t + k d Somma(I pi (n.L i )) = ambiente+speculare+trasparenza+diffusa da cui i raggi secondari da seguire: primo, il r (s/x,y,2) raggio riflesso specularmente secondo, r (t/x,y,2) raggio trasmesso per trasparenza o rifrazione osservatore sorgente PX(x,y) r (x,y,1) r (s/x,y,2) r (x,y,3) a oss a sorg n PS r (t/x,y,2)

23 dal raggio primario r (x,y,1), calcolo i raggi secondari r (x,y,2) - qui r speculare r (s/x,y,2) e r riflesso per trasparenza r (t/x,y,2) dalla luce in PS(x,y,z), e inoltre il raggio che e' rifratto : I = k a I a + k s I s + k t I t + k d Somma(I pi (n.L i )) = ambiente+speculare+trasparenza+diffusa MA: il raggio secondario in genere NON incontra una sorgente, ma altri oggetti... il tutto si ripete ! osservatore sorgente PX(x,y) r (x,y,1) r (x,y,2) r (t/x,y,2) n PS(x,y,z) t a r (s/x,y,2) sorgente

24 seguendo il raggio primario r (x,y,1), dalla I = ambiente+speculare+trasparenza+diffusa calcolo i due raggi secondari (speculare+trasparenza), e sono di nuovo a seguire un raggio (secondario) all'indietro, rs (x,y,2) per arrivare ad un punto di un oggetto o di una sorgente; calcolo intensita' di luce del punto PS2 al passo due,come prima: I PS2 = ambiente 2 +spec 2 +rifratt 2 +diff 2 e arrivo al raggio rs (x,y,3), terziario al passo k avremo I PSk = ambiente k +spec k +rifratt k +diff k osservatore sorgente PX(x,y) r (x,y,1) r d (x,y,k) n PS1(x,y,z) b sorgente r s (x,y,2) r s (x,y,3) PS2(x,y,z)

25 dal raggio primario vado all'indietro e calcolo i due raggi secondari (riflesso e rifratto), poi da ciascun raggio secondario all'indietro calcolo i terziari ecc... abbiamo un albero dei raggi rifratti, che aumenta molto rapidamente... r1 r2r r2t r3rr3tr3rr3t r4rr4tr4rr4t

26 es. qui il raggio r 1 e' seguito (dal P vista ) oltre l'oggetto O 2, raggio r 2, poi oltre l'oggetto O 1, raggio r 3 e poi oltre O 3 - raggio r 4, finche' si arriva alla sorgente S1: z O1 O2 O3 P vista r2r2 r1r1 r3r3 r1r1 r2r2 r1r1 r2r2 r2r2 r4r4 r3r3 r2r2 S1S1

27 si seguono i raggi di luce che interessano l'osservatore, partendo dall'occhio dell'osservatore all'indietro: al passo zero = il raggio che esce dal punto di vista verso la scena ("attraverso" i pixel schermo)... al passo k (punto della scena Pk(x,y,z) l'illuminazione e' calcolata con la nota formula, e' data dalle varie componenti di luce al passo k+1, di cui seguo due (speculare e rifratto); mi fermo quando arrivo alla sorgente di luce oppure quando esco di scena... MA: in pratica si segue il raggio per 4 o 5 iterazioni al massimo, trascurando i contributi ai passi successivi (anche perche' il costo di calcolo diventa eccessivo) questo e' il metodo di ray-tracing ("inseguire il raggio") proposto da Whitted nel 1980 (siamo ai tempi del VAX-780) appare abbastanza evidente che il costo di questo metodo e' elevato.

28 l'algoritmo per il ray-tracing quindi e: intensita_in_ Pk(x,y,z), passo k-esimo, I PSk, e' data da spec k+1 = intensita' del raggio proveniente da direzione speculare rifratt k+1 = intensita' del raggio proveniente da direzione rifratta I PSk = ambiente k +diff k + +spec k+1 +rifratt k+1 dove k e' il passo k-esimo partendo dall'osservatore

29 schema: void raytrace( traggio r, tspaziooggetti scena, tcolore& rgb){ tcolore illumin, illumin2; traggio rsecond; tpunto P, mindistinters; /*chiamata per ogni pixel del piano di proiezione */ for each oggetto O della scena do{ calcola se c'e' intersez P tra oggetto O e raggio r, e event. aggiorna il punto min_dist_inters (se P e' piu'vicino); end for each; with min_dist_inters do /*al punto di minima distanza di inters*/ if esistono raggi secondari then do{ calcola il raggio secondario rsecond, e chiama raytrace( rsecond, scena, illumin2 ); accumula valore dell'illuminazione illumin2 in illumin } while( ci sono ancora raggi secondari) else calcola l'illumin nel punto dalle proprieta'locali e dalle luci esci con risultato in rgb = illumin } // raytrace

30 curiosita' storiche: nel 1991 uno studente (3.o anno) ha fatto una tesina di visualizzazione di due sfere e una luce con un suo programma scritto in Borland Turbo Pascal ambiente DOS su una macchina Olivetti M24 (Intel 80286): l'algoritmo di ray-tracing si presta all'esecuzione parallela, dividendo lo schermo in rettangoli e lanciando l'esecuzione in parallelo per ogni rettangolo (si potrebbe fare per ogni pixel); il programma e' stato fatto eseguire su 4 macchine in parallelo (suddivisione "a mano"), per due giorni durante un weekend; la precisione era di 64 x 64 pixel. Simile l'approccio di varie persone/ditte, ad es. un film di animazione con ray-tracing di 3 minuti aveva richiesto (1988) un mese su 50 workstation Sun (esec. solo nei tempi morti su macchine di una ditta) ; [oggi le macchine sono 1000 x + veloci] il testo di Hearn&Baker del 1994 ha in copertina una scena prodotta con un Macintosh II (Motorola a 30Mhz) resa con 26Mega raggi primari in 213 ore... oggi ('05), un Power PC ha un clock 50 volte piu' veloce, quindi si scende a 4 ore...

31 punto di vista (projection reference point) dobbiamo tenere traccia (mem) dei raggi ottenuti nel percorso di raytracing (per ogni pixel), da cui un albero di traccia : in genere si ferma al 4.o livello. S4S4 S3S3 S2S2 S1S1 S1S1 I 0 =r 1 r 2b t 2b t 3b r 4b r 3a r 4a S 2a S 3a r1r1 t1t1 S 2b

32 una delle parti piu' critiche (quella che occupa maggior tempo di calcolo) per il metodo di ray-tracing e' il calcolo dell'intersezione di un raggio con un oggetto: se P 0 e' il punto da cui esce il raggio (all'inizio P e' il punto di vista o centro di proiezione) e u e' il raggio (unitario) di direzione, allora ogni punto sul raggio e' dato da: P = P 0 + s * u (s=scalare, e' equaz.parametrica del raggio) u si e' dato dal pixel in esame e dal punto di vista o projection reference point: u = (P pix - P prp ) / |P pix - P prp | se l'oggetto e' una sfera (caso piu'semplice) allora dall'equazione per i punti P della sfera di centro P c e raggio r : | P - P c | 2 - r 2 = 0 se in questa eq. sostituisco la P=P 0 +s*u di sopra, ottengo: | P 0 + s * u - P c | 2 - r 2 = 0

33 ripeto: punto del raggio: P = P 0 + s * u equazione per i punti della sfera: | P - P c | 2 - r 2 = 0 sostituisco P, ottengo: | P 0 + s * u - P c | 2 - r 2 = 0 da cui se DP = P c - P 0 ho l'equaz di 2.o grado in s: s 2 - 2*(u.DP) * s + ( | DP | 2 - r 2 ) = 0 da cui le due radici s= u.DP +/- sqrt( (u.DP) 2 - |DP| 2 + r 2 ) se il discriminante (sotto radice) e' negativo allora il raggio non interseca la sfera, altrimenti s e' data dalla radice piu' piccola (due punti di intersezione) x y z P P0P0 PcPc u r DP

34 per un oggetto piu' complicato conviene fare un test preliminare con una sfera contenente l'oggetto: se il raggio non interseca la sfera, si esclude l'oggetto senz'altro; se invece il raggio interseca la sfera, allora si dovranno esaminare tutte le faccie "davanti" rispetto il raggio (escludo le faccie dietro, con normale N tali che u.N < 0 [culling] ), e per ciascuna calcolo il punto di intersezione raggio - piano in cui sta il poligono (la faccia), dall'equazione del piano N.P = -D con N normale al piano, P punto del piano, D distanza piano- origine), trovata intersezione raggio - piano del poligono vado a verificare se il punto di intersezione sta nel poligono o se e' esterno al poligono (test punto dentro/fuori poligono)

35 si puo' vedere che per il test di intersezione raggio - sfera devo eseguire 3 sottrazioni o addizioni e tre prodotti; se il test e' positivo devo controllare meglio, con 8 somme o sottrazioni e 7 prodotti; qualche miglioramento si puo' avere considerando il test di intersezione non in 3D ma in un piano in 2D (5 somme e 5 prodotti)... ma un guadagno vero nella velocita' di calcolo si ha strutturando gli oggetti e procedendo per volumi contenenti piu' oggetti... ancora un'osservazione: la scelta di sfera o parallelepipedo come volume che racchiude uno o piu oggetti per fare il test preliminare dipende anche dalla forma dell'oggetto: per oggetti di circa pari dimensione in x,y,z conviene la sfera, per oggetti sottili (una penna, una torre...) converra' un parallelepipedo per evitare - se questo test risulta positivo - di dover fare poi molti test a vuoto.

36 di seguito uno dei moltissimi esempi di immagini ottenute con il metodo di ray-tracing (il metodo risale al 1981, queste immagini sono piu' recenti); dall'articolo (da cui l'immagine) la Pixar presento' nel 1986 le sue prime animazioni molto realistiche (Luxo jr) - non usava ray-tracing, ma un metodo simile ma piu' veloce...

37 ancora un' immagine prodotta con ray-tracing, di Jamis Buck,

38 da Hearn&Baker : il calcolo delle intersezioni raggio-superficie puo' rappresentare fino al 95 % del tempo complessivo del metodo, e' quindi importante introdurre dei metodi per ridurre questi calcoli gli oggetti di una scena sono organizzati gerarchicamente (albero della scena), e posso specificare per ogni parte della scena (gruppo di oggetti della scena) una sfera o un cubo, e poi eseguo dei test preliminari su questi volumi (sfere o cubi), e elimino parti che non intersecano il raggio, e solo per le parti che intersecano il raggio approfondisco i test a parti piu' piccole fino ai singoli oggetti anzi fino alle singole superfici (triangoli); si ottengono guadagni di un fattore 10;

39 anche per il ray tracing si possono usare metodi che sfruttano la localita' della scena: in genere se mi sposto di pochi pixel nello schermo i raggi incontreranno circa gli stessi oggetti di prima; ad es. si puo' usare l'algoritmo della scan-line con liste di facce attive: ypyp xpxp O1 O2 O3 O4 per ogni valore della y (scan line y) ho una lista di oggetti attivi che sono intersecati dal piano definito dalla scan line e dal punto di vista P, ovvero tali che il loro ymin y; questi non cambiano al variare di x (per tutti i pixel della linea); P per questo y sono attivi O2 e O3 (intersecano il piano P-A-B) A B ymin ymax

40 ypyp xpxp O1 O2 O3 O4 per ogni valore della y (scan line y) ho una lista di oggetti attivi che sono intersecati dal piano definito dalla scan line e dal punto di vista P,(per ognuno e' ymin y) quando passo alla prossima scan line (y+1) controllo quali oggetti non sono piu' intersecati (in figura, O3) e quali invece entrano in intersezione (in figura, O1), la lista degli oggetti attivi della scan line e' ordinata per x (agevola test di intersez), e per ogni x (per ogni pixel) devo anche determinare quale oggetto e' il piu' vicino (nel senso delle z) P per questo y sono attivi O2 e O3 (intersecano il piano P-A-B) A B B A

41 un altro modo per sveltire i test di intersezione e' la suddivisione dello spazio della scena in cubi ; si considera separatamente ogni cubetto, e si codifica una struttura che mantiene un elenco degli oggetti che intersecano (o appartengono) un cubetto: si ha una lista di "oggetti attivi" per ogni cubetto, lista che deve essere aggiornata passando da un cubetto i,j,k ad un cubetto adiacente; si noti che le liste degli oggetti attivi per una scena data possono essere calcolate una volta per ogni cubetto, e non cambiano per i raggi che interessano quel cubetto (pixel per pixel); inoltre alcune regioni saranno vuote - test immediato;

42 ricordiamo un modo per codificare la posizione di un oggetto in un reticolo di cubi : un cubo viene suddiviso in otto cubi, (oct-alberi!!) numerati come nella figura a fianco: ciascuno degli otto cubetti viene a sua volta suddiviso in otto cubi piu' piccoli, eccetera; ad es. il cubetto 2 della prima divisione sara' diviso in 8 cubetti numerati 20, 21, 22, 23, 24,.. 27, il cubetto 20 sara' ancora suddiviso in 8 cubetti numerati 200, , eccetera... la codifica assume che i cubetti 0,1,2,3 siano davanti, e quindi i primi a essere visibili (incontrati dal raggio);

43 una variante: suddivisione adattativa, simile alla suddivisione nello spazio 2D per determinare le intersezioni : si infittisce la suddivisione solo nei rettangoli dove e' presente un oggetto - un ragionamento simile si puo' fare per lo spazio 3D

44 ancora un es. di ray-tracing

45 qualita' dell'immagine: anti - aliasing vediamo... antialiasing

46 nota: abbiamo visto che per una migliore qualita' dell'immagine si usa il raytracing (esame della scena partendo dallo schermo, pixel per pixel: c'e' un raggio che si deve seguire per ogni pixel della scena ecc) questo non basta per ottenere un'immagine di alta qualita', per la presenza degli effetti dei bordi a scalino (aliasing); si osservi che vi sono diversi tipi di disturbi alias: antialiasing

47 si osservi che vi sono diversi tipi di disturbi alias: alias spaziale, che e' l'effetto dei bordi a scaletta o seghettati, che e' tanto meno visibile quanto piu' grande e' la precisione dello schermo; un oggetto piu' piccolo di un pixel non si vede, a meno di non essere centrato al pixel, e allora occupa tutto il pixel; ma una linea curva vicino all'orizzontale o alla verticale appare seghettata, a scalini; con opportune tecniche si puo' rimediare, e la slide seguente (demo Java 2D) ne e' un esempio -->> antialiasing

48 alias spaziale, e' l' effetto dei bordi a scaletta o seghettati, tanto meno visibile quanto piu' grande e' la precisione dello schermo; un oggetto piu' piccolo di un pixel non si vede, a meno di non essere centrato al pixel, e allora occupa tutto il pixel; qui a sinistra senza "anti-aliasing", a destra con "anti-aliasing" antialiasing

49 alias temporale vari effetti, ad es. scena ben nota della proiezione di film in un cinema, con diligenza in film western, le ruote del carro che appaiono ruotare all'indietro, dovuto all' interferenza tra velocita' delle ruote e velocita' di campionamento (o di visualizzazione); alias temporale per oggetti piccoli che si spostano sullo schermo, l'oggetto piccolo sara' in qualche istante centrato dal raggio che esce da un pixel, e in un altro istante no; l'effetto visivo e' un pixel pulsante che si sposta a scatti (uno scatto per pixel) sullo schermo. antialiasing

50 tra molti metodi per ridurre l'aliasing ricordiamo: * supersampling - uso piu' raggi per pixel * regolare: piu' raggi per pixel, disposti in reticolo a passo costante * casuale, piu' raggi per pixel ma in posizione casuale, * altre tecniche (anti-aliasing con parziale smussatura delle intensita' di colore, con sfumature di toni intermedi) *... antialiasing

51 Hearn e Baker nel loro libro "Computer Graphics with OpenGL del 2004 ricordano * "antialiased ray-tracing" super-sampling adaptive sampling, distributed (stochastic) sampling antialiasing

52 altre tecniche: l'effetto di sfumatura per velocita', ("foto "mossa"), motion - blurr" (che esiste in OpenGL) in OpenGL: tecniche di uso dell'accumulation buffer (piu' immagini del color-buffer si accumulano nell' acc.buffer, da dove sono poi copiate nel color buffer) - tecnica simile all'esposizione multipla di una foto OpenGL: glAccum(GLenum op, GLfloat value); vedi esempi: accpersp.c, (jittering (antialiasing) with perspective) accanti.c (jittering with orthogr.projection) dof.c (depth-of-field effect) antialiasing

53 blurr effect

54 da Fig.10-87, Hearn- Baker, scena con parti sfocate, antialising, con resa con combinazione di ray- tracing e radiosity (Peter Shirley, C.S.Dep, Utah Univ.)

55 esistono molte altre tecniche, tra cui menzioniamo radiosity (equilibrio dell'energia della luce nella scena), tecniche miste: environment mapping ("the poorperson ray-tracing method") photon mapping (ray-tracing with separate scene / illumination model)... rimandate ad un altro anno o ad un altro corso ;-) (radiosity - vedi la presentazione di Cossutta, a.a.2006)...

56 fine di EGD27_RAYTRACE


Scaricare ppt "ALTRI MODELLI LUCE PER LA RESA DI UNA SCENA 3D. per il calcolo del valore di luminosita' (e colore) di un pixel - ovvero di un punto (x,y) dell'immagine."

Presentazioni simili


Annunci Google