shading e smoothing daniele marini corso di programmazione grafica per il tempo reale
Post on 02-May-2015
216 Views
Preview:
TRANSCRIPT
Shading e smoothing
Daniele Marini
Corso Di Programmazione Grafica per il Tempo Reale
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
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
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
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
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∂x∂f∂y∂f∂z
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
=
2x
2y
2z
⎡
⎣
⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥
=2p
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:
7
∂p∂u
=
∂x∂u∂y∂u∂z∂u
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
, ∂p∂v
=
∂x∂v∂y∂v∂z∂v
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥
n=∂p∂u
×∂p∂v
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
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);
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
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)
11
Triangle strip
12
Flat vs Smooth
Flat shading
Smooth shading
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
14
Interpolazione Lineare
• Definisce un percorso rettilineo tra due punti in uno spazio n-dimensionale
• Una dimensione di interpolazione
15
Interpolazione Lineare
• 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
P1
P2
t=0
t=1
P(t)
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
17
Interpolazione Lineare
€
y p = y1 + dy
vale la relazione :
dy
x p − x1
=(y2 − y1)(x p − x1)
x2 − x1
da cui :
y p = y1 +(y2 − y1)(x p − x1)
x2 − x1
Si possono usare tecniche incrementali per accelerare il calcolo
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
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
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
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[ ]
22
Smooth shading (interpolato)
• Interpolazione di Gouraud
glShadeModel(GL_SMOOTH)
• Interpolazione di Phong
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
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
25
Dipende dall’orientamento
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
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
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
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:
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);
31
Se vogliamo inserire un termine di attenuazione
f (d) =1
a+bd+cd2
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
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)
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)
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);
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)
top related