Computer Graphics Lezione 11: Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Marco Tarini lo Shading I 4 fattori che consideriamo luce finale = ambiente + riflessione diffusa + riflessione speculare + emissione Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Equazione di Lighting I luce ambient k materialeambient I tot I luce diffuse kmaterialediffuse ( Lˆ Nˆ ) n ˆ ˆ I luce spacular kmaterialespacular ( H N ) caratteristiche della luce caratteristiche del materiale dati della geometria f attenuazione luce f effettospotlight k materialeemission 1 f attentuazione luce min , 1 2 c1 c2 d L c3d L f effettospotlight f L, spot direction, spot cutoff Angle, spot beam width Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Normale di un triangolo • Cioe' il suo orientamento nello spazio v1 ^ N v0 N (v1 v0 ) (v2 v0 ) v2 N ˆ N |N| Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Lighting faccia per faccia "flat shading" 1. geometria di partenza 2. per ogni faccia, calcolo normale 3. applico lighting ad ogni normale Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Flat shading: problema • Approssimo superfici curve con triangoli • Applico il flat shading • Risultato: – spigoli apparenti su superfici curve non sembra nemmeno una sfera un brutto artefatto ! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Flat shading: problema • Altro esempio: Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Flat shading: problema • Più facce uso, meno evidente il problema >10.000 facce, e ancora si vedono gli spigoli artefatti perche? Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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. Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Idea • Utilizzare l'interpolazione del colore dentro alla faccia Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Idea • Utilizzare l'interpolazione del colore dentro alla faccia "Gouraud" Shading Henri Gouraud, 1971 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? Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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ò... Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Normali per vertice Normale di un Triangolo: v1 v1×v2 v2 Normale di un vertice condiviso da n triangoli: N Nˆ 1 Nˆ 2 ... Nˆ n N ˆ N |N| N̂1 N̂v N̂ 6 N̂ 2 N̂ 5 N̂3 N̂ 4 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria rasterizer punti setup rasterizer triangoli setup rasterizer segmenti computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati Vertici computazioni per vertice & loro attributi Dove avviene la computazione del lighting? Screen buffer y v1 v0 x v2 v1 v0 z v2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: proprietà del materiale e normale proietto e applico lighting rasterizer punti setup rasterizer triangoli setup rasterizer segmenti compreso: colore per vertice interpolo colore computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Gouraud shading Screen buffer compreso:c ol. finale (risultato del lighting) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Gouraud shading • Risultati: Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria compreso: proprietà del materiale e normale trasformo sia normale che posizione rasterizer punti setup rasterizer triangoli setup rasterizer segmenti compreso: normale trasformata interpolo normale computazioni per frammento setup Frammenti & attributi interpolati Vertici poriettati & attributi computati computazioni per vertice Vertici & loro attributi Phong shading compreso: normale interpolata Screen buffer rinormalizzo e applico lighting per ottenere il colore del frammento Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) M a r cFlat o T ashading r i n i ‧ C o m p u t e r G r a pGoraund h i c s ‧ 2 0shading 0 6 / 0 7 ‧ U n i v e r s i t à dPhong e l l ’ I n s Shading ubria sia per il Gouraud che per il Phong shading flat shading Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Goraud shading U n i v e r s i(Phong t à d e l l ’shading I n s u b r i aè simile) 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Lighting in OpenGL: COME • Abilitare il lighting: glEnable(GL_LIGHTING); ( il colore corrente – per es glColor3f – non conta più. Conta il materiale corrente!) • Ora dobbiamo mandare le normali, settare le luci e i materiali Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Cosa succede alle normali? Modellazione + Vista: spesso rototraslazioni (trasformazioni rigide) e scalature uniformi (che almeno mantengono gli angoli) y v0 v1 x v2 risposta: subiscono la Model-View matrix, ma non la Projection matrix. E' proprio per questo che le due sono tenute separate! z v2 Proiezione: non mantiene gli angoli object Coordinates modellazione v1 v0 screen Space viewport v2 z vista v1 v0 x y v1 -z x v0 v2 proiezione y 1 v0 1 v2 -1 v1 y v1 x -z v2 v0 -1 view Coordinates Normalized Device M a r c o T a r i n i ‧ C o m p u t(a.k.a. e r G reye a p Coordinates) h i c s ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l lCoordinates ’Insubria world Coordinates 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) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Le normali rimangono normali nella Transform? • Morale: se uso scalature nella ModelView devo rinormalizzare le normali prima del Lighting • chiedo ad OpenGL di farlo: glEnable(GL_NORMALIZE); o di non farlo: (default) glDisable(GL_NORMALIZE); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Normali come attributi • Scorciatoia: – se invoco: glShadeModel(GL_FLAT); gli attributi non vongono interpolati ma rimangono costanti nella faccia (utile per le triangle strip e i triangle fan), finchè non rimetto glShadeModel(GL_SMOOTH); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria OpenGL: luci! • Ogni luce può essere "accesa" o "spenta" glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); ... • 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 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 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); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria OpenGL: luci! • Di ogni luce, possiamo anche settare: – se voglio effetto spotlight: default: glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v); glLightf (GL_LIGHT0,GL_SPOT_CUTOFF,v); glLightf (GL_LIGHT0,GL_SPOT_EXPONENT,v); (0,0,-1) 180 0.0 – se voglio attenuazione con la distanza: default: glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,a); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,b); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,c); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria 1 0 0 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! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria OpenGL: luci! • Di ogni luce, settiamo la posizione: glLightfv(GL_LIGHT0,GL_POSITION,v); • importante: la posizione delle luci subisce la moltiplicazione per la matrice MODEL_VIEW corrente per es: come faccio a fare la tipica headlight? Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Equazione di Lighting I luce ambient k materialeambient I tot I luce diffuse kmaterialediffuse ( Lˆ Nˆ ) n ˆ ˆ I luce spacular kmaterialespacular ( H N ) caratteristiche della luce caratteristiche del materiale dati della geometria f attenuazione luce f effettospotlight k materialeemission 1 f attentuazione luce min , 1 2 c1 c2 d L c3d L f effettospotlight f L, spot direction, spot cutoff Angle, spot beam width Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria OpenGL: materiali! • Settiamo tutti i parametri dei materiali: – i colori: glMaterialfv(face, glMaterialfv(face, glMaterialfv(face, glMaterialfv(face, GL_AMBIENT, colorvec); GL_EMISSION, colorvec); GL_DIFFUSE, colorvec); GL_SPECULAR, colorvec); – l'esponente speculare: glMaterialf (face, GL_SHININESS, intval); "GL_FRONT" scorciatoia: esiste anche GL_AMBIENT_AND_DIFFUSE asdasdsadasdasd che setta entrambi i colori allo stesso valore Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Il meccanismo "Color – Material" attivazione: glEnable(GL_COLOR_MATERIAL); uso: glColorMaterial(face, mode); es: se si mette glColorMaterial(GL_FRONT, GL_DIFFUSE); allora come colore diffuso del materiale si userà (l'altrimenti ingorato) colore corrente - si, proprio quello settato col vecchio glColor3f Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Non abbiamo ancora visto: illuminazione da due lati contemporaneamente attivazione: glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1); uso: glColorMaterial3f(GL_BACK, ... ); glColorMaterial3f(GL_FRONT, ... ); glColorMaterial3f(GL_FRONT_AND_BACK, ... ); Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria