Sistemi Multimediali II Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Lezione 7: rasterizzazione la fabbrica dei frammenti
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 2/40 Rasterizziamo! frammenti (candidati pixels) Vertici (punti in R 3 ) pixel finali (nello screen-buffer) Vertici proiettati (punti in R 2 ) Z rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice rasterizer triangoli rasterizer segmenti rasterizer punti rasterizer triangoli rasterizer punti
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 3/40 Rasterizzazione Segmenti Produrre i frammenti il più vicino possibile alla linea ideale v0v0 v1v1 lavoriamo con coord intere. Arrotondarle prima. Attenzione agli estremi! Pensare al Line LOOP
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 4/40 Rasterizzazione di segmenti Vogliamo avere la sequenza di frammenti che –approssimi al meglio il segmento e quindi –sia il più in linea retta possibile
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 5/40 Rasterizzazione di segmenti coefficienti angolari m 1 1 frammento per colonna dx=9 dy=7 Considerando approx di segmenti di circa un pixel di spessore
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 6/40 Rasterizzazione di segmenti dx=3 dy=10 coefficienti angolari m >1 1 frammento per riga Consideriamo i due casi separatemente. Ne vediamo uno. (l'altro è simile)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 7/40 Scrivo la retta come: Rasterizzazione di segmenti: algoritmo analitico dx=9 dy=7 m=dy/dx=7/9
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 8/40 Rasterizziamo da (x 0,y 0 ) a (x 1,y 1 ) Rasterizzazione di segmenti: algoritmo analitico P0P0 P1P1
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 9/40 Algoritmo analitico Per x che va da x 0 a x 1 x ++ y mx + B arrotondare y produrre frammento ( x, y )
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 10/40 Algoritmo analitico seleziona sempre il frammento più vicino alla linea ideale per trovarlo si devono fare: –unaddizione (un +1 intero) –una moltiplicazione (float) –un arrotondamento (da float a int)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 11/40 Prima ottimizzazione: algoritmo DDA DDA = Digital Differential Analyzer Elimina la moltiplicazione Tecnica incrementale –calcola la nuova y in base alla precedente
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 12/40 Prima ottimizzazione: algoritmo DDA Banalmente:
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 13/40 Prima ottimizzazione: algoritmo DDA per x che va da x 0 a x 1 x ++ y mx + B arrotondare y produrre frammento ( x, y ) y y 0 per x che va da x 0 a x 1 x ++ y +=m arrotondare y produrre frammento ( x, y ) algo analiticoalgo DDA operazioni float
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 14/40 Algoritmo di Bresenham Idea: usare solo interi Dato l'ultimo punto, quali scelte per il prossimo? (con 0 < m < 1)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 15/40 Algoritmo di Bresenham 0m<1 otto casi!
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 16/40 Algoritmo di Bresenham Due sole! –o Est –o Nord-Est
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 17/40 Algoritmo di Bresenham Q intersezione linea con la prossima colonna
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 18/40 Algoritmo di Bresenham Q intersezione linea con la prossima colonna M il punto di mezzo del segmento E-NE Basta vedere da che parte sta M
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 19/40 Algoritmo di Bresenham Conviene passare alla forma implicita dellequazione della retta:
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 20/40 Algoritmo di Bresenham La funzione F: –vale 0 per tutti i punti della retta –assume valori positivi sotto la retta –assume valori negativi sopra la retta
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 21/40 Algoritmo di Bresenham Per scegliere fra NE e E, basta vedere il segno di
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 22/40 Algoritmo di Bresenham variabile di decisione d d = F(M), Quindi
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 23/40 Algoritmo di Bresenham d 0 M sta sopra la retta Scegliamo E
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 24/40 Algoritmo di Bresenham d 0 M sta sotto la retta Scegliamo NE
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 25/40 Algoritmo di Bresenham d 0 M sta sulla retta (Q M) Scegliamo uno qualsiasi dei due
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 26/40 Algoritmo di Bresenham Idea finale! Anche d può essere calcolato incrementalmente! –(come la y nell'algoritmo incrementale) ?
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 27/40 Se ho scelto E Algoritmo di Bresenham Torna:
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 28/40 Algoritmo di Bresenham Se ho scelto NE Torna:
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 29/40 Algoritmo di Bresenham Ok, d viene incrementato di una costante (diversa a seconda se E o NE) E il valore iniziale? (x 0, y 0 ) appartiene alla retta e F(x 0, y 0 ) 0
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 30/40 Algoritmo di Bresenham MidpointLine(int x0, int y0, int x1, int y1) { int dx, dy, incrE, incrNE, d, x, y; while (x < x1 ) { if ( d <= 0 ) { d = d+incrE; x++; } else { d = d+incrNE; x++; y++; } SparaFrammento(x, y); } Variabili intere Scelta di E Inizializzazione dy = y1-y0; dx = x1-x0; d = 2*dy-dx; incrE = 2*dy; incrNE = 2*(dy-dx); x = x0; y = y0; Scelta di NE Moltiplico per 2 per avere solo interi
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 31/40 Rasterizziamo! frammenti (candidati pixels) Vertici (punti in R 3 ) pixel finali (nello screen-buffer) Vertici proiettati (punti in R 2 ) Z rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice inizzializzazione ciclo (parallelizzato)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 32/40 Segmenti di Spessore diverso da uno es: spessore 3
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 33/40 Segmenti di Spessore diverso da uno Chiaramente è solo una approssimazione
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 34/40 Segmenti di Spessore diverso da uno void glLineWidth( width ); Non necessariamente un intero (se si usa anti-aliasing, vedi poi) In OpenGL
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 35/40 Rasterizziamo! frammenti (candidati pixels) Vertici (punti in R 3 ) pixel finali (nello screen-buffer) Vertici proiettati (punti in R 2 ) Z rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 36/40 Rasterizziamo triangoli Algoritmo scan-line Idea Base: 1.ordiniamo per y 2.per ogni righa da y min a y max 1.trova primo framm dentro 2.trova primo framm fuori 3.produci frammenti da da A incluso a B escluso
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 37/40 Rasterizziamo triangoli Algoritmo scan-line Idea Base: 1.ordiniamo per y 2.per ogni righa da y min a y max 1.trova primo framm dentro 2.trova primo framm fuori 3.produci frammenti da primo dentro a primo fuori (escluso)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 38/40 Bresenham In ogni riga: –trovare il primo-dentro e primo-fuori è simile a Bresenham, ma: un caso solo (sempre per riga, sempre verso l'alto) arrotondiamo sempre per eccesso passiamo all'altro segmento quando siamo arrivati alla riga del punto in mezzo
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 39/40 "Scan-Conversion" = Rasterization (Rasterizzazione) "to scan-conver" = to Rasterize "Span" = intervallo da primo-dentro a primo-fuori "Line-scan" = una riga processata "Active edges" = i 2 lati attuali "Edge tables" = i 3 lati (precalcolati) Terminologie circa la rasterizzazione triangoli 3 2 Nel nostro caso (triangoli)! In generale, N e N (poligoni generici)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 40/40 Problemi con rasterizzazione di poligoni usando scan-line I frammenti vengono prodotti uno alla volta Non adatto ad una implementazione parallela –il rasterizzatore deve produrre frammenti molto velocemente (cioè molti alla volta) se non vogliamo tenere disoccupato il processore di frammenti
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 41/40 Soluzione Produrre frammenti a gruppi –ad es, a gruppi di 2x2 o 4x4 o 4x1 o 8x1... Non necessariamente tutti i componenti di un gruppo sono frammenti interni al triangolo Testare ogni frammento: –scartare quelli interni
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 42/40 Test di appartenenza ad un triangolo Test di appartenenza ad un semipiano: SI NO p n x con TEST: retta definita da punto appartenente p e vettore ortognoale n
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 43/40 SI NO Test di appartenenza ad un triangolo Il semipiano e' definito da un lato: v 0 =(x 0, y 0 ) n v 1= (x 1, y 1 ) q funzione detta EDGE FUNCTION ("Edge" = "Lato") n = ( - ( y 1 -y 0 ), x 1 -x 0 ) p = (y 0, x 0 ) f(q) = nq - np
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 44/40 Test di appartenenza ad un triangolo Triangolo=interesezione di 3 semipiani v0v0 v2v2 v1v1 SI NO SI NO SI NO SI NO SI NO SI NO SI
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 45/40 Test di appartenenza ad un triangolo Triangolo=interesezione di 3 semipiani NO v0v0 SI NO SI NO v1v1 v2v2 SI NO SI NO SI NO SI Triangoli front-facing (senso anti-orario)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 46/40 Test di appartenenza ad un triangolo Scambio v 1 con v 2 v2v2 v1v1 v0v0 Triangoli BACK-facing (senso anti-orario) SI NO SI NO SI NO SI NO SI NO SI NO
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 47/40 Test di appartenenza ad un triangolo Tre Edge Functions: (una per lato) Tutte SI (negative) : –frammento interno a triangolo front-facing Tutte NO (positive): –frammento interno a triangolo back-facing Miste: –frammento esterno (scartare sempre)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 48/40 Esempio, basandosi sul bounding box 1.Trovo il bounding box del triangolo Come si trova il bounding box di un triangolo?
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 49/40 Esempio, basandosi sul bounding box 1.Trovo il bounding box del triangolo
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 50/40 Esempio, basandosi sul bounding box 1.Trovo il bounding box del triangolo 2.Processo ogni blocco (es. 2x2) 1.Testo ogni frammento nel blocco 2.Se interno al triangolo lo mando giù nel pipemlie
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 51/40 Rasterizziamo! frammenti (candidati pixels) Vertici (punti in R 3 ) pixel finali (nello screen-buffer) Vertici proiettati (punti in R 2 ) Z rasterizer triangoli computazioni per frammento set- up rasterizer segmenti set- up rasterizer punti set- up computazioni per vertice SETUP: trovo bounding box testo gruppi di frammenti (parallelizzato)
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 52/40 Clipping Clipping! Tutto fuori: CULLED ! no prob. Screen Tutto dentro: Rasterizzo ! (benissimo) Qualche vertice fuori, ma non tutto il triangolo Clipping. HAI!
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 53/40 Clipping: la vecchia scuola Clipping! Screen 1. Trovo intersezioni 2. Unisco intersezioni A B 3. Divido poligono in triangoli 4. Rasterizzo ogni triangolo A poi B
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 54/40 Clipping: la vecchia scuola Clipping! Screen 1. Trovo intersezioni 2. Unisco intersezioni 3. Divido poligono in triangoli 4. Rasterizzo ogni triangolo B C A
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 55/40 Clipping: la vecchia scuola Clipping! Screen 2. Unisco intersezioni 3. Divido poligono in triangoli 4. Rasterizzo ogni triangolo B C A D 1. Trovo intersezioni Caso pessimo molto complicato Malissimo per implementazione HW L'HW deve prevedere il caso pessimo, anche se è raro
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 56/40 Clipping: come si fa ora Clipping! Screen 1. Trovo bounding box 3. Rasterizzo nel bounding box come normale Come si interseca un bounding box con lo schermo? 2. Interseco bounding box con schermo
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 57/40 Un momento! E il clipping contro il far e il near plane? –detti anche "far plane clipping" e "near plane clipping" left plane near plane bottom plane view frustum top plane far plane right plane
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 58/40 Rasterizzazione triangoli: Il metodo basato su bounding box e test di appartenenza (edge functions): –Vantaggi fortemente parallelizzabile –(gruppi 4x4) clipping diventa facile facile –per i planes UP, DOWN, LEFT e RIGHT –Svantaggi Overhead granding –Si testano molti frammenti inutilmente –Specialmente quando...
M a r c o T a r i n i S i s t e m i M u l t i m e d i a l i I I / 0 5 U n i v e r s i t à d e l l I n s u b r i a - 59/40 Un caso sfortunato Screen Triangoli: lunghi e stretti messi lungo la direzione diagonale Sinonimo di MALE in computer graphics : (anche per questo, ma non solo) lunghi e stretti = male molti algoritmi portano ad artefatti (come vedremo) circa equilateri = bene robusti con praticamente tutti gli algoritmi