Computer Graphics Lezione 7: rasterizzazione la fabbrica dei frammenti Università dell’Insubria Facoltà di Scienze MFN - Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Marco Tarini setup rasterizer triangoli setup rasterizer segmenti 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) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Rasterizzazione Segmenti v1 v0 • Produrre i frammenti il più vicino possibile alla linea ideale lavoriamo con coord intere. Arrotondarle prima. Attenzione agli estremi! Pensare al Line LOOP Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria Rasterizzazione di segmenti coefficienti angolari m1 → dy=7 1 frammento per colonna dx=9 Considerando approx di segmenti di circa un pixel di spessore Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Rasterizzazione di segmenti coefficienti angolari m>1 → dy=10 1 frammento per riga dx=3 Consideriamo i due casi separatemente. Ne vediamo uno. (l'altro è simile) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria Rasterizzazione di segmenti: algoritmo analitico Rasterizziamo da (x0,y0) a (x1,y1) P1 P0 Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Algoritmo analitico Per x che va da x0 a x1 • • x ++ y ← mx + B • • arrotondare y produrre frammento ( x , y ) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria Segmenti di Spessore diverso da uno es: spessore 3 Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Segmenti di Spessore diverso da uno Chiaramente è solo una approssimazione Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria setup rasterizer triangoli setup rasterizer segmenti 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) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria 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 termedio sulle y Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 table " = i 3 lati (precalcolati) Nel nostro caso (triangoli)! In generale, N e N (poligoni generici) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria 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 k pn Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Test di appartenenza ad un triangolo • Il semipiano e' definito da un lato: n v0=(x0, y0 ) SI v1=(x1, y1 ) NO q p = (y0 , x0) n = ( y1 -y0 , - ( x1 -x0 ) ) f(q) = n‧q - n‧p funzione detta EDGE FUNCTION (Edge = Lato, Bordo) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Test di appartenenza ad un triangolo • Triangolo=interesezione di 3 semipiani NO SI NO SI NO NO SI SI NO v0 NO SI SI v2 SI SI SI v1 SI NO SI NO NO SI Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 v2 SI SI SI v1 SI NO SI NO NO SI Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 v0 NO NO NO v1 NO SI NO SI SI NO Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria Esempio: rasterizzazione basata sul bounding box e edge functions Come si trova il bounding box di un triangolo? 1. Trovo il bounding box del triangolo Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Esempio: rasterizzazione basata sul bounding box e edge functions 1. Trovo il bounding box del triangolo 1. arrotondato agli interi... 2. ...divisibili per 2 Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Esempio: rasterizzazione basata sul bounding box e edge functions 1. Trovo il bounding box del triangolo 1. arrotondato agli interi 2. divisibili per 2 2. Processo ogni blocco (es. 2x2) 1. Testo ogni frammento nel blocco 2. Se interno al triangolo lo mando giù nel pipeline Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria setup rasterizer triangoli setup rasterizer segmenti SETUP: trovo bounding box 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) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria Clipping: la vecchia scuola • Clipping! Screen A B 1. 2. 3. 4. Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo A poi B Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Clipping: la vecchia scuola • Clipping! Screen A B C 1. 2. 3. 4. Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 1. 2. 3. 4. Trovo intersezioni Unisco intersezioni Divido poligono in triangoli Rasterizzo ogni triangolo Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria Clipping: come si fa ora • Clipping! Screen Come si interseca un bounding box con lo schermo (cioe' col rettangolo definito dal ViewPort)? 1. Trovo bounding box 2. Interseco bounding box con schermo 3. Rasterizzo nel bounding box come normale Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 Soluz: si fa testando la Z di ogni frammento prodotto dalla rasteizzazione. (TEST x FRAMMENTO) Marco Tarini ‧ Computer GraphIcs ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria 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 ‧ 2006/07 ‧ Università dell’Insubria