Computer Graphics
Lezione 11:
Università dell’Insubria
Facoltà di Scienze MFN di Varese
Corso di Laurea in Informatica
Anno Accademico 2006/07
Marco Tarini
lo Shading
I 4 fattori che consideriamo
luce finale
=
ambiente
+
riflessione diffusa
+
riflessione speculare
+
emissione
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Equazione di Lighting
I luce ambient  k materialeambient 
I tot 
I luce diffuse  kmaterialediffuse  ( Lˆ  Nˆ ) 
n
ˆ
ˆ
I luce spacular  kmaterialespacular  ( H  N )
caratteristiche della luce
caratteristiche del materiale
dati della geometria
 f attenuazione luce
 f effettospotlight
 k materialeemission


1
f attentuazione luce  min 
, 1
2
 c1  c2 d L  c3d L 
f effettospotlight  f L, spot direction, spot cutoff Angle, spot beam width 
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Normale di un triangolo
• Cioe' il suo orientamento nello spazio
v1
^
N
v0
N  (v1  v0 )  (v2  v0 )
v2
N
ˆ
N
|N|
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Lighting faccia per faccia
"flat shading"
1.
geometria di partenza
2.
per ogni faccia,
calcolo normale
3.
applico lighting
ad ogni normale
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Definizione
•
Shading:
–
•
ricetta per applicare un lighting
Ad esempio:
flat shading
1. Applico lighting a normale di faccia
- (ottengo un colore)
2. Copro tutta la faccia di quel colore
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Flat shading: problema
• Approssimo superfici curve con triangoli
• Applico il flat shading
• Risultato:
– spigoli apparenti su superfici curve
non sembra nemmeno
una sfera
un
brutto
artefatto
!
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Flat shading: problema
• Altro esempio:
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Flat shading: problema
• Più facce uso,
meno evidente
il problema
>10.000 facce,
e ancora si vedono
gli spigoli artefatti
perche?
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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 uniformi
L'artefatto e' duro a morire.
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Idea
• Utilizzare l'interpolazione del colore
dentro alla faccia
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Idea
• Utilizzare l'interpolazione del colore
dentro alla faccia
"Gouraud" Shading
Henri Gouraud, 1971
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?
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Normali per vertice
• In certi contesti, la normale dei vertici
nasce 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ò...
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Normali per vertice
Normale di un Triangolo:
v1
v1×v2
v2
Normale di un vertice
condiviso da n triangoli:
N  Nˆ 1  Nˆ 2  ...  Nˆ n
N
ˆ
N
|N|
N̂1
N̂v
N̂ 6
N̂ 2
N̂ 5
N̂3
N̂ 4
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
Vertici
computazioni
per vertice
& loro attributi
Dove avviene la computazione del lighting?
Screen
buffer
y
v1
v0
x
v2
v1
v0
z
v2
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
compreso:
proprietà
del
materiale
e normale
proietto
e
applico
lighting
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
compreso:
colore
per vertice
interpolo
colore
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
Gouraud shading
Screen
buffer
compreso:c
ol. finale
(risultato
del lighting)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Gouraud shading
• Risultati:
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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 faccia
2- Rinormalizzo
3- Applico lighting
* Attenzione a non confondere il Phong Shading (uno shading)
con il Phong Lighting Model (modello di illuminazione)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
compreso:
proprietà
del
materiale
e normale
trasformo
sia
normale
che
posizione
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
compreso:
normale
trasformata
interpolo
normale
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
Phong shading
compreso:
normale
interpolata
Screen
buffer
rinormalizzo e
applico
lighting
per ottenere
il colore
del frammento
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Gouraud contro Phong shading
• Goraud Shading - lighting per vertice
molto meno oneroso:
applico il lighting una volta per vertice!
• Phong Shading - lighting per frammento
risultati migliori
specialmente con i riflessi luminosi e piccoli (esponente speculare alto)
M a r cFlat
o T ashading
r i n i ‧ C o m p u t e r G r a pGoraund
h i c s ‧ 2 0shading
0 6 / 0 7 ‧ U n i v e r s i t à dPhong
e l l ’ I n s Shading
ubria
sia per il Gouraud che per il Phong shading
flat shading
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧
Goraud shading
U n i v e r s i(Phong
t à d e l l ’shading
I n s u b r i aè simile)
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
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Lighting in OpenGL: COME
• Abilitare il lighting:
glEnable(GL_LIGHTING);
( il colore corrente – per es glColor3f –
non conta più.
Conta il materiale corrente!)
• Ora dobbiamo mandare le normali,
settare le luci e i materiali
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Cosa succede alle normali?
Modellazione + Vista:
spesso rototraslazioni
(trasformazioni rigide)
e scalature uniformi
(che almeno mantengono
gli angoli)
y
v0
v1
x
v2
risposta: subiscono la Model-View matrix,
ma non la Projection matrix.
E' proprio per questo che le due sono
tenute separate!
z
v2
Proiezione:
non mantiene gli angoli
object Coordinates
modellazione
v1
v0
screen Space
viewport
v2
z
vista
v1
v0
x
y
v1
-z
x
v0
v2
proiezione
y
1
v0
1
v2
-1
v1
y
v1
x
-z
v2
v0
-1
view Coordinates
Normalized Device
M a r c o T a r i n i ‧ C o m p u t(a.k.a.
e r G reye
a p Coordinates)
h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l lCoordinates
’Insubria
world Coordinates
Le normali rimangono "normali" nella Transform?
• Solo se la modellazione-vista è rigida
modellazione-vista = V ‧ M
rotazioni,
traslazioni
(quindi rigida)
rotazioni,
traslazioni
e forse scalature
(quindi non sempre rigida)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Le normali rimangono normali nella Transform?
• Morale: se uso scalature nella ModelView devo
rinormalizzare le normali prima del Lighting
• chiedo ad OpenGL di farlo:
glEnable(GL_NORMALIZE);
o di non farlo: (default)
glDisable(GL_NORMALIZE);
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Normali come attributi
• Scorciatoia:
– se invoco:
glShadeModel(GL_FLAT);
gli attributi non vongono interpolati
ma rimangono costanti nella faccia
(utile per le triangle strip e i triangle fan),
finchè non rimetto
glShadeModel(GL_SMOOTH);
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
OpenGL: luci!
• Ogni luce può essere "accesa" o "spenta"
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
...
• 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
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
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);
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
OpenGL: luci!
• Di ogni luce, possiamo anche settare:
– se voglio effetto spotlight:
default:
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v);
glLightf (GL_LIGHT0,GL_SPOT_CUTOFF,v);
glLightf (GL_LIGHT0,GL_SPOT_EXPONENT,v);
(0,0,-1)
180
0.0
– se voglio attenuazione con la distanza:
default:
glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,a);
glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,b);
glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,c);
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
1
0
0
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!
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
OpenGL: luci!
• Di ogni luce, settiamo la posizione:
glLightfv(GL_LIGHT0,GL_POSITION,v);
• importante:
la posizione delle luci subisce la moltiplicazione
per la matrice MODEL_VIEW corrente
per es: come faccio a fare la tipica headlight?
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Equazione di Lighting
I luce ambient  k materialeambient 
I tot 
I luce diffuse  kmaterialediffuse  ( Lˆ  Nˆ ) 
n
ˆ
ˆ
I luce spacular  kmaterialespacular  ( H  N )
caratteristiche della luce
caratteristiche del materiale
dati della geometria
 f attenuazione luce
 f effettospotlight
 k materialeemission


1
f attentuazione luce  min 
, 1
2
 c1  c2 d L  c3d L 
f effettospotlight  f L, spot direction, spot cutoff Angle, spot beam width 
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
OpenGL: materiali!
• Settiamo tutti i parametri dei materiali:
– i colori:
glMaterialfv(face,
glMaterialfv(face,
glMaterialfv(face,
glMaterialfv(face,
GL_AMBIENT, colorvec);
GL_EMISSION, colorvec);
GL_DIFFUSE, colorvec);
GL_SPECULAR, colorvec);
– l'esponente speculare:
glMaterialf (face, GL_SHININESS, intval);
"GL_FRONT"
scorciatoia: esiste anche
GL_AMBIENT_AND_DIFFUSE
asdasdsadasdasd
che setta entrambi
i colori allo stesso valore
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Il meccanismo "Color – Material"
attivazione:
glEnable(GL_COLOR_MATERIAL);
uso:
glColorMaterial(face, mode);
es: se si mette
glColorMaterial(GL_FRONT, GL_DIFFUSE);
allora come colore diffuso del materiale si
userà (l'altrimenti ingorato) colore corrente
- si, proprio quello settato col vecchio glColor3f
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Non abbiamo ancora visto:
illuminazione da due lati contemporaneamente
attivazione:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
uso:
glColorMaterial3f(GL_BACK, ... );
glColorMaterial3f(GL_FRONT, ... );
glColorMaterial3f(GL_FRONT_AND_BACK, ... );
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Scarica

ppt