Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.
-
Upload
mimi-grieco -
Category
Documents
-
view
215 -
download
1
Transcript of Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.
Shading e smoothing
Daniele Marini
Corso Di Programmazione Grafica aa2005/2006
Programmazione Grafica aa2005/2006 2
Scopo
• Raffigurare forme con superfici curve rappresentate come poliedri
• Il modello di illuminazione determina il valore di colore in punti significataivi (vertici per metodo di Gourad, punti intermedi per metodo di Phong)
• Si tratta di un problema di approssimazione o interpolazione
• Occorre stimare la curvatura in ogni punto, e il gradiente della curva approssimante
Programmazione Grafica aa2005/2006 3
Calcoli sui vettori
• Vettore normale• equazione del piano: ax+by+cz+d=0; si può anche scrivere come luogo:
e p è un qualunque punto nel piano; il vettore n è dato da:
n.(p p0 ) 0
n a
b
c
e in coordinate omogenee : n
a
b
c
0
Programmazione Grafica aa2005/2006 4
In generale possiamo partire da tre punti non allineati: p0, p1, p2 con i quali determiniamo il piano (superfici approssimate con poliedri triangolarizzati).
Le differenze p2 - p0 e p1 - p0 sono coplanari e il loro prodotto dà la normale:
n = (p2 - p0) x (p1 - p0)
L’ordine è rilevanteL’ordine è rilevante
Programmazione Grafica aa2005/2006 5
Il calcolo del gradiente di superfici curve dipende da come la superficie è rappresentata (forma parametrica o forma implicita).Es. sfera - equazione implicita
f(x,y,z): x2 + y2 + z2 -1=0In forma vettoriale:
f(p): p.p -1 = 0Il vettore gradiente è dato da:
n
f
xf
yf
z
2x
2y
2z
2p
Programmazione Grafica aa2005/2006 6
Se la sfera è rappresentata in forma parametrica il metodo di calcolo cambia: x x(u,v) cos(u)sin(v)
y y(u,v) cos(u)sin(v)
z z(u,v) sin(u)
con 2
u,v 2
La normale si può ricavare dal piano tangente in p:
Programmazione Grafica aa2005/2006 7
pu
x
uy
uzu
, pv
x
vy
vzv
n pu
pv
n cos(u)
cos(u)sin(v)
cos(u)cos(v)
sin(u)
cos(u)p
Individuano due vettoritangenti il cui prodotto vettore determina la normale - poiché ci interessa solo la direzione si può dividere per cos(u) ottenendo un vettore unitario
Programmazione Grafica aa2005/2006 8
Quando calcolare le normali?
• L’architettura a pipe line dei sistemi di rendering prevede che la normale di una faccia sia nota a priori (viene elaborato un vertice per volta e non tutta l’informazione è disponibile)• in generale è compito del programma applicativo calcolare la normale. OpenGL permette di associare a ogni vertice una normale (che dobbiamo calcolare noi nell’applicativo):
glNormal3f(nx,ny,nz);glNormal3fv(pointer_to_normal);
Programmazione Grafica aa2005/2006 9
Shading di poligoni(flat shading)
• N, V ed L variano su ogni poligono• se si assume osservatore distante e
sorgente di luce distante (in OGL si setta a
falso il flag near_viewer) V e L sono costanti• anche N è quindi costante
sull’intero poligono• Il calcolo di shading viene fatto per
l’intero poligono una sola volta
Programmazione Grafica aa2005/2006 10
OGL e flat shading
glShadeModel(GL_FLAT);
La normale che OGL utilizza è quella associata al primo vertice del poligono
Per i triangle strip OGL usa la normale del terzo vertice per il primo triangolo, la normale del quarto per il secondo e così viaPer altre primitive valgono regole simili (vedi manuali)
Programmazione Grafica aa2005/2006 11
Triangle strip
Programmazione Grafica aa2005/2006 12
Flat vs Smooth
Flat shading
Smooth shading
Programmazione Grafica aa2005/2006 13
Interpolazione
• essenziale nei problemi di animazione:– date due posizioni “chiave” relative al
fotogramma al tempo t 0 e al tempo t 1 determinare le posizioni intermedie relative a ogni singolo fotogramma
– occorre garantire regolarità nel movimento
– le posizioni possono riguardare oggetti, fotocamera o altro
Programmazione Grafica aa2005/2006 14
Interpolazione Lineare
• Definisce un percorso rettilineo tra due punti in uno spazio n-dimensionale
• Una dimensione di interpolazione
Programmazione Grafica aa2005/2006 15
Interpolazione Lineare
• Data due punti P1 e P2 definisco una funzione nel parametro t[0,1]
P(t) = P1 + t (P2 – P1) = (1-t)P1 + t P2
P1
P2
t=0
t=1
P(t)
Programmazione Grafica aa2005/2006 16
Interpolazione Lineare
• Nel piano, dati due punti (x1,y1) e (x2,
y2) si vuole calcolare (xP, yP) conoscendo il valore di xP
x1 x2xP
y1
y2yP = ?
dy y2-y1
Programmazione Grafica aa2005/2006 17
Interpolazione Lineare
y p y1 dy
vale la relazione :
dy
x p x1
(y2 y2 )(x p x1)
x2 x1
da cui :
y p y1 (y2 y2 )(x p x1)
x2 x1
Si possono usare tecniche incrementali per accelerare il calcolo
Programmazione Grafica aa2005/2006 18
Interpolazione Bi-lineare
• Considero due dimensioni di interpolazione• Utilizzato per esempio all’interno di griglie
regolari (es. texture)• Peso i punti con
delle aree
P3 P4
P1 P2
P
A1
A3
A2
A4
P A1P1 A2P2 A3P3 A4P4
A1 A2 A3 A4
Programmazione Grafica aa2005/2006 19
Interpolazione quadratica e cubica
• L’interpolazione lineare calcola i valori intermedi utilizzando l’equazione della retta (grado 1) passante per i due punti
• Possiamo considerare anche equazioni di grado più alto (secondo o terzo) per ottenere interpolazioni più precise, ma abbiamo bisogno di più punti
Programmazione Grafica aa2005/2006 20
Curve parametriche
• Quando interpolo tra due punti l’interpolazione lineare è sufficiente
• Quando ho più punti posso usare interpolazione lineare tra ogni coppia di punti successivi ma ottengo un percorso che presenta discontinuità di curvatura nei punti
Programmazione Grafica aa2005/2006 21
Curve parametriche
• Per risolvere il problema posso utilizzare una curva di grado stabilito che interpoli o approssimi i punti.
• La curva avrà equazione
• Esistono differenti schemi di costruzione della curva (Bezier, B-Spline, NURBS,etc)
C(t) f (P1,P2,...,PN ;t) t 0,1
Programmazione Grafica aa2005/2006 22
Smooth shading (interpolato)
• Interpolazione di Gouraud
glShadeModel(GL_SMOOTH)
• Interpolazione di Phong
Programmazione Grafica aa2005/2006 23
Gouraud
Le normali ai vertici di un poliedro vengono interpolate:
n n1 n2 n3 n4
n1 n2 n3 n4
Gouraud usa interpolazione bilineare per calcolare il colore dei pixel lungo i singoli poligoni, quindi:-prima calcola colore ai vertici-poi interpola colore
Programmazione Grafica aa2005/2006 24
Interpolazione bilineare
descriviamo i latiin forma parametrica,è il parametro
C4( ) (1 )C0 C1
C5( ) (1 )C2 C3
C45( ) (1 )C4 C5
interpoliamo lungo unalinea di scansione
Programmazione Grafica aa2005/2006 25
Dipende dall’orientamento
Programmazione Grafica aa2005/2006 26
Phong Smoothing
• Basato sull’interpolazione delle normali
• il colore si calcola alla fine sul singolo pixel
n (1 )nC nB
n( , ) (1 )nC nD
Programmazione Grafica aa2005/2006 27
Gouraud vs. Phong shading
• hardware• veloce• continuo fino al I
ordine• effetti lucentezza
limitati (migliorano se si aumenta la triangolazione)
• software• lento• continuo fino al II
ordine• si può applicare
modello di Phong per lucentezza
Programmazione Grafica aa2005/2006 28
Sorgenti di luce in OGL
glLightfv(source, parameter, pointer_to_array)glLightf(source, parameter, value)
I parametri sono:Posizione (direzione) della sorgenteLivelli di
AmbienteDiffusaSpeculare
Associati alla sorgente
Programmazione Grafica aa2005/2006 29
GLFloat light0_pos[]={1.0, 2.0, 3.0, 1.0}
Se si pone quarta componente a 0 la sorgente è all’infinito e definita come “direzione” GLFloat light0_dir[]={1.0, 2.0, 3.0, 0.0}
GLFloat diffuse0[]={1.0, 0.0, 0.0, 1.0}
GLFloat ambient0[]={1.0, 0.0, 0.0, 1.0}
GLFloat specular0[]={1.0, 0.0, 0.0, 1.0}
Sorgente bianca con componenti di tutti e tre i tipi:
Programmazione Grafica aa2005/2006 30
glEnable{GL_LIGHTING};glEnable{GL_LIGHT0};
glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);glLightfv(GL_LIGHT0, GL_SPECULAR, specular0);
Se vogliamo comunque un contributo ambiente indipendente:
GLFloat global_ambient[]={0.1, 0.1, 0.1, 1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
Programmazione Grafica aa2005/2006 31
Se vogliamo inserire un termine di attenuazione
f (d) 1
a bd cd 2
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, a);glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, b);glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, c);
Si può convertire la sorgente da puntiforme a spot, specificando:
direzione GL_SPOT_DIRECTIONesponente GL_SPOT_EXPONENTangolo di soglia GL_SPOT_CUTOFF
Si usa sempre la glLightf o glLightfv
Programmazione Grafica aa2005/2006 32
• OGL assume sempre l’osservatore a distanza infinita, in modo da considerare costante la direzione del viewer da ogni punto della scena
• Per forzare l’osservatore a condizioni di distanza non infinita si usa la:
glLightModel(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE)
Programmazione Grafica aa2005/2006 33
• OGL non si preoccupa di fare shading delle facce nascoste; se si desidera vedere facce nascoste si può forzare con:
glLightModel(GL_LIGHT_MODEL_TWO_SIDED,GL_TRUE)
Programmazione Grafica aa2005/2006 34
OGL e i materiali
GLFloat diffuse1[]={1.0, 0.8, 0.0, 1.0}
GLFloat ambient1[]={0.2, 0.2, 0.2, 1.0}
GLFloat specular1[]={1.0, 1.0, 1.0, 1.0}
glMaterialf(face, value)glMaterialfv(face, type, pointer_to_array)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient1);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse1);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular1);
Programmazione Grafica aa2005/2006 35
Con GL_FRONT e GL_BACK si specificano proprietà differenti per le facce frontali e nascoste
L’esponente nella componente speculare si specifica con:
GL_SHININESS
OGL permette di definire oggetti con componente emissiva:
GLFloat emission[]={0.0, 0.3, 0.3, 1.0};glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,
emission)