La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Smoothing Daniele Marini.

Presentazioni simili


Presentazione sul tema: "Smoothing Daniele Marini."— Transcript della presentazione:

1 Smoothing Daniele Marini

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

3 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 è rilevante

4 Per il calcolo di normali di superfici curve dipende da come la superficie è rappresentata, ma in generale si stima un gradiente. Es. sfera - equazione f(x,y,z): x2 + y2 + z2 -1=0 In forma vettoriale: f(p): p.p -1 = 0 Il vettore gradiente è dato da:

5 Se la sfera è rappresentata in forma parametrica il metodo di calcolo cambia:
La normale si può ricavare dal piano tangente in p:

6 Individuano due vettori
tangenti il cui prodotto vettore individua la normale - poiché ci interessa solo la direzione si può dividere per cos(u) ottenendo un vettore unitario

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

8 La luce trasmessa - rifrazione
Legge di Snell: Per trovare il vettore trasmesso t: conosciamo cos(ul) da n ed l (se normalizzati basta il loro prodotto scalare), calcoliamo cos(ut): Poiché i tre vettori sono coplanari, si possono scrivere come combinazione lineare (uno si ricava come somma degli altri due), e imponendo lunghezza unitaria si trova t:

9 Angolo critico Il valore di ul che rende nulla la:
Si chiama angolo critico, ovvero: l’angolo trasmesso è parallelo alla superfici, e per valori maggiori si ha riflessione e non trasmissione

10 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

11 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ì via Per altre primitive valgono regole simili (vedi manuali)

12 Triangle strip

13 Effetti di flat shading
Bande di mach

14 Smooth shading (interpolato)
Interpolazione di Gouraud glShadeModel(GL_SMOOTH) Interpolazione di Phong

15 Gouraud 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

16 Interpolazione bilineare
interpoliamo lungo una linea di scansione descriviamo i lati in forma parametrica, a è il parametro

17 Dipende dall’orientamento

18 Phong Smoothing Basato sull’interpolazione delle normali
il colore si calcola alla fine sul singolo pixel

19 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

20 Sorgenti 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

21 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} Sorgente bianca con componenti di tutti e tre i tipi: 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}

22 glEnable{GL_LIGHTING};
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);

23 Se vogliamo inserire un termine di attenuazione
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, a); 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

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

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

26 OGL e i materiali glMaterialf(face, value)
glMaterialfv(face, type, pointer_to_array) 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} glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient1); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse1); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular1);

27 GLFloat emission[]={0.0, 0.3, 0.3, 1.0};
Con GL_FRONT e GL_BACK si specificano proprietà differente 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)


Scaricare ppt "Smoothing Daniele Marini."

Presentazioni simili


Annunci Google