Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

35
Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006

Transcript of Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Page 1: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Shading e smoothing

Daniele Marini

Corso Di Programmazione Grafica aa2005/2006

Page 2: 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

Page 3: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 4: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 5: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 6: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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:

Page 7: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 8: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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);

Page 9: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 10: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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)

Page 11: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 11

Triangle strip

Page 12: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 12

Flat vs Smooth

Flat shading

Smooth shading

Page 13: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 14: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 14

Interpolazione Lineare

• Definisce un percorso rettilineo tra due punti in uno spazio n-dimensionale

• Una dimensione di interpolazione

Page 15: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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)

Page 16: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 17: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 18: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 19: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 20: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 21: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 22: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 22

Smooth shading (interpolato)

• Interpolazione di Gouraud

glShadeModel(GL_SMOOTH)

• Interpolazione di Phong

Page 23: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 24: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 25: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

Programmazione Grafica aa2005/2006 25

Dipende dall’orientamento

Page 26: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 27: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 28: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 29: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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:

Page 30: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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);

Page 31: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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

Page 32: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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)

Page 33: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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)

Page 34: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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);

Page 35: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2005/2006.

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)