La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Shading e smoothing Daniele Marini Corso Di Programmazione Grafica.

Presentazioni simili


Presentazione sul tema: "Shading e smoothing Daniele Marini Corso Di Programmazione Grafica."— Transcript della presentazione:

1 Shading e smoothing Daniele Marini Corso Di Programmazione Grafica

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

4 4 In generale possiamo partire da tre punti non allineati: p 0, p 1, p 2 con i quali determiniamo il piano (superfici approssimate con poliedri triangolarizzati). Le differenze p 2 - p 0 e p 1 - p 0 sono coplanari e il loro prodotto dà la normale: n = (p 2 - p 0 ) x (p 1 - p 0 ) Lordine è rilevante

5 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): x 2 + y 2 + z 2 -1=0 In forma vettoriale: f(p): p.p -1 = 0 Il vettore gradiente è dato da:

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

7 7 Individuano 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

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

9 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 sullintero poligono Il calcolo di shading viene fatto per lintero poligono una sola volta

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

11 11 Triangle strip

12 12 Flat vs Smooth Flat shading Smooth shading

13 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 14 Interpolazione Lineare Definisce un percorso rettilineo tra due punti in uno spazio n-dimensionale Una dimensione di interpolazione

15 15 Interpolazione Lineare Data due punti P 1 e P 2 definisco una funzione nel parametro t [0,1] P(t) = P 0 + t (P 1 – P 0 ) = (1-t)P 0 + t P 1 P1P1 P2P2 t=0 t=1 P(t)

16 16 Interpolazione Lineare Nel piano, dati due punti (x 1,y 1 ) e (x 2, y 2 ) si vuole calcolare (x P, y P ) conoscendo il valore di x P x1x1 x2x2 xPxP y1y1 y2y2 y P = ? dy y 2 -y 1

17 17 Interpolazione Lineare Si possono usare tecniche incrementali per accelerare il calcolo

18 18 Interpolazione Bi-lineare Considero due dimensioni di interpolazione Utilizzato per esempio allinterno di griglie regolari (es. texture) Peso i punti con delle aree P3P3 P4P4 P1P1 P2P2 P A1A1 A3A3 A2A2 A4A4

19 19 Interpolazione 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

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

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

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

23 23 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

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

25 25 Dipende dallorientamento

26 26 Phong Smoothing Basato sullinterpolazione delle normali il colore si calcola alla fine sul singolo pixel

27 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 28 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

29 29 GLFloat light0_pos[]={1.0, 2.0, 3.0, 1.0} Se si pone quarta componente a 0 la sorgente è allinfinito 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 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 31 Se 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 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 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 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 35 Con 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 emission[]={0.0, 0.3, 0.3, 1.0}; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission)


Scaricare ppt "Shading e smoothing Daniele Marini Corso Di Programmazione Grafica."

Presentazioni simili


Annunci Google