Post on 11-Feb-2016
description
Computer Graphics
Marco Tarini
Università dell’InsubriaFacoltà di Scienze MFN di VareseCorso di Laurea in InformaticaAnno Accademico 2006/07
Lezione 11: lo Shading
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
I 4 fattori che consideriamo
luce finale=
ambiente+
riflessione diffusa +
riflessione speculare+
emissione
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Equazione di Lighting
nspacularmaterialespacularluce NHkI )ˆˆ(
)ˆˆ( NLkI diffusematerialediffuseluce
ambientmaterialeambientluce kI
emissionmaterialek
totIluceneattenuaziof
1,1min 2L3L21 dcdcc
f luceoneattentuazi
spotlighteffettof
widthbeamAnglecutoffdirectionspotlighteffetto spotspotspotLf ,,,f
caratteristiche della lucecaratteristiche del materialedati della geometria
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
^
Normale di un triangolo
• Cioe' il suo orientamento nello spazio
N
v0
v2v1
)()( 0201 vvvvN
||ˆ
NNN
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Lighting faccia per faccia
"flat shading"
1.geometria di partenza
2.per ogni faccia,calcolo normale
3.applico lightingad ogni normale
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Definizione
• Shading:– ricetta per applicare un lighting
• Ad esempio:
flat shading1. Applico lighting a normale di faccia
- (ottengo un colore)2. Copro tutta la faccia di quel colore
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Flat shading: problema
• Approssimo superfici curve con triangoli• Applico il flat shading• Risultato:
–spigoli apparenti su superfici curve
un bruttoartefat
to!non sembra nemmeno
una sfera
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Flat shading: problema
• Altro esempio:
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Flat shading: problema
• Più facce uso,meno evidenteil problema
>10.000 facce,e ancora si vedono gli spigoli artefatti
perche?
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Flat shading: problema
• A peggiorare le cose: l'effetto ottico Mach-band
Il contrasto fra zone di colore uniforme difficilmente sfugge mai al nostro occhio. (neanche se le zone sono molte, e la differenza fra loro è relativamente piccola).Il cervello aumenta il contrasto fra le zone di colore uniformiL'artefatto e' duro a morire.
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Idea
• Utilizzare l'interpolazione del coloredentro alla faccia
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
"Gouraud" Shading
Idea
• Utilizzare l'interpolazione del coloredentro alla faccia
1- Applico lighting ai 3 vertici di ogni triangolo• (ottengo un colore)
2- Interpolo il colore nel triangolo
Per applicare il lighting, devo avere la normale!
Normale definita per una faccia.Ma per un vertice?
Henri Gouraud, 1971
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Normali per vertice
• In certi contesti, la normale dei verticinasce insieme al resto del modello 3D.– per esempio,
• quando si modella una sfera, un cilindro, un cono...
• quando si estrae la superficie da un volume(normale da derivate discrete)
• quando si costruisce una superficie triangolata campionando una superficie parametrica
• ...• Sennò...
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Normali per verticeNormale di un Triangolo:
v1
v2
v1×v2
vN̂1N̂
2N̂
3N̂4N̂
5N̂6N̂
Normale di un verticecondiviso da n triangoli:
nNNNN ˆ...ˆˆ21
||ˆ
NNN
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Dove avviene la computazione del lighting?
Fram
men
ti&
att
ribu
ti
inte
rpol
ati
Verti
ci &
loro
at
trib
uti
Screen bufferVe
rtici
porie
ttati
& a
ttri
buti
co
mpu
tati
rasterizer
triangoli
com
puta
zioni
per f
ram
men
to
set-up rasterize
rsegment
i
set-up
rasterizer
puntiset-up
com
puta
zioni
per v
ertic
e
x
y
z
v0v1
v2
v0v1
v2
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Scelta Fondamentale
• Nel nostro paradigma di rendering,la normale (dei vertici):
• NON viene calcolata nel pipeline (e dove?)• viene mandata come ATTRIBUTO per VERTICE
• la normale "fa parte del modello"• proprio come le posizioni dei suoi vertici• la computazione delle normali, se necessaria,
è tipicamente un pre-processing
• concettualmente giusto, e pratico
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Gouraud shading
Fram
men
ti&
att
ribu
ti
inte
rpol
ati
Verti
ci &
loro
at
trib
uti
Screen bufferVe
rtici
porie
ttati
& a
ttri
buti
co
mpu
tati
rasterizer
triangoli
com
puta
zioni
per f
ram
men
to
set-up rasterize
rsegment
i
set-up
rasterizer
puntiset-up
com
puta
zioni
per v
ertic
e
compreso:
proprietà del
materialee normale
proiettoe
applicolighting
interpolo
colorecompreso:col. finale
compreso:
coloreper
vertice(risultato
del lighting)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Gouraud shading
• Risultati:
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Si può fare meglio
• Invece di interpolare il colore dopo il lighting.interpolo la normale prima del lighting!
• occhio:interpolando due vettori normali, non ottengo un vettore normale:
• (devo rinormalizzare dopo l'interpolazione)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Si può fare meglio
• Invece di interpolare il colore dopo il lighting.interpolo la normale prima del lighting!"Phong" Shading Bui-Tuong Phong ,
1973 1- Interpolo la normale nella faccia2- Rinormalizzo3- Applico lighting
* Attenzione a non confondere il Phong Shading (uno shading) con il Phong Lighting Model (modello di illuminazione)
*
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Phong shading
Fram
men
ti&
att
ribu
ti
inte
rpol
ati
Verti
ci &
loro
at
trib
uti
Screen bufferVe
rtici
porie
ttati
& a
ttri
buti
co
mpu
tati
rasterizer
triangoli
com
puta
zioni
per f
ram
men
to
set-up rasterize
rsegment
i
set-up
rasterizer
puntiset-up
com
puta
zioni
per v
ertic
e
compreso:
proprietà del
materialee normale
trasformosia
normaleche
posizione
interpolo
normale
compreso: normaleinterpolat
a
compreso:
normaletrasforma
ta
rinormalizzo eapplicolighting
per ottenereil colore
del frammento
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Gouraud contro Phong shading• Goraud Shading - lighting per vertice
molto meno oneroso:applico il lighting una volta per vertice!
• Phong Shading - lighting per frammentorisultati migliori
specialmente con i riflessi luminosi e piccoli (esponente speculare alto)
Flat shading Goraund shading Phong Shading
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
sia per il Gouraud che per il Phong shading
flat shading Goraud shading(Phong shading è simile)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
sia per il Gouraud che per il Phong shading• Goraud e Phong servono per superfici
lisce– eliminano gli spigoli artefatti– eliminano anche gli spigoli corretti
• Soluzione: duplicare i vertici
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Gouraud o Phong shading?
• le specifiche di OpenGL non prescrivono quale debba essere usato– spesso: Gouraud
• dipende dall'implementatore HW– non esitono nemmeno comandi OpenGL
che cambiano shading da Phong a Gouraud
– (con HW programmabile, possiamo decidere noi)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Lighting in OpenGL: COME
• Abilitare il lighting:
( il colore corrente – per es glColor3f – non conta più. Conta il materiale corrente!)
glEnable(GL_LIGHTING);
• Ora dobbiamo mandare le normali, settare le luci e i materiali
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Normali
• Setto la "normale corrente".Proprio come facevo con i colori:
glNormal3d(x,y,z);
la quarta coordinata e' sottointesa: ZERO!(si tratta di vettori)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Cosa succede alle normali?
x
y
z
v0v1
v2
world Coordinates
y
-zv0
v1
v2
view Coordinates(a.k.a. eye Coordinates)
yx
-zv0
v1
v2
v0
v2
v1
v0v1
v2
screen Space
Normalized Device Coordinates
1
-1 1
-1
x
x
y
z
v0
v1
v2
object Coordinates
modellazione
vist
a
proi
ezio
neviewport
Modellazione + Vista:spesso rototraslazioni (trasformazioni rigide)e scalature uniformi (che almeno mantengono gli angoli)
Proiezione:non mantiene gli angoli
risposta: subiscono la Model-View matrix,ma non la Projection matrix.E' proprio per questo che le due sono tenute separate!
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Le normali rimangono "normali" nella Transform?• Solo se la modellazione-vista è rigida
modellazione-vista = V ‧ M
rotazioni,traslazioni
(quindi rigida)
rotazioni,traslazionie forse scalature(quindi non sempre rigida)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Le normali rimangono normali nella Transform?• Morale: se uso scalature nella ModelView
devo rinormalizzare le normali prima del Lighting
• chiedo ad OpenGL di farlo:
o di non farlo: (default)
glEnable(GL_NORMALIZE);
glDisable(GL_NORMALIZE);
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Normali come attributi
• Proprio come il colore:glBegin(GL_TRIANGLES); glNormal3fv( n ); glVertex3fv( v0 ); glVertex3fv( v1 ); glVertex3fv( v2 ); glBegin(GL_END);
glBegin(GL_TRIANGLES); glNormal3fv( n0 ); glVertex3fv( v0 ); glNormal3fv( n1 ); glVertex3fv( v1 ); glNormal3fv( n2 ); glVertex3fv( v2 ); glBegin(GL_END);
flat shading !
Gouraud shading (o forse* Phong)* dipende dall'impl. di
OpenGL
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Normali come attributi
• Scorciatoia:– se invoco:
glShadeModel(GL_FLAT);
glShadeModel(GL_SMOOTH);
gli attributi non vongono interpolatima rimangono costanti nella faccia(utile per le triangle strip e i triangle fan), finchè non rimetto
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Abbiamo a disposizione N luci– ricordiamoci: il loro effetto
(ambient + diffuse + specular) si somma
• quante? – dipende dall'implementazione di OpenGL– le specifiche di OpenGL impongono: almeno 8– il numero esatto lo troviamo nella costante
GL_MAX_LIGHT
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Ogni luce può essere "accesa" o "spenta"
• dove GL_LIGHT0, GL_LIGHT1 etc sono costanti– nota: GL_LIGHTk vale GL_LIGHT0+k. Utile per i for
• di default, la luce 0 è l'unica accesa
glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);...
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Di ogni luce, settiamo i colori
glLightfv(GL_LIGHT0, GL_DIFFUSE, v);
glLightfv(GL_LIGHT0, GL_AMBIENT, v);
glLightfv(GL_LIGHT0, GL_SPECULAR, v);
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Di ogni luce, possiamo anche settare:– se voglio effetto spotlight:glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v);glLightf (GL_LIGHT0,GL_SPOT_CUTOFF,v);glLightf (GL_LIGHT0,GL_SPOT_EXPONENT,v);
default:(0,0,-1) 180 0.0
glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,a);glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,b);glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,c);
– se voglio attenuazione con la distanza: default:100
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Di ogni luce, settiamo la posizione:glLightfv(GL_LIGHT0,GL_POSITION,v);
– Se luce posizionale,v = {x,y,z,1}
– Se luce direzionale, ("distante all'infinito") v = {x,y,z,0}– Coordinate affini!
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: luci!
• Di ogni luce, settiamo la posizione:
• importante:la posizione delle luci subisce la moltiplicazioneper la matrice MODEL_VIEW corrente
glLightfv(GL_LIGHT0,GL_POSITION,v);
per es: come faccio a fare la tipica headlight?
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Equazione di Lighting
nspacularmaterialespacularluce NHkI )ˆˆ(
)ˆˆ( NLkI diffusematerialediffuseluce
ambientmaterialeambientluce kI
emissionmaterialek
totIluceneattenuaziof
1,1min 2L3L21 dcdcc
f luceoneattentuazi
spotlighteffettof
widthbeamAnglecutoffdirectionspotlighteffetto spotspotspotLf ,,,f
caratteristiche della lucecaratteristiche del materialedati della geometria
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
OpenGL: materiali!
• Settiamo tutti i parametri dei materiali:– i colori: glMaterialfv(face, GL_AMBIENT, colorvec); glMaterialfv(face, GL_EMISSION, colorvec); glMaterialfv(face, GL_DIFFUSE, colorvec); glMaterialfv(face, GL_SPECULAR, colorvec);
glMaterialf (face, GL_SHININESS, intval);
– l'esponente speculare:
"GL_FRONT"
scorciatoia: esiste anche asdasdsadasdasd
che setta entrambii colori allo stesso valore
GL_AMBIENT_AND_DIFFUSE
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Il meccanismo "Color – Material"
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(face, mode);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
es: se si mette
attivazione:
uso:
allora come colore diffuso del materiale siuserà (l'altrimenti ingorato) colore corrente - si, proprio quello settato col vecchio glColor3f
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Non abbiamo ancora visto:illuminazione da due lati contemporaneamente
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
glColorMaterial3f(GL_BACK, ... );
glColorMaterial3f(GL_FRONT, ... );
glColorMaterial3f(GL_FRONT_AND_BACK, ... );
attivazione:
uso: