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