Computer Graphics Marco Tarini Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Lezione 14: pillole di CG Alpha Blending Display Lists
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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)
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Semitrasparenze: come? x 0.5 x= x 0.75 x= x 0.25 x=
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Semitrasparenze: come? + x (1- ) x= + x(1- ) x= + x(1- ) x= vecchia: (già sul buffer) nuova: che sovrascrivo = 0.25 = 0.5 = 0.75 risultato = livello di trasparenza
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending Semitrasparenze Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per 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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending I colori hanno 4 componenti: –R,G,B, Quando arriva un frammento –(che sopravvive al depth test) invece di sovrascriverlo, uso la formula Frammenti & attributi interpolati Screen buffer computazioni per frammento "alpha blending"
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending Comodo avere una la trasparenza come un canale del colore! Ad esempio, posso giocare con lighting + alpha blending Frammenti & attributi interpolati Screen buffer computazioni per frammento –utile in molte situazioni, tipo: rendering di oggetti di vetro –come?
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending 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... Frammenti & attributi interpolati computazioni per frammento Screen buffer
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending Problema + grave: alpha blending e z-buffer bisticciano Per oggetti semi-trasparenti, l'ordine di rendering torna ad essere determinante (Perche?) Frammenti & attributi interpolati computazioni per frammento Screen buffer
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Screen buffer Alpha Blending Posso avere 4 componenti anche nello screen buffer –nel caso, posso usare l'alpha dello screen buffer invece-che / oltre-a quello del frammento Frammenti & attributi interpolati componenti R G B componente computazioni per frammento alpha dello screen buffer = alpha "di destinazione" alpha del frammento = alpha "sorgente"
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Alpha Blending con OpenGL Per prima cosa, attivare l'alpha blending: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) Determinare la funzione di blending: ad esempio significa:
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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,
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Infine: "alpha test" glAlphaFunc(GL_GREATER, 0.01) glEnable(GL_ALPHA_TEST); frammento passa il test se più opaco dell'1% frammenti più trasparenti dell'1% vengono scartati Solita musica: abilitare...
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Texture mapping e Alpha Test Trucco molto utile: –es: simboli e testo sulla scena... –es: sistemi di particelle con particelle grandi
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Texture mapping e Alpha Test Trucco molto utile: –es: erba...
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Texture mapping e Alpha Test Trucco molto utile: –es: drappi, barba... by Micheal Filipowski 2004 tessitura
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Texture mapping e Alpha Test Trucco molto utile: –es: alberi
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Texture mapping e Alpha Test Trucco molto utile: –es: pelliccia tessitura (ripetuta)
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
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)
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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);
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a 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
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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Colli di bottiglia... Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per 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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Puo' essere anche la comunicazione! Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per 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 ‧ / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a Vertex buffer objects Frammenti & attributi interpolati Vertici & loro attributi Screen buffer Vertici poriettati & attributi computati rasterizer triangoli set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice computazioni per frammento memoria per i Vertex Buffer Objects