Computer Graphics Lezione 15: nebbia nelle scene Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Marco Tarini Fog • Idea Base: – più un punto è lontano dall'occhio – più il suo colore è "nebbia" • Simula: – nebbia uniforme • (colore nebbia tipico = grigio-azzurro chiaro) • detto anche "partecipating media" – o anche (ma assai meno propriamente) effetto oscurità • (colore nebbia tipico = nero) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog: calcolo dell'opacità • Dato un punto a distanza z dall'occhio: – modo lineare: opacità finale della nebbia 0=niente nebbia 1=si vede solo nebbia end z fog end start fine zona nebbia inizio zona nebbia (costante) (costante) densità della nebbia (costante) density z – modo esponenziale: fog e – modo esponenziale al quadrato: fog e ( density z ) 2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog: applicazione • Dopo aver calcolato l'opacità, la applico colore finale fog colore nebbia (1 fog ) coloreoriginale_ frammento il colore della nebbia è un'altra costante a parole: "il colore finale e' una interpolazione fra il colore nebbia e il colore originale" (l'ennesima interpolazione) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog: dove la computo? soluzione 1 rasterizer punti setup rasterizer triangoli setup rasterizer segmenti computazioni per frammento setup Colore (con nebbia) interpolato Frammenti & attributi interpolati Il colore riflette anche la nebbia Vertici poriettati & attributi computati Vertici computazioni per vertice & loro attributi Computo la nebbia (a partire dalla zeta proiettata) Screen buffer y v1 v0 x v2 v1 v0 z v2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria setup rasterizer punti setup rasterizer triangoli setup rasterizer segmenti computazioni per frammento Vertici poriettati & attributi computati Vertici computazioni per vertice & loro attributi zeta proiettata (spazio occhio) Qui ho la zeta interpolata (quella che uso per lo zeta buffer) Frammenti & attributi interpolati Fog: dove la computo? soluzione 2 Qui ho la Calcolo la nebbia x ogni frammento Screen buffer y v1 v0 x v2 v1 v0 z v2 Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog: dove la computo • Due soluzioni: – per vertice – per frammento • Dipende dall'implementazione! – le specifiche di OpenGL non lo prescrivono Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog: in OpenGL • Come al solito: prima l'attivo glEnable(GL_FOG ); • poi, setto le costanti... glFogfv(GL_FOG_COLOR, float* ); glFogf(GL_FOG_DENSITY, float ); glFogf(GL_FOG_START, float ); glFogf(GL_FOG_END, float ); glFogi(GL_FOG_MODE, int ); GL_LINEAR GL_EXP o GL_EXP2 • e sono pronto (mando i triangoli) Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Fog spesso usato nei giochi per mascherare il popping dovuto al clipping contro il FAR PLANE Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria Utilizzi - come strumento per: – x incrementare la chiarezza delle immagini • capisco cosa e' piu' lontano senza: con: – x nascondere il popping dovuto a far plane clipping • gli oggetti compariranno con gradualita' • usare: colore nebbia == colore sfondo! Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria