Computer Graphics
Lezione 14:
Università dell’Insubria
Facoltà di Scienze MFN di Varese
Corso di Laurea in Informatica
Anno Accademico 2006/07
Marco Tarini
pillole di CG
Semitrasparenze: come?
• Un vecchio trucco di imaging 2D:
• Quando scrivo un colore nello screen buffer,
invece di:
– sovrascrivere il colore vecchio con quello nuovo
eseguo:
– mischio il colore vecchio con quello nuovo
– (sovrascrivo il col. vecchio
con una interpolazione fra: col vecchio e col nuovo)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Semitrasparenze: come?
0.75 x
+ 0.25 x
=
0.5 x
+ 0.5 x
=
0.25 x
+ 0.75 x
=
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria

= livello
di
trasparenza
Semitrasparenze: come?
nuova:
che sovrascrivo
vecchia:
(già sul buffer)
risultato
(1-) x
+x
=
 = 0.25
(1-) x
+x
=
 = 0.5
(1-) x
+x
=
 = 0.75
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Alpha Blending
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
• Semitrasparenze
Screen
buffer
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
computazioni
per frammento
Frammenti
& attributi
interpolati
Alpha Blending
Screen
buffer
• I colori hanno 4 componenti:
– R,G,B, 
• Quando
arriva un frammento
– (che sopravvive al depth test)
invece di sovrascriverlo,
uso la formula
(r , g , b) finale  (r , g , b) vecchio  (1   )  (r , g , b) nuovo  ( )
"alpha blending"
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
computazioni
per frammento
Frammenti
& attributi
interpolati
Alpha Blending
Screen
buffer
• Comodo avere una la
trasparenza come un canale
del colore!
• Ad esempio, posso giocare
con
lighting + alpha blending
– utile in molte situazioni, tipo:
rendering di oggetti di vetro
– come?
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
computazioni
per frammento
Frammenti
& attributi
interpolati
Alpha Blending
Screen
buffer
• Nota:
l'alpha blending
e' una operazione di
read-write
su memoria condivisa
(come il depth test)
• cautela da parte di chi la
implementa in HW...
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
computazioni
per frammento
Frammenti
& attributi
interpolati
Alpha Blending
Screen
buffer
• Problema + grave:
alpha blending
e
z-buffer bisticciano
• Per oggetti semi-trasparenti,
l'ordine di rendering torna ad
essere determinante
• (Perche?)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
computazioni
per frammento
Frammenti
& attributi
interpolati
Alpha Blending
componenti
RGB
Screen
buffer
componente

• Posso avere 4 componenti
anche nello screen buffer
– nel caso, posso usare l'alpha
dello screen buffer
invece-che / oltre-a
quello del frammento
alpha dello screen buffer
=
alpha "di destinazione"
alpha del frammento
=
alpha "sorgente"
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Alpha Blending con OpenGL
• Per prima cosa, attivare l'alpha blending:
glEnable(GL_BLEND);
• Determinare la funzione di blending:
• ad esempio
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
significa:
(r , g , b) finale  (r , g , b) nuovo  ( )  (r , g , b) vecchio  (1   )
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Alpha Blending con OpenGL
• Ma ci sono molte altre compinazioni possibili!
glBlendFunc( source_factor , dest_factor )
GL_ZERO, GL_ONE,
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR,
GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA
GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR,
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Infine: "alpha test"
• Se un frammento é troppo trasparente,
scartiamolo:
if ( frammento.alpha < k)
then scarta frammento
• Nota:
– E' un test facile facile
– Non e' read-write in memoria condivisa
– Può essere fatto immediatamente!
– Test molto efficiente
– Se scarta, non si aggiorna il depth buffer
– Indipendente dall'ordine delle primitive
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Infine: "alpha test"
Solita musica: abilitare...
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER , 0.01)
frammento passa il test se più opaco dell'1%
frammenti più trasparenti dell'1%
vengono scartati
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• In una tessitura,
ogni texel può avere
anche (o, solo)
una componente alpha
– "opacity maps", "alpha maps"
"RGBA maps"
• Un canale alpha può
essere composto di soli
– 1 completamente opaco
– 0 completamente trasparente
• frammenti corrispondenti cassati dall'alpha-test 
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• Trucco molto utile:
– es: simboli e testo sulla scena...
– es: sistemi di particelle
con particelle grandi
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• Trucco molto utile:
– es: erba...
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• Trucco molto utile:
– es: drappi, barba...
tessitura
by Micheal
Filipowski
2004
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• Trucco molto utile:
– es: alberi
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Texture mapping e Alpha Test
• Trucco molto utile:
– es: pelliccia
tessitura
(ripetuta)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Display Lists
• Codice (es. in C++) che fa rendering:
mix di
– istruzioni openGL che mandano primitive
– comandi vari
• (cicli, guardie...)
• Idea:
– la prima volta,
registrare tutte le primitive e i comandi
in una struttura (in RAM);
le volte successive mandare solo le primitive
(senza comandi intermedi)
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Display Lists
• Esempio di codice
theTorus = glGenLists (1);
glNewList(theTorus, GL_COMPILE);
... /* tutto il rendering
dell oggetto "Torus" */
glEndList();
/* quando la voglio richiamare: */
glCallList(theTorus);
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Display List
• Difetti Display List:
– sono statiche
– consumo di memoria.
– Non risparmiano il costo di mandare le primitive alla
scheda video
• Pregi
– danno la possibilita’ ad opengl di convertire tutti i
dati nel formato piu’ conveniente
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
Colli di bottiglia...
Screen
buffer
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
Puo' essere anche la comunicazione!
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Scree
buffe
rasterizer
punti
setup
rasterizer
triangoli
setup
rasterizer
segmenti
computazioni
per frammento
setup
Frammenti
& attributi
interpolati
Vertici poriettati
& attributi
computati
computazioni
per vertice
Vertici
& loro attributi
Vertex buffer objects
memoria per i
Vertex Buffer
Objects
Marco Tarini ‧ Computer Graphics ‧ 2006/07 ‧ Università dell’Insubria
Scree
buffe
Scarica

ppt