Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRino Basso Modificato 10 anni fa
1
Computer Graphics Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Lezione 11: lo Shading
2
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a I 4 fattori che consideriamo luce finale = ambiente + riflessione diffusa + riflessione speculare + emissione
3
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Equazione di Lighting caratteristiche della luce caratteristiche del materiale dati della geometria
4
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a ^ Normale di un triangolo Cioe' il suo orientamento nello spazio N v0v0 v2v2 v1v1
5
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Lighting faccia per faccia "flat shading" 1. geometria di partenza 2. per ogni faccia, calcolo normale 3. applico lighting ad ogni normale
6
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Definizione Shading: –ricetta per applicare un lighting Ad esempio: flat shading 1.Applico lighting a normale di faccia - (ottengo un colore) 2.Copro tutta la faccia di quel colore
7
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Flat shading: problema Approssimo superfici curve con triangoli Applico il flat shading Risultato: –spigoli apparenti su superfici curve un brutto artefatto ! non sembra nemmeno una sfera
8
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Flat shading: problema Altro esempio:
9
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Flat shading: problema Più facce uso, meno evidente il problema >10.000 facce, e ancora si vedono gli spigoli artefatti perche?
10
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Flat shading: problema A peggiorare le cose: l'effetto ottico Mach-band Il contrasto fra zone di colore uniforme difficilmente sfugge mai al nostro occhio. (neanche se le zone sono molte, e la differenza fra loro è relativamente piccola). Il cervello aumenta il contrasto fra le zone di colore uniformi L'artefatto e' duro a morire.
11
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Idea Utilizzare l'interpolazione del colore dentro alla faccia
12
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a "Gouraud" Shading Idea Utilizzare l'interpolazione del colore dentro alla faccia 1- Applico lighting ai 3 vertici di ogni triangolo (ottengo un colore) 2- Interpolo il colore nel triangolo Per applicare il lighting, devo avere la normale! Normale definita per una faccia. Ma per un vertice? Henri Gouraud, 1971
13
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Normali per vertice In certi contesti, la normale dei vertici nasce insieme al resto del modello 3D. –per esempio, quando si modella una sfera, un cilindro, un cono... quando si estrae la superficie da un volume (normale da derivate discrete) quando si costruisce una superficie triangolata campionando una superficie parametrica... Sennò...
14
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Normali per vertice Normale di un Triangolo: v1v1 v2v2 v1×v2v1×v2 Normale di un vertice condiviso da n triangoli:
15
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Dove avviene la computazione del lighting? Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice x y z v0v0 v1v1 v2v2 v0v0 v1v1 v2v2
16
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Scelta Fondamentale Nel nostro paradigma di rendering, la normale (dei vertici): NON viene calcolata nel pipeline (e dove?) viene mandata come ATTRIBUTO per VERTICE la normale "fa parte del modello" proprio come le posizioni dei suoi vertici la computazione delle normali, se necessaria, è tipicamente un pre-processing concettualmente giusto, e pratico
17
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Gouraud shading Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice compreso: proprietà del materiale e normale proietto e applico lighting interpolo colore compreso:c ol. finale compreso: colore per vertice (risultato del lighting)
18
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Gouraud shading Risultati:
19
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Si può fare meglio Invece di interpolare il colore dopo il lighting. interpolo la normale prima del lighting! occhio: interpolando due vettori normali, non ottengo un vettore normale: (devo rinormalizzare dopo l'interpolazione)
20
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Si può fare meglio Invece di interpolare il colore dopo il lighting. interpolo la normale prima del lighting! "Phong" Shading Bui-Tuong Phong, 1973 1- Interpolo la normale nella faccia 2- Rinormalizzo 3- Applico lighting * Attenzione a non confondere il Phong Shading (uno shading) con il Phong Lighting Model (modello di illuminazione) *
21
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Phong shading Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice compreso: proprietà del materiale e normale trasformo sia normale che posizione interpolo normale compreso: normale interpolata compreso: normale trasformata rinormalizzo e applico lighting per ottenere il colore del frammento
22
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Gouraud contro Phong shading Goraud Shading - lighting per vertice molto meno oneroso: applico il lighting una volta per vertice! Phong Shading - lighting per frammento risultati migliori specialmente con i riflessi luminosi e piccoli (esponente speculare alto) Flat shading Goraund shading Phong Shading
23
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a sia per il Gouraud che per il Phong shading flat shading Goraud shading (Phong shading è simile)
24
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a sia per il Gouraud che per il Phong shading Goraud e Phong servono per superfici lisce –eliminano gli spigoli artefatti –eliminano anche gli spigoli corretti Soluzione: duplicare i vertici
25
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Gouraud o Phong shading? le specifiche di OpenGL non prescrivono quale debba essere usato –spesso: Gouraud dipende dall'implementatore HW –non esitono nemmeno comandi OpenGL che cambiano shading da Phong a Gouraud –(con HW programmabile, possiamo decidere noi)
26
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Lighting in OpenGL: COME Abilitare il lighting: ( il colore corrente – per es glColor3f – non conta più. Conta il materiale corrente!) glEnable(GL_LIGHTING); Ora dobbiamo mandare le normali, settare le luci e i materiali
27
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Normali Setto la "normale corrente". Proprio come facevo con i colori: glNormal3d(x,y,z); la quarta coordinata e' sottointesa: ZERO! (si tratta di vettori)
28
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Cosa succede alle normali? x y z v0v0 v1v1 v2v2 world Coordinates y -z v0v0 v1v1 v2v2 view Coordinates (a.k.a. eye Coordinates) y x -z v0v0 v1v1 v2v2 v0v0 v2v2 v1v1 v0v0 v1v1 v2v2 screen Space Normalized Device Coordinates 1 1 x x y z v0v0 v1v1 v2v2 object Coordinates modellazione vista proiezione viewport Modellazione + Vista: spesso rototraslazioni (trasformazioni rigide) e scalature uniformi (che almeno mantengono gli angoli) Proiezione: non mantiene gli angoli risposta: subiscono la Model-View matrix, ma non la Projection matrix. E' proprio per questo che le due sono tenute separate!
29
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Le normali rimangono "normali" nella Transform? Solo se la modellazione-vista è rigida modellazione-vista = V M rotazioni, traslazioni (quindi rigida) rotazioni, traslazioni e forse scalature (quindi non sempre rigida)
30
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Le normali rimangono normali nella Transform? Morale: se uso scalature nella ModelView devo rinormalizzare le normali prima del Lighting chiedo ad OpenGL di farlo: o di non farlo: (default) glEnable(GL_NORMALIZE); glDisable(GL_NORMALIZE);
31
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Normali come attributi Proprio come il colore: glBegin(GL_TRIANGLES); glNormal3fv( n ); glVertex3fv( v0 ); glVertex3fv( v1 ); glVertex3fv( v2 ); glBegin(GL_END); glBegin(GL_TRIANGLES); glNormal3fv( n0 ); glVertex3fv( v0 ); glNormal3fv( n1 ); glVertex3fv( v1 ); glNormal3fv( n2 ); glVertex3fv( v2 ); glBegin(GL_END); flat shading ! Gouraud shading (o forse* Phong) * dipende dall'impl. di OpenGL
32
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Normali come attributi Scorciatoia: –se invoco: glShadeModel(GL_FLAT); glShadeModel(GL_SMOOTH); gli attributi non vongono interpolati ma rimangono costanti nella faccia (utile per le triangle strip e i triangle fan), finchè non rimetto
33
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Abbiamo a disposizione N luci –ricordiamoci: il loro effetto (ambient + diffuse + specular) si somma quante? –dipende dall'implementazione di OpenGL –le specifiche di OpenGL impongono: almeno 8 –il numero esatto lo troviamo nella costante GL_MAX_LIGHT
34
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Ogni luce può essere "accesa" o "spenta" dove GL_LIGHT0, GL_LIGHT1 etc sono costanti –nota: GL_LIGHTk vale GL_LIGHT0 + k. Utile per i for di default, la luce 0 è l'unica accesa glEnable(GL_LIGHT0); glEnable(GL_LIGHT1);...
35
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Di ogni luce, settiamo i colori glLightfv(GL_LIGHT0, GL_DIFFUSE, v); glLightfv(GL_LIGHT0, GL_AMBIENT, v); glLightfv(GL_LIGHT0, GL_SPECULAR, v);
36
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Di ogni luce, possiamo anche settare: –se voglio effetto spotlight: glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v); glLightf (GL_LIGHT0,GL_SPOT_CUTOFF,v); glLightf (GL_LIGHT0,GL_SPOT_EXPONENT,v); default: (0,0,-1) 180 0.0 glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,a); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,b); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,c); – se voglio attenuazione con la distanza: default: 100100
37
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Di ogni luce, settiamo la posizione: glLightfv(GL_LIGHT0,GL_POSITION,v); –Se luce posizionale, v = {x,y,z,1} –Se luce direzionale, ("distante all'infinito") v = {x,y,z,0} –Coordinate affini!
38
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: luci! Di ogni luce, settiamo la posizione: importante: la posizione delle luci subisce la moltiplicazione per la matrice MODEL_VIEW corrente glLightfv(GL_LIGHT0,GL_POSITION,v); per es: come faccio a fare la tipica headlight?
39
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Equazione di Lighting caratteristiche della luce caratteristiche del materiale dati della geometria
40
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a OpenGL: materiali! Settiamo tutti i parametri dei materiali: –i colori: glMaterialfv(face, GL_AMBIENT, colorvec); glMaterialfv(face, GL_EMISSION, colorvec); glMaterialfv(face, GL_DIFFUSE, colorvec); glMaterialfv(face, GL_SPECULAR, colorvec); glMaterialf (face, GL_SHININESS, intval); – l'esponente speculare: "GL_FRONT" scorciatoia: esiste anche asdasdsadasdasd che setta entrambi i colori allo stesso valore GL_AMBIENT_AND_DIFFUSE
41
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Il meccanismo "Color – Material" glEnable(GL_COLOR_MATERIAL); glColorMaterial(face, mode); glColorMaterial(GL_FRONT, GL_DIFFUSE); es: se si mette attivazione: uso: allora come colore diffuso del materiale si userà (l'altrimenti ingorato) colore corrente - si, proprio quello settato col vecchio glColor3f
42
M a r c o T a r i n i C o m p u t e r G r a p h i c s 2 0 0 6 / 0 7 U n i v e r s i t à d e l l I n s u b r i a Non abbiamo ancora visto: illuminazione da due lati contemporaneamente glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1); glColorMaterial3f(GL_BACK,... ); glColorMaterial3f(GL_FRONT,... ); glColorMaterial3f(GL_FRONT_AND_BACK,... ); attivazione: uso:
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.