altri modelli luce per la resa di una scena 3d. per il calcolo del valore di luminosita' (e...

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

Upload: hieronomo-gallo

Post on 01-May-2015

215 views

Category:

Documents


2 download

TRANSCRIPT

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

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

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)

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

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)

sorgentedi luce

scena 3D

PS(x,y,z)

PX(x,y)

fuori

fuori

fuori fuori

dentro

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.

il raggio primario r (x,y,1) deriva dalla luceche arriva

dalle sorgenti, diretta/indiretta: I = amb.+spec.+trasp.+diffusa =I = ka Ia + Somma( ks Is + kt It + kd Ipi(n.Li) )

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)

S1 S2

r.secondario r (x,y,2-1) r.secondario r (x,y,2-2)

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)

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

diremo raggio primario r (x,y,1) un raggio che unisce il punto di vista con un oggetto; dopo l'intersezione Pi1 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 Pi2 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)

aa

Pi1

Pi2

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 r3), e anche lo stesso O3 riflesso due volte in O1 e in O2 (raggio r2)

zO1

O2

O3

Pvista

Luce

r3

r2

ancora, l' osservatore vede la luce L riflessa in O2, raggio rL, evede il lato dietro di O1 (riflesso in O2) illuminato dalla luce L direttamente (rd) e indirettamente (ri)

zO1

O2

O3

Pvista

Luce

r2

rd

rirL

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

Idiffusa = Iambiente + I RiflessaDiffusa + IRiflessaSpeculare =

= Ka * Ia + I Incidente Kd * cos(a) + W(a) * IIncidente * Ks * cosn(x)

N

raggio luce incidente

oggetto

a

osservatore

P

L R

xO

a queste tre componenti dobbiamo aggiungere la componente rifratta che viene trasmessa attraverso un oggetto

N

raggio luce incidente

oggetto

ai

osservatore

P

L R

Tar

ogni raggio incidente L produce (tra altri) un raggio R riflesso specularmente eun raggio T rifratto e trasmesso attraverso l'oggetto :

il raggio trasmesso per rifrazione T ha un angolo ar con la normale N nel punto di incidenza che e' determinato dagli indici di rifrazione dei due mezzi, ni e nr come segue:

legge di Snell

nr *sin(ar) = ni * sin(ai)

dove nr e ni sono coefficienti di rifrazione del materiale in cui viaggia la luce, e che per materiali trasparenti diversi sono diversi...

ai

Vacuum 1.0000 Air 1.0003Ice 1.31Water 1.333Ethyl Alcohol 1.36Plexiglas 1.51Crown Glass 1.52 (*)

LightFlintGlass 1.58 (**)

DenseFlintGlass 1.66HeavyFlintGlass 1.92 (***)

Zircon 1.923Diamond 2.417Rutile 2.907GalliumPhosphide 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. html )

legge di Snell = legame tra angolo rifratto e incidente: nr *sin(ar) = ni * sin(ai)

un esempio di immagine resa con ray-tracing, di Jamis Buck,http://www.geocities.com/jamisbuck/raytracing.html

N

raggio luce incidente

oggetto

a

osservatore

P

L R

xO

T

a

t

legge di Snell da' l' angolo t=ar 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 ai e ar determinati dagli indici di rifrazione dei due mezzi, ni e nr

nr *sin(ar) = ni * sin(ai)

nr e ni sono i coefficienti di rifrazione del materiale in cui viaggia la luce, con t=a r e a=ai da qui si ricava l'angolo del raggio rifratto t rispetto la normale N

N

raggio luce incidente

oggetto

ai

osservatore

P

L R

xO

T

ai

ar

nr e ni sono i coefficienti di rifrazione del materiale in cui viaggia la luce, con t=a r e a=ai ; l'angolo del raggio rifratto a r rispetto la normale N e' dato dalla legge di Snell: nr *sin(ar) = ni * sin(ai)

NOTA: i due indici di rifrazione (luce incidente nie luce rifratta nr) 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

N

raggio luce incidente

oggetto

a

osservatore

P

L R

xO

T

a

t

la legge di Snell lega t=ar= angolo (con la normale N) del raggio T trasmesso per rifrazione con il raggio incidente L, nr *sin(ar) = ni * sin(ai), ( t=a r a=ai )dove nr e ni sono gli indici di rifrazione dei due mezzi in cui viaggia la luce; la formula fornisce l'angolo del raggio rifratto rispetto la normale;cos2 (t) + sin2 (t) = 1, cos(t) = sqrt( 1-sin2(t) ), essendosin(t) = ni / nr * sin(ai), e sin(ai)=sqrt(1-cos(ai) ), allora

