Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

35
Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008

Transcript of Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Page 1: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Shading e smoothing

Daniele Marini

Corso Di Programmazione Grafica aa2007/2008

Page 2: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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

Page 6: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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

Page 8: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 11

Triangle strip

Page 12: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 12

Flat vs Smooth

Flat shading

Smooth shading

Page 13: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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)

Page 16: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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

Page 18: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 22

Smooth shading (interpolato)

• Interpolazione di Gouraud

glShadeModel(GL_SMOOTH)

• Interpolazione di Phong

Page 23: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 25

Dipende dall’orientamento

Page 26: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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

Page 32: Shading e smoothing Daniele Marini Corso Di Programmazione Grafica aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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 aa2007/2008.

Programmazione Grafica aa2007/2008 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)