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