cos( t) = sqrt(1-f2(1-cos2a))

dove il fattore f e' il rapporto f = ni / nr 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

un esempio di calcolo per la luce rifratta

luce incidente a 300 (rispetto la N) e superficie che separa aria/vetro (indice 1.6) ottengo un angolo di rifrazione di 180

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 = Ixx+kt*It

vediamo...

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 componentiI = ka Ia + ks Is + kt It + kd Somma(Ipi(n.Li)) = 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)

aoss

asorgn

PS r (t/x,y,2)

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 = ka Ia + ks Is + kt It + kd Somma(Ipi(n.Li)) = 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

ar (s/x,y,2)

sorgente

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: IPS2 = ambiente2+spec2+rifratt2+diff2 e arrivo al raggio rs(x,y,3), terziario al passo k avremo IPSk = ambientek+speck+rifrattk+diffk

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)

• 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

r3r r3t r3r r3t

r4r r4t r4r r4t

es. qui il raggio r1 e' seguito (dal Pvista) oltre

l'oggetto O2 , raggio r2 , poi oltre l'oggetto O1 ,

raggio r3 e poi oltre O3 - raggio r4, finche' si

arriva alla sorgente S1:

zO1

O2

O3

Pvista

r2

r1

r3

r1

r2r1

r2

r2

r4

r3

r2

S1

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.

l'algoritmo per il ray-tracing quindi e:

intensita_in_ Pk(x,y,z), passo k-esimo, IPSk , e' data da

speck+1 = intensita' del raggio proveniente da direzione speculare rifrattk+1= intensita' del raggio proveniente da direzione rifratta

IPSk = ambientek+diffk + +speck+1

+rifrattk+1

dove k e' il passo k-esimo partendo dall'osservatore

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

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 1000x + veloci]il testo di Hearn&Baker del 1994 ha in copertina una scena prodotta con un Macintosh II (Motorola 68030 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 ...

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.

S4

S3

S2S1

S1

I0=r1

r2bt2b t3b

r4b

r3a

r4a

S2a

S3a

r1t1

S2b

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 P0 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 = P0 + 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 = (Ppix - Pprp) / |Ppix - Pprp|

se l'oggetto e' una sfera (caso piu'semplice) allora dall'equazione per i punti P della sfera di centro Pc e raggio r : | P - Pc | 2 - r2 = 0 se in questa eq. sostituisco la P=P0+s*u di sopra, ottengo: | P0 + s * u - Pc | 2 - r2 = 0

ripeto: punto del raggio: P = P0 + s * u equazione per i punti della sfera:| P - Pc | 2 - r2 = 0 sostituisco P, ottengo:| P0 + s * u - Pc | 2 - r2 = 0

da cui se DP = Pc - P0

ho l'equaz di 2.o grado in s:s2 - 2*(u.DP) * s + ( | DP |2 - r 2 ) = 0da cui le due radicis= u.DP +/- sqrt( (u.DP)2 - |DP| 2 + r2)

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

P0

Pc

ur

DP

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)

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.

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)http://www.geocities.com/jamisbuck/raytracing.html

la Pixar presento' nel 1986 le sue prime animazioni molto realistiche (Luxo jr) - non usava ray-tracing, ma un metodo simile ma piu' veloce...

ancora un' immagine prodotta con ray-tracing, di Jamis Buck,http://www.geocities.com/jamisbuck/raytracing.html

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;

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:

yp

xp

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 e il ymax>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

yp

xp

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 e il ymax>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

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;

01

2 3

4 5

727

20

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, 201..207, eccetera...la codifica assume che i cubetti 0,1,2,3 siano davanti, e quindi i primi a essere visibili (incontrati dal raggio);

01

2 3

4 5

727

20

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

ancora un es.

di ray-tracing

qualita' dell'immagine:

anti - aliasing

vediamo...

antialiasing

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

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

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

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

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

Hearn e Baker nel loro libro "Computer Graphics with OpenGLdel 2004 ricordano

* "antialiased ray-tracing" super-sampling adaptive sampling, distributed (stochastic) sampling

antialiasing

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 fotoOpenGL: 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

blurr effect

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

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

fine di EGD27_RAYTRACE