420 likes | 510 Views
Lezione 11: lo Shading. Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 200 6 /0 7. Computer Graphics . Marco Tarini. I 4 fattori che consideriamo. luce finale = ambiente + riflessione diffusa +
E N D
Lezione 11: lo Shading Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Computer Graphics Marco Tarini
I4 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 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 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 v1 v2 v0 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 2. per ogni faccia, calcolo normale 3. applico lighting ad ogni normale "flat shading" 1. geometria di partenza 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 • Applico lighting a normale di faccia - (ottengo un colore) • 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 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 non sembra nemmeno una sfera • Approssimo superfici curve con triangoli • Applico il flat shading • Risultato: • spigoli apparenti su superfici curve 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 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: 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 >10.000 facce,e ancora si vedono gli spigoli artefatti • Più facce uso,meno evidenteil problema 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 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 uniformedifficilmente 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 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 coloredentro 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 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 "Gouraud" Shading Per applicare il lighting, devo avere la normale! Normale definita per una faccia. Ma per un vertice? • Utilizzare l'interpolazione del coloredentro alla faccia 1- Applico lighting ai 3 vertici di ogni triangolo • (ottengo un colore) 2- Interpolo il colore nel triangolo Henri Gouraud,1971 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 verticinasce 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ò... 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: v1 v1×v2 v2 Normale di un vertice condiviso da n triangoli: 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? set-up set-up rasterizer punti rasterizer segmenti v1 v0 v2 Frammenti & attributi interpolati Vertici poriettati & attributi computati Screen buffer Vertici & loro attributi set-up rasterizer triangoli computazioniper vertice computazioniper frammento y v1 v0 v2 x z 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" • propriocome 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 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 set-up set-up rasterizer segmenti rasterizer punti proietto e applico lighting compreso: colore per vertice (risultato del lighting) interpolo colore compreso:col. finale compreso: proprietà del materialee normale Frammenti & attributi interpolati Vertici poriettati & attributi computati Screen buffer Vertici & loro attributi set-up rasterizer triangoli computazioniper vertice computazioniper 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 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: 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 coloredopo il lighting.interpolo la normaleprima del lighting! • occhio:interpolando duevettori 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 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 "Phong" Shading * * Attenzione a non confondere il Phong Shading (uno shading) con il Phong Lighting Model (modello di illuminazione) • Invece di interpolare il coloredopo il lighting.interpolo la normaleprima del lighting! Bui-Tuong Phong,1973 1- Interpolo la normale nella faccia 2- Rinormalizzo 3- Applico 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 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 set-up set-up rasterizer segmenti rasterizer punti rinormalizzo e applicolighting per ottenereil coloredel frammento trasformo sia normale che posizione compreso: normale interpolata compreso: normaletrasformata interpolo normale compreso: proprietà del materialee normale Frammenti & attributi interpolati Vertici poriettati & attributi computati Screen buffer Vertici & loro attributi set-up rasterizer triangoli computazioniper vertice computazioniper 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 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 Flat shading Goraund shading 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 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) 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 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 prescrivonoquale 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) 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 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 la quarta coordinata e' sottointesa: ZERO! (si tratta di vettori) • Setto la "normale corrente".Proprio come facevo con i colori: glNormal3d(x,y,z); 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
risposta: subiscono la Model-View matrix, • ma non la Projection matrix.E' proprio per questo che le due sono tenute separate! Cosa succede alle normali? v1 v0 v2 • Modellazione + Vista: • spesso rototraslazioni (trasformazioni rigide) • e scalature uniformi • (che almeno mantengono • gli angoli) • Proiezione: • non mantiene gli angoli y v0 v1 x v2 z object Coordinates screen Space modellazione viewport y 1 y y v1 v1 -1 v1 v0 v0 x v2 proiezione v1 v2 vista -z -z v0 v2 v0 x z x 1 v2 -1 view Coordinates (a.k.a. eye Coordinates) Normalized Device Coordinates world Coordinates 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) 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); 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 flat shading ! Gouraud shading (o forse* Phong) * dipende dall'impl. di OpenGL • 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); 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); • gli attributi non vongono interpolatima 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 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 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_LIGHTkvale GL_LIGHT0+k. Utile per i for • di default, la luce 0 è l'unica accesa glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); ... 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! glLightfv(GL_LIGHT0, GL_DIFFUSE, v); glLightfv(GL_LIGHT0, GL_AMBIENT, v); glLightfv(GL_LIGHT0, GL_SPECULAR, v); • Di ogni luce, settiamo i colori 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: default: (0,0,-1) 180 0.0 glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,v); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,v); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,v); • 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); 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 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! 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 moltiplicazioneper la matrice MODEL_VIEW corrente glLightfv(GL_LIGHT0,GL_POSITION,v); 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 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 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! glMaterialfv(face, GL_AMBIENT, colorvec); glMaterialfv(face, GL_EMISSION, colorvec); glMaterialfv(face, GL_DIFFUSE, colorvec); glMaterialfv(face, GL_SPECULAR, colorvec); • l'esponente speculare: scorciatoia: esiste anche asdasdsadasdasd che setta entrambi i colori allo stesso valore glMaterialf(face, GL_SHININESS, intval); GL_AMBIENT_AND_DIFFUSE "GL_FRONT" • Settiamo tutti i parametri dei materiali: • i colori: 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" 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 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 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 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a