Computer Graphics Marco Tarini Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 Lezione 12: 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 2/40 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 colore vecchio con una interpolazione fra quello vecchio e quello 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 3/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 4/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 5/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 6/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 7/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 8/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 9/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 10/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 11/40 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 proprio:
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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 12/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 13/40 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
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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 14/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 15/40
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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 16/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 17/40 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 18/40 Display Lists 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 le DISPLAY LIST
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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 19/40 Display Lists Esempio di codice theTorus = glGenLists (1); glNewList(theTorus, GL_COMPILE);... /* tutto il rendering dell oggetto */ 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 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 20/40 Display List Difetti Display List: –sono statiche –gli oggetti vengono tenuti in memoria due volte. –Se non entrano nella memoria della scheda video possono non essere molto efficienti Pregi –danno la possibilita’ ad opengl di convertire tutti i dati nel formato piu’ conveniente