Computer Graphics Lezione 7: rasterizzazione la fabbrica dei frammenti Università dell’Insubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 Marco Tarini setup rasterizer triangoli setup rasterizer segmenti Marco Tarini ‧ Computer Graphics computazioni per frammento rasterizer punti frammenti (punti in R2) setup (candidati pixels) Z Vertici proiettati computazioni per vertice Vertici (punti in R3) Rasterizziamo! pixel finali (nello screen-buffer) ‧ 2 0 0 5 / 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 Rasterizzazione Segmenti v1 v0 Marco Tarini ‧ Computer Graphics • Produrre i frammenti il più vicino possibile alla linea ideale lavoriamo con coord intere. Arrotondarle prima. Attenzione agli estremi! Pensare al Line LOOP ‧ 2 0 0 5 / 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 Rasterizzazione di segmenti • Vogliamo avere la sequenza di frammenti che – approssimi al meglio il segmento • e quindi – sia il più in linea retta possibile Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Rasterizzazione di segmenti coefficienti angolari m1 → dy=7 1 frammento per colonna dx=9 Marco Tarini ‧ Computer Graphics Considerando approx di segmenti di circa un pixel di spessore ‧ 2 0 0 5 / 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 Rasterizzazione di segmenti coefficienti angolari m>1 → dy=10 1 frammento per riga dx=3 Marco Tarini ‧ Computer Graphics Consideriamo i due casi separatemente. Ne vediamo uno. (l'altro è simile) ‧ 2 0 0 5 / 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 Rasterizzazione di segmenti: algoritmo analitico Scrivo la retta come: dy=7 m=dy/dx=7/9 y mx B ( m 1) dx=9 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Rasterizzazione di segmenti: algoritmo analitico Rasterizziamo da (x0,y0) a (x1,y1) P1 P0 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo analitico Per x che va da x0 a x1 Marco Tarini ‧ Computer Graphics • • x ++ y ← mx + B • • arrotondare y produrre frammento ( x , y ) ‧ 2 0 0 5 / 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 Algoritmo analitico • seleziona sempre il frammento più vicino alla linea ideale • per trovarlo si devono fare: – un’addizione (un +1 intero) – una moltiplicazione (float) – un arrotondamento (da float a int) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Prima ottimizzazione: algoritmo DDA • DDA = Digital Differential Analyzer • Elimina la moltiplicazione • Tecnica incrementale – calcola la nuova y in base alla precedente Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Prima ottimizzazione: algoritmo DDA • Banalmente: yi 1 mxi 1 B yi 1 m( xi x) B yi 1 yi mx yi 1 yi m Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Prima ottimizzazione: algoritmo DDA y ← y0 per x che va da x0 a x1 per x che va da x0 a x1 • • x ++ y ← mx + B • • arrotondare y produrre frammento ( x , y ) algo analitico Marco Tarini ‧ Computer Graphics • • • • x ++ y +=m operazioni float arrotondare y produrre frammento ( x , y ) algo DDA ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • Idea: usare solo interi • Dato l'ultimo punto, quali scelte per il prossimo? P=(xi,yi) Ultimo frammento prodotto Marco Tarini ‧ Computer Graphics • (con 0 < m < 1) ‧ 2 0 0 5 / 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 Algoritmo di Bresenham 0≤m<1 x my B x my B y mx B y mx B otto casi! y mx B y mx B x my B x my B Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • Due sole! – o Est – o Nord-Est NE E P=(xi,yi) Ultimo frammento Scelte per il prossimo corrente Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • Q intersezione linea con la prossima colonna NE Q E P=(xp,yp) Ultimo pixel Scelte per il selezionato pixel corrente Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham NE Q • Q intersezione linea con la prossima colonna • M il punto di mezzo del segmento E-NE • Basta vedere da che parte sta M M E P=(xp,yp) Ultimo pixel Scelte per il selezionato pixel corrente Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • Conviene passare alla forma implicita dell’equazione della retta: F( x, y ) ax by c 0 a dy; b dx; c B dx Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • La funzione F: NE Q – vale 0 per tutti i punti della retta – assume valori positivi sotto la retta – assume valori negativi sopra la retta M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 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 Algoritmo di Bresenham • Per scegliere fra NE e E, basta vedere il segno di F(M) F( x p 1, y p 12 ) NE Q M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • variabile di decisione d • d = F(M), • Quindi d a ( x p 1) b( y p 12 ) c NE Q M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • d0 • M sta sopra la retta • Scegliamo E NE Q M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • d0 • M sta sotto la retta • Scegliamo NE NE Q M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • d0 • M sta sulla retta (QM) • Scegliamo uno qualsiasi dei due NE Q M E Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • Idea finale! • Anche d può essere calcolato incrementalmente! MNE NE M ? – (come la y nell'algoritmo incrementale) ME E P=(xp,yp) Ultimo pixel Scelte per il Scelte per il selezionato pixel corrente prossimo pixel Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • Se ho scelto E d old F ( M ) d new F ( M E ) MNE NE M Q ME E • Torna: d new d old a P=(xp,yp) Ultimo pixel Scelte per il Scelte per il selezionato pixel corrente prossimo pixel Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 27/40 Algoritmo di Bresenham • Se ho scelto NE d old F ( M ) d new F ( M NE ) MNE NE Q M ME E • Torna: d new d old a b P=(xp,yp) Ultimo pixel Scelte per il Scelte per il selezionato pixel corrente prossimo pixel Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • Ok, d viene incrementato di una costante • (diversa a seconda se E o NE) • E il valore iniziale? d start b F( x0 1, y0 ) F( x0 , y0 ) a 2 1 2 • (x0, y0) appartiene alla retta e F(x0, y0) 0 d start b dx a dy 2 2 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 MidpointLine(int x0, int y0, int x1, int y1) { int dx, dy, incrE, incrNE, d, x, y; Variabili intere while (x < x1 ) { if ( d <= 0 ) { d = d+incrE; x++; } else { d = d+incrNE; x++; y++; } SparaFrammento(x, y); } Scelta di E Scelta di NE Inizializzazione dy = y1-y0; dx = x1-x0; d = 2*dy-dx; incrE = 2*dy; incrNE = 2*(dy-dx); x = x0; y = y0; Moltiplico per 2 per avere solo interi } Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 30/40 setup rasterizer triangoli setup rasterizer segmenti inizzializzazione Marco Tarini ‧ Computer Graphics computazioni per frammento rasterizer punti frammenti (punti in R2) setup (candidati pixels) Z Vertici proiettati computazioni per vertice Vertici (punti in R3) Rasterizziamo! pixel finali (nello screen-buffer) ciclo (parallelizzato) ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 31/40 Segmenti di Spessore diverso da uno es: spessore 3 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 Chiaramente è solo una approssimazione Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 • In OpenGL void glLineWidth( width ); Non necessariamente un intero (se si usa anti-aliasing, vedi poi) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 34/40 setup rasterizer triangoli setup rasterizer segmenti Marco Tarini ‧ Computer Graphics computazioni per frammento rasterizer punti frammenti (punti in R2) setup (candidati pixels) Z Vertici proiettati computazioni per vertice Vertici (punti in R3) Rasterizziamo! pixel finali (nello screen-buffer) ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 35/40 Rasterizziamo triangoli Algoritmo scan-line Idea Base: 1. ordiniamo per y 2. per ogni righa da ymin a ymax 1. trova primo framm dentro 2. trova primo framm fuori 3. produci frammenti da da A incluso a B escluso Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ 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 ymin a ymax 1. trova primo framm dentro 2. trova primo framm fuori 3. produci frammenti da primo dentro a primo fuori (escluso) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 37/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 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 38/40 Terminologie circa la rasterizzazione triangoli • "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 22 lati attuali "Edge tables" = i 3 lati (precalcolati) Nel nostro caso (triangoli)! In generale, N e N (poligoni generici) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 39/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 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 40/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 Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 41/40 Test di appartenenza ad un triangolo • Test di appartenenza ad un semipiano: SI n NO p x retta definita da punto appartenente p e vettore ortognoale n TEST: ( x p) n 0 xn k con Marco Tarini ‧ Computer Graphics k pn ‧ 2 0 0 5 / 0 6 ‧ 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 • Il semipiano e' definito da un lato: n NO v0=(x0, y0 ) SI v1=(x1, y1 ) q p = (y0 , x0) n = ( - ( y1 -y0 ) , x1 -x0) f(q) = n‧q - n‧p funzione detta EDGE FUNCTION ("Edge" = "Lato") Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 43/40 Test di appartenenza ad un triangolo • Triangolo=interesezione di 3 semipiani NO SI NO SI NO NO SI SI NO v0 NO SI SI Marco Tarini ‧ Computer Graphics v2 SI SI SI v1 SI NO SI NO NO SI ‧ 2 0 0 5 / 0 6 ‧ 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 • Triangoli front-facing (senso anti-orario) NO SI NO SI NO NO SI SI NO v0 NO SI SI Marco Tarini ‧ Computer Graphics v2 SI SI SI v1 SI NO SI NO NO SI ‧ 2 0 0 5 / 0 6 ‧ 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 • Scambio v1 con v2 • Triangoli BACK-facing (senso anti-orario) SI NO SI NO SI SI NO NO SI v2 SI NO NO Marco Tarini ‧ Computer Graphics v0 NO NO NO v1 NO SI NO SI SI NO ‧ 2 0 0 5 / 0 6 ‧ 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 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) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 47/40 Esempio, basandosi sul bounding box Come si trova il bounding box di un triangolo? 1. Marco Tarini ‧ Computer Graphics Trovo il bounding box del triangolo ‧ 2 0 0 5 / 0 6 ‧ 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. Marco Tarini ‧ Computer Graphics Trovo il bounding box del triangolo ‧ 2 0 0 5 / 0 6 ‧ 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. 2. Marco Tarini ‧ Computer Graphics Trovo il bounding box del triangolo Processo ogni blocco (es. 2x2) 1. Testo ogni frammento nel blocco 2. Se interno al triangolo lo mando giù nel pipemlie ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 50/40 setup rasterizer triangoli setup rasterizer segmenti SETUP: trovo bounding box Marco Tarini ‧ Computer Graphics computazioni per frammento rasterizer punti frammenti (punti in R2) setup (candidati pixels) Z Vertici proiettati computazioni per vertice Vertici (punti in R3) Rasterizziamo! pixel finali (nello screen-buffer) testo gruppi di frammenti (parallelizzato) ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 51/40 Clipping • Clipping! Screen Qualche vertice fuori, ma non tutto il triangolo Clipping. Tutto dentro: Rasterizzo ! HAI! Tutto fuori: CULLED ! no prob. (benissimo) Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 52/40 Clipping: la vecchia scuola • Clipping! Screen A B 1. 2. 3. 4. Marco Tarini ‧ Computer Graphics Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo A poi B ‧ 2 0 0 5 / 0 6 ‧ 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 A B C 1. 2. 3. 4. Marco Tarini ‧ Computer Graphics Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo ‧ 2 0 0 5 / 0 6 ‧ 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 Caso pessimo molto complicato • Clipping! Malissimo per implementazione HW L'HW deve prevedere il caso pessimo, anche se è raro Screen D B C A Marco Tarini ‧ Computer Graphics 1. 2. 3. 4. Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 55/40 Clipping: come si fa ora • Clipping! Come si interseca un bounding box con lo schermo? Screen 1. Trovo bounding box 2. Interseco bounding box con schermo 3. Rasterizzo nel bounding box come normale Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 56/40 Un momento! • E il clipping contro il far e il near plane? – detti anche "far plane clipping" e "near plane clipping" view frustum top plane left plane near plane right plane far plane bottom plane Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 57/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... Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 58/40 Un caso sfortunato Sinonimo di MALE in computer graphics: (anche per questo, ma non solo) lunghi e stretti = male Screen molti algoritmi portano ad artefatti (come vedremo) circa equilateri = bene robusti con praticamente tutti gli algoritmi Triangoli: • lunghi e stretti • messi lungo la direzione diagonale Marco Tarini ‧ Computer Graphics ‧ 2 0 0 5 / 0 6 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a - 59/40