Computer Graphics Lezione 11: Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 Marco Tarini lo Shading I 4 fattori che consideriamo luce finale = ambiente + riflessione diffusa + riflessione speculare + emissione 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 2/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 3/40 Normale di un triangolo • Cioe' il suo orientamento nello spazio v1 ^ N v0 N (v1 v0 ) (v2 v0 ) v2 N ˆ N |N| 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 4/40 Lighting faccia per faccia "flat shading" 1. geometria di partenza 2. per ogni faccia, calcolo normale 3. applico lighting ad ogni normale 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 5/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 6/40 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 ! 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 7/40 Flat shading: problema • Altro esempio: 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 8/40 Flat shading: problema • Più faccie uso, meno evidente il problema >10.000 faccie, e ancora si vedono gli spigoli artefatti perche? 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 9/40 Flat shading: problema • A peggiorare le cose: l'effetto ottico Mach-band Il contrasto fra zone di colore uniforme non 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. 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 10/40 Idea • Utilizzare l'interpolazione del colore dentro alla faccia 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 11/40 Idea • Utilizzare l'interpolazione del colore dentro alla faccia "Gouraud" Shading by 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? 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 12/40 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 • quando si costruisce una superficie triangolata campionando una superficie parametrica • ... • Sennò... 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 13/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 14/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 15/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 16/40 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) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 17/40 Gouraud shading • Risultati: 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 18/40 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) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 19/40 Si può fare meglio • Invece di interpolare il colore dopo il lighting. interpolo la normale prima del lighting! "Phong" * Shading by 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) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 20/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 21/40 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 Marco T a r i nshading i ‧ C o m p u t e r G r a p h i cGoraund s ‧ 2 0 0 5 /shading 0 6 ‧ U n i v e r s i t à d e l l Phong ’ I n s u b rShading i a - 22/40 sia per il Gouraud che per il Phong shading flat shading Marco Tarini ‧ Computer Graphics ‧ 2005/06 ‧ Goraud shading è simile) U n i v e r s i t à (Phong d e l l ’ I n sshading u b r i a - 23/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 24/40 Gouraud o Phong shading? • le specifiche di OpenGL non prescrivono quale debba essere usato – di solito (per ora) Gouraud • dipende dall'implementatore HW – non esitono nemmeno comandi OpenGL che cambiano shading da Phong a Gouraud 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 25/40 Passiamo a OpenGL • 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 26/40 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) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 27/40 Cosa succede alle normali? Modellazione + Vista: trasformazioni rigide (o 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 Proiezione: non mantiene gli angoli object Coordinates v1 v0 v2 screen Space modellazione 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 e r (a.k.a. G r a p eye h i c Coordinates) s ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I nCoordinates s u b r i a - 28/40 world Coordinates Le normali rimangono normali nella Transform? • Solo se la modellazione-vista è rigida modellazione-vista = V ‧ M rotazioni, traslazioni (quindi sempre rigida) rotazioni, traslazioni e forse scalature (quindi non sempre rigida) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 29/40 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); 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 30/40 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) 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 31/40 Normali come attributi • Scorciatoia: – se setto: 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); 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 32/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 33/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 34/40 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); 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 35/40 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: glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,a); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,b); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,c); default: 1 0 0 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 36/40 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! 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 37/40 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 per es: come faccio a fare la tipica headlight? 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 38/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 39/40 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 40/40 Non abbiamo ancora visto: 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 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 41/40 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, ... ); 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 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 42/40