Computer Graphics Lezione 15: nebbia nelle scene Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 Marco Tarini Fog • Idea Base: – più un punto è lontano dall'occhio – più lo disegno color – nebbia • Simula: – una nebbia uniforme • (il color nebbia è tipicamente un grigio azzurro chiaro) – o anche, effetto oscurità • (se il color nebbia è nero) 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 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 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 Fog: applicazione • Dopo aver calcolato l'opacità, la applico colore finale fog colore nebbia (1 fog ) coloreoriginale 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) 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 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 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 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 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 Fog: dove la computo • Due soluzioni: – per vertice – per frammento • Dipende dall'implementazione! – le specifiche di OpenGL non lo prescrivono 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 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) 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 Fog spesso usato nei giochi per mascherare il popping dovuto al clipping contro il FAR PLANE 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