Title: Shading e smoothing
1Shading e smoothing
Corso Di Programmazione Grafica aa2006/2007
2Scopo
- 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
3Calcoli sui vettori
- Vettore normale
- equazione del piano axbyczd0 si può anche
scrivere come luogo - e p è un qualunque punto nel piano il vettore n
è dato da
4In 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) Lordine è
rilevante
5Il 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
-10 In forma vettoriale f(p) p.p -1 0 Il
vettore gradiente è dato da
6Se la sfera è rappresentata in forma parametrica
il metodo di calcolo cambia
La normale si può ricavare dal piano tangente in
p
7Individuano due vettori tangenti il cui prodotto
vettore determina la normale - poiché ci
interessa solo la direzione si può dividere per
cos(u) ottenendo un vettore unitario
8Quando calcolare le normali?
- Larchitettura 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 linformazione è disponibile) - in generale è compito del programma applicativo
calcolare la normale. OpenGL permette di
associare a ogni vertice una normale (che
dobbiamo calcolare noi nellapplicativo) - glNormal3f(nx,ny,nz)
- glNormal3fv(pointer_to_normal)
9Shading 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 sullintero poligono
- Il calcolo di shading viene fatto per lintero
poligono una sola volta
10OGL 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ì via Per altre primitive valgono regole
simili (vedi manuali)
11Triangle strip
12Flat vs Smooth
Smooth shading
Flat shading
13Interpolazione
- 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
14Interpolazione Lineare
- Definisce un percorso rettilineo tra due punti in
uno spazio n-dimensionale - Una dimensione di interpolazione
15Interpolazione Lineare
t1
- Data due punti P1 e P2 definisco una funzione nel
parametro t?0,1 - P(t) P0 t (P1 P0) (1-t)P0 t P1
P2
P(t)
t0
P1
16Interpolazione Lineare
- Nel piano, dati due punti (x1,y1) e (x2, y2) si
vuole calcolare (xP, yP) conoscendo il valore di
xP
y2
yP ?
y1
dy
y2-y1
x1
x2
xP
17Interpolazione Lineare
Si possono usare tecniche incrementali per
accelerare il calcolo
18Interpolazione Bi-lineare
- Considero due dimensioni di interpolazione
- Utilizzato per esempio allinterno di griglie
regolari (es. texture) - Peso i punti condelle aree
P1
P2
A3
A4
P
A1
A2
P3
P4
19Interpolazione quadratica e cubica
- Linterpolazione lineare calcola i valori
intermedi utilizzando lequazione 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
20Curve parametriche
- Quando interpolo tra due punti linterpolazione
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
21Curve 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)
22Smooth shading (interpolato)
- Interpolazione di Gouraud
- glShadeModel(GL_SMOOTH)
- Interpolazione di Phong
23Gouraud
Le normali ai vertici di un poliedro vengono
interpolate
- Gouraud usa interpolazione bilineare per
calcolare il colore dei pixel lungo i singoli
poligoni, quindi - prima calcola colore ai vertici
- poi interpola colore
24Interpolazione bilineare
interpoliamo lungo una linea di scansione
25Dipende dallorientamento
26Phong Smoothing
- Basato sullinterpolazione delle normali
- il colore si calcola alla fine sul singolo pixel
27Gouraud 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
28Sorgenti di luce in OGL
- glLightfv(source, parameter, pointer_to_array)
- glLightf(source, parameter, value)
- I parametri sono
- Posizione (direzione) della sorgente
- Livelli di
- Ambiente
- Diffusa
- Speculare
- Associati alla sorgente
29GLFloat light0_pos1.0, 2.0, 3.0, 1.0
Se si pone quarta componente a 0 la sorgente è
allinfinito e definita come direzione
GLFloat light0_dir1.0, 2.0, 3.0, 0.0
Sorgente bianca con componenti di tutti e tre i
tipi
GLFloat diffuse01.0, 0.0, 0.0, 1.0
GLFloat ambient01.0, 0.0, 0.0, 1.0
GLFloat specular01.0, 0.0, 0.0, 1.0
30glEnableGL_LIGHTING glEnableGL_LIGHT0 glLig
htfv(GL_LIGHT0, GL_POSITION, light0_pos) glLightf
v(GL_LIGHT0, GL_AMBIENT, ambient0) glLightfv(GL_L
IGHT0, GL_DIFFUSE, diffuse0) glLightfv(GL_LIGHT0,
GL_SPECULAR, specular0)
Se vogliamo comunque un contributo ambiente
indipendente
GLFloat global_ambient0.1, 0.1, 0.1,
1.0 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
global_ambient)
31Se vogliamo inserire un termine di attenuazione
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_DIRECTION esponente GL_SPOT_EXPONENT
angolo di soglia GL_SPOT_CUTOFF Si usa sempre
la glLightf o glLightfv
32- OGL assume sempre losservatore a distanza
infinita, in modo da considerare costante la
direzione del viewer da ogni punto della scena - Per forzare losservatore a condizioni di
distanza non infinita si usa la
glLightModel(GL_LIGHT_MODEL_LOCAL_VIEWER,
GL_TRUE)
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)
34OGL e i materiali
glMaterialf(face, value) glMaterialfv(face, type,
pointer_to_array)
GLFloat diffuse11.0, 0.8, 0.0, 1.0
GLFloat ambient10.2, 0.2, 0.2, 1.0
GLFloat specular11.0, 1.0, 1.0, 1.0
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
ambient1) glMaterialfv(GL_FRONT_AND_BACK,
GL_DIFFUSE, diffuse1) glMaterialfv(GL_FR
ONT_AND_BACK, GL_SPECULAR, specular1)
35Con GL_FRONT e GL_BACK si specificano proprietÃ
differenti per le facce frontali e
nascoste Lesponente nella componente speculare
si specifica con GL_SHININESS OGL permette di
definire oggetti con componente
emissiva GLFloat emission0.0, 0.3, 0.3,
1.0 glMaterialfv(GL_FRONT_AND_BACK,
GL_EMISSION, emission)