20.04.2013 Views

Memoria PFC - Marina Artigas Pérez - 33455

Memoria PFC - Marina Artigas Pérez - 33455

Memoria PFC - Marina Artigas Pérez - 33455

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Morphological antialiasing: implementació i<br />

anàlisi<br />

<strong>Marina</strong> <strong>Artigas</strong> <strong>Pérez</strong><br />

Projecte Final de Carrera<br />

Director: Joan Abadia<br />

Juny de 2011<br />

Enginyeria en Informàtica<br />

Universitat Pompeu Fabra


“Empleado según las instrucciones, resulta totalmente inofensivo”<br />

Philip K. Dick, Ubik<br />

Agraïments especials a Hernan, Kitus, la meva família i amics


Resum<br />

En aquest Projecte de Final de Carrera analitzarem la tècnica Morphological Antialiasing.<br />

Aquesta anàlisi es durà a terme a partir de l’estudi i la implementació de l’algorisme proposat a<br />

l’article oficial [1].<br />

El Morphological Antialiasing és un algorisme que detecta les discontinuïtats que es<br />

produeixen a les vores dels objectes d’una imatge. Mitjançant la cerca d’uns patrons<br />

característics, l’algorisme suavitzarà aquestes discontinuïtats per tal d’intentar recuperar el<br />

contorn original dels objectes de la imatge.<br />

Aquest algorisme presenta alguns avantatges respecte a les tècniques d’antialiasing<br />

utilitzades fins el moment. El més significatiu de tots és el fet de treballar sobre imatges ja<br />

processades. Donat que l’algorisme treballa en l’espai de pantalla enlloc de l’espai 3D, la<br />

correcció de la imatge serà totalment independent de la complexitat de l’escena. Per tant, el fet<br />

de no haver de realitzar càlculs amb la geometria de l’escena, permetrà tenir un cost<br />

computacional més baix respecte a d’altres algorismes, proporcionant alhora imatges d’alta<br />

qualitat.<br />

L’objectiu principal d’aquest projecte serà obtenir una valoració del Morphological<br />

Antialiasing respecte a aquestes altres tècniques.<br />

En la documentació de l’algorisme, l’autor fa una descripció poc detallada del seu mètode,<br />

de manera que hem fet un estudi complet de la tècnica proposada per tal de prendre les<br />

decisions més adients a l’hora d’encarar la seva implementació.<br />

La implementació s’ha composat de dues fases: una primera fase on només hem tractat<br />

imatges en blanc i negre; i una segona, ampliació de la primera, on hem incorporat el<br />

processament d’imatges en color.<br />

Finalment, per tal de presentar una anàlisi de resultats exhaustiu, hem preparat un conjunt<br />

d’imatges de prova a les que posteriorment hem aplicat les tècniques d’antialiasing més<br />

conegudes. La comparativa amb els resultats obtinguts de la nostra implementació, ens ha<br />

permès identificar els beneficis i inconvenients del Morphological Antialiasing envers la resta<br />

d’algorismes.


Índex<br />

1. Introducció ............................................................................................................................................. 9<br />

1.1 Motivació ......................................................................................................................................... 10<br />

2. Conceptes generals i estat de l’art ...................................................................................................... 11<br />

2.1 Aliasing ............................................................................................................................................ 11<br />

2.2 Antialiasing ...................................................................................................................................... 12<br />

2.2.1 Supersampling Anti-aliasing (SSAA) ....................................................................................... 13<br />

2.2.2 Multisampling Anti-aliasing (MSAA) ...................................................................................... 15<br />

2.2.3 Alpha-to-Coverage .................................................................................................................... 17<br />

2.2.4 High-Resolution Anti-aliasing (HRAA) ................................................................................... 17<br />

3. Descripció general del Morphological Antialiasing .......................................................................... 19<br />

4. Eines utilitzades.................................................................................................................................... 21<br />

5. Estat actual de l’MLAA....................................................................................................................... 23<br />

6. Cronologia del desenvolupament del projecte ................................................................................... 25<br />

7. Aplicació de l’MLAA ........................................................................................................................... 27<br />

7.1 Descripció detallada de l’MLAA ..................................................................................................... 27<br />

7.1.1 Cerca de discontinuïtats ............................................................................................................ 27<br />

7.1.2 Identificació de patrons ............................................................................................................. 28<br />

7.1.3 Assignació de colors ................................................................................................................. 30<br />

7.2 Blanc i negre vs. Color..................................................................................................................... 34<br />

7.2.1 Cerca de discontinuïtats ............................................................................................................ 34<br />

7.2.2 Identificació de patrons i assignació de color ........................................................................... 34<br />

7.3 Limitacions ...................................................................................................................................... 37<br />

8. Implementació en C++ ........................................................................................................................ 39<br />

8.1 B&W ................................................................................................................................................ 39<br />

8.1.1 Estructures de dades .................................................................................................................. 39<br />

8.1.2 Explicació detallada de la implementació de l’algorisme en blanc i negre ............................... 40<br />

8.1.3 Decisions ................................................................................................................................... 45<br />

8.2 Color ................................................................................................................................................ 47<br />

8.2.1 Estructures de dades .................................................................................................................. 47<br />

8.2.2 Explicació detallada de la implementació de l’algorisme en color ........................................... 48<br />

8.3 Codi per comparar ........................................................................................................................... 53<br />

9. Comparativa de resultats .................................................................................................................... 55<br />

9.1 Siluetes en blanc i negre: flors ......................................................................................................... 56<br />

9.1.1 NAA i MLAA .......................................................................................................................... 57<br />

9.1.2 4xMSAA ................................................................................................................................... 58<br />

9.1.3 16xSSAA .................................................................................................................................. 59<br />

9.1.4 Zoom ......................................................................................................................................... 60<br />

9.2 Siluetes en blanc i negre: nena ......................................................................................................... 61<br />

9.2.1 Zoom ......................................................................................................................................... 68<br />

9.3 Patrons de freqüència variable ......................................................................................................... 69<br />

9.3.1 Cercles ...................................................................................................................................... 70<br />

9.4 Checker 1 ......................................................................................................................................... 75<br />

9.5 Checker 2 ......................................................................................................................................... 79<br />

9.6 Potrace ............................................................................................................................................. 83<br />

9.7 Escàner ............................................................................................................................................. 85<br />

9.8 DirectX ............................................................................................................................................ 87<br />

9.8.1 NAA i MLAA ........................................................................................................................... 88<br />

9.8.2 2xMSAA ................................................................................................................................... 90<br />

9.8.3 4xMSAA ................................................................................................................................... 92<br />

9.8.4 8xMSAA ................................................................................................................................... 94<br />

9.9 Maya ................................................................................................................................................ 96<br />

9.9.1 4xSSAA .................................................................................................................................... 99<br />

9.9.2 16xSSAA ................................................................................................................................ 100<br />

9.9.3 Zoom ....................................................................................................................................... 101<br />

7


8<br />

9.10 Half-Life 2: Imatge 1 ................................................................................................................... 104<br />

9.10.1 2xMSAA ............................................................................................................................... 107<br />

9.10.2 4xMSAA ............................................................................................................................... 108<br />

9.10.3 8xMSAA ............................................................................................................................... 109<br />

9.10.4 Zoom ..................................................................................................................................... 110<br />

9.11 Half-Life 2: Imatge 2 ................................................................................................................... 113<br />

9.11.1 2xMSAA ............................................................................................................................... 115<br />

9.11.2 4xMSAA ............................................................................................................................... 116<br />

9.11.3 8xMSAA ............................................................................................................................... 117<br />

9.11.4 Zoom ..................................................................................................................................... 118<br />

9.12 Half-Life 2: Imatge 3 ................................................................................................................... 119<br />

9.12.1 2xMSAA ............................................................................................................................... 121<br />

9.12.2 4xMSAA ............................................................................................................................... 122<br />

9.12.3 8xMSAA ............................................................................................................................... 123<br />

9.12.4 Zoom ..................................................................................................................................... 124<br />

9.13 Autor ............................................................................................................................................ 125<br />

9.13.1 Fada ....................................................................................................................................... 125<br />

9.13.2 Silueta ................................................................................................................................... 127<br />

9.14 Half-Life 2: Imatge 1 ................................................................................................................... 130<br />

10. Conclusions ....................................................................................................................................... 137<br />

11. Glossari ............................................................................................................................................. 139<br />

12. Referències ........................................................................................................................................ 141<br />

13. Bibliografia ....................................................................................................................................... 143<br />

13.1 Llibres .......................................................................................................................................... 143<br />

13.2 Recursos electrònics ..................................................................................................................... 143


1. Introducció<br />

L’aliasing és la distorsió que es produeix en una senyal quan aquesta és mostrejada per<br />

sota de la seva freqüència de mostreig.<br />

Visualment, és el fenomen que es mostra en les imatges, quan algunes corbes o línies<br />

inclinades es veuen de forma esglaonada. Aquest efecte és una interferència que es produeix<br />

quan no hi ha suficients píxels per capturar tots els detalls de la imatge, donant com a resultat<br />

una imatge de baixa qualitat.<br />

Figura 1. Exemple de figures amb aliasing i sense aliasing [1]<br />

Existeixen diferents tipus d’aliasing, com per exemple: l’aliasing temporal, que podem<br />

identificar a les animacions; l’aliasing espacial, que es pot apreciar en els patrons que es<br />

mostregen per sota de la freqüència necessària, o bé en les alteracions que es produeixen als<br />

contorns dels objectes d’una imatge.<br />

No obstant, existeixen mètodes per corregir l’aliasing, són les anomenades tècniques<br />

d’antialiasing. Els més coneguts són el Supersampling i el Multisampling, els quals detallarem<br />

en el capítol següent.<br />

El Morphological Antialiasing és una altra de les tècniques existents, i serà la que<br />

analitzarem en detall en aquest projecte. Aquesta va ser presentada l’any 2009 pel treballador<br />

d’Intel Alexander Reshetov i, degut als seus avantatges, s’està establint en l’actualitat com a una<br />

bona alternativa envers altres metodologies més antigues.<br />

La major novetat d’aquesta tècnica respecte a les altres, és la de tractar directament la<br />

imatge resultant del renderitzat de l’escena per tal d’aplicar l’antialiasing a la zona més adient.<br />

D’aquesta manera, s’obtenen imatges de bona qualitat amb un considerable augment del<br />

rendiment.<br />

9


10<br />

1.1 Motivació<br />

Introducció<br />

L’objectiu principal d’aquest Projecte Final de Carrera, és estudiar en detall el<br />

Morphological Antialiasing.<br />

Per dur a terme aquesta tasca, hem realitzat un estudi previ de l’algorisme proposat a partir<br />

del qual, hem establert la base necessària per al següent pas: la implementació.<br />

La implementació de l’algorisme s’ha aconseguit interpretant les indicacions suggerides<br />

per l’autor, a partir de les quals, hem experimentat amb diferents tècniques fins establir quina<br />

és la més adequada per obtenir un resultat efectiu.<br />

En aquest projecte, hem decidit centrar-nos en la qualitat de la imatge resultant, i no hem<br />

tingut en compte cap tipus d’optimització respecte al rendiment. Per aquest motiu, hem escollit<br />

aquesta primera versió de l’algorisme enfocada a ser executada per la CPU en temps diferit.<br />

Existeixen altres tècniques però, que basant-se en aquest algorisme, han aconseguit portar<br />

el concepte del Morphological Antialiasing a la GPU de forma eficient.<br />

Per tal d’analitzar i comparar els resultats reals del Morphological Antialiasing envers a<br />

d’altres tècniques de correcció d’aliasing ja conegudes, hem fet servir un conjunt d’imatges de<br />

prova de diferents àmbits.<br />

Finalment, mitjançant l’avaluació d’aquests resultats, arribarem a unes conclusions on<br />

s’exposaran els avantatges i inconvenients de l’ús d’aquesta tècnica.


2. Conceptes generals i estat de l’art<br />

2.1 Aliasing<br />

L’aliasing, en termes de processament del senyal, és la distorsió de la informació que es<br />

produeix quan mostregem digitalment senyals contínues a una freqüència molt baixa. Quan això<br />

succeeix, aquestes senyals que en origen eren diferents es tornen indistingibles, de manera que<br />

no és possible reconstruir la senyal original a partir de les mostres discretes, doncs les baixes<br />

freqüències han provocat la pèrdua de detall en la senyal. Bàsicament, l’aliasing es produeix<br />

quan altes freqüències es mostren com a baixes freqüències.<br />

Per evitar aquesta pèrdua d’informació, necessitem canviar la freqüència de mostreig a<br />

almenys dues vegades la major freqüència de l’objecte, que anomenem freqüència de mostreig<br />

de Nyquist (fs):<br />

fs = 2 fmax<br />

Podem distingir entre aliasing espacial, que són els problemes que sorgeixen en el<br />

mostreig en l’espai; i aliasing temporal, que són els problemes que es poden trobar en el<br />

mostreig al llarg del temps. La seva solució, tot i basar-se en el mateix principi de la freqüència<br />

de mostreig de Nyquist, tenen solucions molt diferents.<br />

En l’àmbit de la infografia, que és el que analitzarem, dos exemples típics d’aliasing<br />

espacial són els jaggies [G1] i els patrons de moiré.<br />

Els jaggies es poden identificar, visualment, com defectes (artifacts [G2] ) amb forma<br />

“d’arestes dentades” a la vora dels polígons. Aquests artifacts es produeixen quan s’intenta<br />

representar una línia corba o una recta inclinada en una imatge en la que, pel fet de tenir una<br />

resolució final finita, no és possible mostrar la línia correctament. Aquests graons que trobem a<br />

les línies, no són més que la forma quadrada que tenen els píxels que la composen.<br />

Els patrons de moiré són patrons d’interferència que es produeixen quan intentem mostrar,<br />

amb molt detall, patrons amb un alt grau de regularitat. Per exemple, dos conjunts de línies<br />

superposades amb una diferència mínima en la seva mida.<br />

11


12<br />

Figura 2. Patró de Moiré [2]<br />

Conceptes generals i estat de l’art<br />

L’animació és un àrea en la que es poden apreciar molt bé els efectes de l’aliasing<br />

temporal. Això és conseqüència dels canvis que s’originen d’un frame [G3] a un altre: les textures<br />

poden variar i els objectes petits podrien aparèixer i desaparèixer. Aquest efecte s’anomena<br />

aliasing temporal, i es produeix quan la freqüència de mostreig d’una escena és molt baixa en<br />

comparació amb la velocitat a la que es transformen els objectes que conté.<br />

Per evitar l’aliasing temporal, s’ha de complir la freqüència de mostreig de Nyquist: la<br />

freqüència de mostreig de l’escena ha de ser, com a mínim, dues vegades més gran que la<br />

velocitat màxima que trobem als objectes de l’escena. Un aproximació a l’antialiasing temporal<br />

seria afegir motion blur [G4] a la imatge.<br />

D’altra banda, no és possible evitar l’aliasing espacial, però poden camuflar-se els seus<br />

efectes mitjançant l’ús de tècniques d’antialiasing.<br />

2.2 Antialiasing<br />

L’antialiasing és la tècnica que s’encarrega de suavitzar els defectes que produeix<br />

l’aliasing. Existeixen diferents mètodes que aconsegueixen millorar la percepció de la imatge de<br />

forma notable.<br />

Alguns algorismes, com el Morphological Antialiasing, treballen amb un sol valor per<br />

cada píxel: és a dir, només agafaran una mostra del color de cada píxel que consultin. En aquest<br />

cas, es tindran en compte el valors dels píxels veïns per tal d’obtenir un nou color per a un píxel<br />

en concret.<br />

En el cas del supersampling i el multisampling, es pot obtenir més d’un valor a partir d’un<br />

sol píxel. Segons el nombre de mostres que s’agafa de cada píxel, l’antialiasing s’identificarà<br />

com a 2X, 4X, 8X, etc. Quan més alt és el valor millor és el resultat, però també més costós,<br />

doncs requereix un alt nivell de càlcul i processament.<br />

Generalment, les tècniques d’antialiasing es centren en reduir les transicions brusques a la<br />

vora dels objectes. La idea principal consisteix en fer creure a l’ull que el contorn de l’objecte es<br />

troba completament suavitzat, quan en realitat només s’ha retocat de manera que pugui passar<br />

desapercebut.<br />

Existeixen diferents tècniques d’antialiasing que s’aprecien per la qualitat de les imatges<br />

generades i el cost en el rendiment que això comporta. A continuació, analitzarem les més<br />

importants.


Conceptes generals i estat de l’art<br />

2.2.1 Supersampling Anti-aliasing (SSAA)<br />

Supersampling, també conegut com Full-scene anti-aliasing (FSAA), és una tècnica de<br />

força bruta. El seu funcionament consisteix en renderitzar la imatge a més alta resolució. A<br />

continuació, s’escala la imatge a la seva mida original mitjançant un filtre de reducció.<br />

La idea principal es basa en el fet que la imatge en alta resolució conté més píxels que els<br />

que finalment es mostraran, per tant contenen més informació de color. Al reduir la imatge<br />

estarem utilitzant aquesta informació de tal manera, que cada píxel de la imatge final tindrà el<br />

valor promig dels píxels de la imatge més gran.<br />

Les imatges resultants d’aplicar l’SSAA són un referent per la seva altíssima qualitat, però<br />

el seu consum en el rendiment és extremadament costós.<br />

El nombre de mostres determinarà la qualitat resultant de la imatge, alhora que<br />

incrementarà de forma considerable el cost de computació. Les imatges al doble de resolució,<br />

4xSSAA (2x2 supersampling,) renderitzaran 4 subpíxels per cada un dels píxels de la imatge<br />

original.<br />

Figura 3. 4xSSAA (4 subpíxels per píxel) i 16xSSAA (16 subpíxels per píxel) [6]<br />

És habitual que els algorismes de supersampling assignin més pes als subpíxels pròxims al<br />

centre que a la resta, ja que s’espera que la informació d’aquests serà més important alhora de<br />

determinar la intensitat global del píxel.<br />

Els pesos específics es poden identificar mitjançant una màscara de ponderació: una matriu<br />

de valors que indica la importància relativa de cada subpíxel.<br />

Figura 4. Màscara de ponderació<br />

13


14<br />

Conceptes generals i estat de l’art<br />

Cal destacar però, l’ús de tècniques de filtratge. Es tracta d’utilitzar una superfície de pesos<br />

contínua que cobreix el píxel. El mètode és similar a l’utilitzat amb la màscara de ponderació,<br />

amb la diferència que ara s’integra sobre la superfície del píxel per tal d’obtenir la intensitat<br />

promig. En aquest cas, l’alçada proporciona el pes relatiu de cada posició del subpíxel.<br />

Distingim tres tipus: filtre de cub, de con i gaussià.<br />

Figura 5. Funcions de filtratge [3]<br />

Existeixen altres tipus de supersampling basats en el mètode utilitzat per obtenir les<br />

mostres a l’interior de cada píxel.<br />

El més senzill, conegut com supersampling ordenat, és aquell en el que es divideix el píxel<br />

en subpíxels i s’escull la mostra que correspon al centre de cada un d’ells.<br />

Figura 6. Supersampling ordenat [4]<br />

El supersampling rotat és un mètode similar a l’anterior. La única diferència és que les<br />

mostres s’obtenen a partir d’una graella de subpíxels que ha estat rotada prèviament. D’aquesta<br />

manera, s’evita que les mostres estiguin alineades amb els eixos, i produeix una millora en la<br />

correcció en la majoria de casos, amb el mateix cost computacional del supersampling ordenat.


Conceptes generals i estat de l’art<br />

Figura 7. Supersampling rotat [4]<br />

Els altres tipus de supersampling es basen en el concepte d’aleatorietat. El problema de<br />

seleccionar les mostres de forma aleatòria és que, en alguns casos, estarem deixant zones<br />

importants sense cobrir.<br />

Figura 8. Supersampling aleatori [4]<br />

Per tal de solucionar això, existeixen algunes variacions d’aquest mètode, com per<br />

exemple: el disc de Poisson, on es comprova que cada parell de mostres escollides no siguin<br />

molt properes l’una de l’altra. El cost de realitzar aquestes comprovacions és elevat.<br />

Figura 9. Supersampling disc de Poisson [4]<br />

Una tècnica per alleugerir el cost de seleccionar les mostres d’una manera o altre, és a amb<br />

l’Adaptative Supersampling. Aquesta tècnica s’encarrega d’escollir només una mostra per píxel<br />

quan no hi ha un canvi significatiu d’un píxel a l’altre; en cas contrari, es recullen les mostres<br />

necessàries. El resultat d’aplicar aquesta tècnica recau en una millora en el rendiment.<br />

2.2.2 Multisampling Anti-aliasing (MSAA)<br />

L’MSAA és una de les tècniques d’antialiasing més utilitzades, i es pot considerar com un<br />

cas especial de supersampling, encara que es tracta d’un procés més sofisticat. NVIDIA va<br />

incorporar-lo per primer cop a les targes de vídeo GeForce 3.<br />

El principal avantatge de l’MSAA és que només s’aplica en aquelles àrees que és necessari.<br />

La tarja de vídeo processa la imatge avaluant en quins punts serà necessari corregir l’aliasing<br />

que, generalment, es localitza a la vora dels objectes de l’escena.<br />

15


16<br />

Conceptes generals i estat de l’art<br />

D’aquesta manera, el filtre ignorarà la resta de la imatge i s’aplicarà només en les zones<br />

especificades. Per tal de decidir quins píxels han de ser filtrats, es realitzen càlculs sobre la<br />

profunditat dels diferents polígons que intervenen en l’escena.<br />

Gràcies a aquests càlculs, l’algorisme pot identificar els píxels que pertanyen a un mateix<br />

objecte, i d’aquesta manera reconeixerà com a un conjunt tots aquells píxels iguals que<br />

pertanyen a una mateixa zona. Això permetrà assignar el mateix color a tot el conjunt i millorarà<br />

el rendiment de forma significativa.<br />

D’altre banda, aquest procés de selecció de píxels és el causant d’un dels principals<br />

desavantatges de l’algorisme: els càlculs per decidir quines zones necessiten correcció es<br />

realitzen de tal manera, que la filtració es limitarà a les àrees externes dels polígons, i en<br />

conseqüència, les textures internes seran ignorades i no rebran cap tipus de correcció. Tot i així,<br />

és un filtre molt adequat per a objectes sòlids.<br />

Un cop s’hagin detectat les zones que seran filtrades, s’agafen mostres de colors a partir<br />

dels píxels de la imatge. Un dels avantatges del multisampling respecte el supersampling, és que<br />

només és calcularà un valor de textura per píxel enlloc d’un valor per cada subpíxel.<br />

Les mostres de color obtingudes, seran combinades entre elles amb l’objectiu de crear<br />

transposicions graduals entre els colors que siguin diferents i ens permetran suavitzar la zona<br />

amb aliasing.<br />

En aquest cas, tal com succeeix amb el supersampling, el número de mostres que<br />

s’utilitzarà en el procés és molt significatiu de cara a obtenir bona qualitat d’imatge (2x, 4x...).<br />

També existirà una matriu de ponderació, de manera que el pes de les mostres a l’hora<br />

d’assignar els colors no és el mateix per tots els subpíxels.<br />

L’MSAA és molt més lleuger que l’SSAA. El supersampling renderitzarà tota la imatge a<br />

una resolució molt alta independentment de la necessitat de cada zona. El multisampling en<br />

canvi, donat que només s’aplica en les zones que és estrictament necessari, deixarà gran part de<br />

les textures sense processar. Això desembocarà en un estalvi tant en el bandwidth [G5] com en el<br />

fillrate [G6] .<br />

Figura 10. Exemple de l’MSAA i l’SSAA a 8x amb una Radeon de la sèrie HD 5000 [7]


Conceptes generals i estat de l’art<br />

El fet que el multisampling seleccioni prèviament les zones a tractar pot proporcionar una<br />

qualitat d’imatge similar amb un rendiment superior al del supersampling.<br />

2.2.3 Alpha-to-Coverage<br />

L’inconvenient més gran de l’MSAA és el fet de no tractar les textures internes dels<br />

objectes. En conseqüència, les textures alpha (transparents), que són habituals a les escenes amb<br />

reixes, fulles... tampoc es veuran corregides.<br />

Aquest cas específic resulta molt problemàtic, doncs aquests objectes s’acostumen a<br />

construir només a base de textures per tal d’estalviar processament. A més a més, les textures<br />

alpha produeixen el Texture Shimmering, un efecte òptic en el que les textures donen la<br />

sensació de moure’s amb la càmera. Òbviament, suposa una pèrdua de qualitat de la imatge<br />

molt gran.<br />

L’Alpha-to-Coverage és una ampliació de l’MSAA que respon a la necessitat de solucionar<br />

aquest problemes amb les textures alpha.<br />

Bàsicament, es realitza una anàlisi de textures transparents avaluant la quantitat d’espai del<br />

píxel de la imatge estan ocupant. A continuació, es creen varies màscares de filtrat que<br />

permetran recombinar el resultat. Tot i ser un procés bastant complex, el seu rendiment és<br />

superior al de l’SSAA, i la qualitat de la imatge és molt satisfactòria.<br />

L’únic inconvenient que té aquesta tècnica és que les textures queden una mica més<br />

borroses a la vora en comparació amb el supersampling. Però això és corregible fent les textures<br />

més visibles mitjançant un multiplicador de contrast.<br />

2.2.4 High-Resolution Anti-aliasing (HRAA)<br />

L’HRAA es distingeix de l’SSAA en que no necessita tractar amb imatges de resolució més<br />

gran. Això li proporciona un augment considerable en el seu rendiment.<br />

Aquest antialiasing utilitza la tècnica Quincunx, que consisteix en emmagatzemar cada<br />

píxel en dues zones diferents del frame buffer [G7] .<br />

D’aquesta manera, en renderitzar tota l’escena, el motor gràfic de la tarja desplaçarà<br />

virtualment una de les dues escenes, el desplaçament serà de mig píxel en diagonal.<br />

Figura 11. Desplaçament dels píxels d’una escena respecte als de l’altre [5]<br />

17


18<br />

Conceptes generals i estat de l’art<br />

Aquest mètode provocarà la situació següent: cada píxel de la primera escena es trobarà<br />

rodejat per quatre píxels de la segona, que es troben exactament a una distància de 1 /√2.<br />

Finalment, el motor filtrarà aquests cinc píxels per tal d’obtenir el valor final. No tots els<br />

píxels tindran el mateix pes, doncs el valor del píxel central (½) tindrà més rellevància que els<br />

del voltant (⅛).<br />

Els resultats obtinguts amb aquesta tècnica tant en qualitat com en rendiment són molt<br />

bons, el fet de tenir l’escena repetida només afecta al consum d’ample de banda de la memòria.<br />

La primera aparició d’aquesta tècnica va ser en la generació de GeForce3 d’NVIDIA, i va<br />

proporcionar, per primer cop, la combinació d’altes resolucions a bon rendiment.


3. Descripció general del Morphological Antialiasing<br />

El Morphological Antialiasing (MLAA) és un algorisme dissenyat per la fase de postprocessament<br />

d’imatges, doncs és una tècnica que s’aplica sobre imatges ja generades.<br />

Donat que l’algorisme treballa en l’espai de pantalla enlloc de l’espai 3D, ens permetrà<br />

corregir la imatge independentment de la seva complexitat o la tècnica de render utilitzada per<br />

generar l’escena. D’aquesta manera, el cost de corregir l’aliasing es veurà rebaixat en no haver<br />

de testejar rajos addicionals.<br />

L’MLAA consta de tres fases:<br />

1. Cerca de discontinuïtats entre píxels<br />

2. Identificació dels patrons corresponents: un cop detectades les discontinuïtats entre<br />

píxels, es fa una cerca més detallada intentant localitzar certs patrons que ens<br />

permetran localitzar la zona que requereix correcció.<br />

3. Assignació de colors als patrons respecte a la composició dels píxels veïns<br />

Per trobar les discontinuïtats entre píxels, es fa una cerca exhaustiva comparant les línies<br />

de la imatge per poder identificar aquelles zones amb possibilitat de tenir aliasing.<br />

A partir d’aquestes discontinuïtats entre píxels, es realitza una cerca més detallada que<br />

correspondrà a la identificació de certs patrons que ens permetran localitzar la zona que<br />

requereix correcció en el color.<br />

Un cop localitzades les zones afectades per l’aliasing, es procedeix a corregir el color dels<br />

seus píxels tenint en compte el patró amb el qual s’ha localitzat aquella zona i el color dels<br />

píxels que el rodegen.<br />

La implementació de l’aplicació s’ha desenvolupat en dues fases: en blanc i negre i en<br />

color. La implementació en blanc i negre es considera el cas base de l’algorisme i la versió en<br />

color és la seva generalització.<br />

19


4. Eines utilitzades<br />

Per poder realitzar aquest projecte hem utilitzat les següents eines:<br />

- Microsoft Visual Studio 2008: entorn de programació amb el qual hem fet les diferents<br />

implementacions de l’algorisme en C++.<br />

- Autodesk Maya 2011: software enfocat a l’animació en 3D. S’ha utilitzat per<br />

renderitzar algunes escenes.<br />

- Sample de DirectX: aplicació de prova que permet provar diferents configuracions de<br />

la tarja gràfica sobre un model 3d.<br />

- Adobe Photoshop CS3: editor de gràfics que hem utilitzat per editar i manipular<br />

algunes imatges.<br />

- Gimp 2: editor d’imatges que hem utilitzat per editar i manipular algunes imatges.<br />

- testMLAA: programa de prova de l’autor de l’MLAA. Amb aquest programa hem pogut<br />

avaluar la qualitat de la nostra implementació.<br />

- Gantt Project: software dedicat al disseny de diagrames d’activitats. L’hem utilitzat<br />

per mostrar la cronologia del projecte.<br />

- Half-Life 2: videojoc del qual hem obtingut imatges mitjançant l’aplicació de diferents<br />

antialiasings.<br />

21


5. Estat actual de l’MLAA<br />

Actualment, existeixen diverses implementacions per a temps real basades en l’MLAA, tot i<br />

que fins fa poc, ningú havia publicat el codi per portar l’algorisme a la GPU. Una de les<br />

primeres implementacions va ser el Practical Mortphological Antialiasing on the GPU [12].<br />

Destacarem però, les implementacions d’AMD, de Sony i la implementació coneguda com<br />

Jimenez’s MLAA [13] de la Universitat de Zaragoza.<br />

AMD va presentar la seva implementació de l’MLAA amb les Radeon HD 6800 i, donat<br />

que treballa a nivell de driver, permet incorporar l’MLAA a videojocs que no disposaven<br />

d’aquest antialiasing de forma nativa.<br />

Tot i que fins fa poc, AMD no tenia cap tipus de competència en quant al morphological,<br />

NVIDIA ha decidit recentment implementar un nova tècnica anomenada SRAA (Subpixel<br />

Reconstruction Antialiasing), amb l’objectiu d’introduir-la en les seves GPUs. La principal<br />

diferència entre ambdós mètodes és que representa que el SRAA respectarà millor els límits de<br />

la geometria, ja que afegeix la visibilitat del subpíxel a les característiques de l’algorisme.<br />

Cal destacar que, tant AMD com NVIDIA, estan donant suport a nivell de driver a una<br />

problemàtica que des de fa anys s’ha intentant solucionar des de l’MSAA. Recordem que el<br />

multisampling és la solució més estesa per a combatre l’aliasing i que, a pesar dels bons<br />

resultats obtinguts a temps real, el seu consum de memòria és excessivament alt.<br />

Per tant, la idea base de l’MLAA sorgeix de conceptes que s’han anat investigant des dels<br />

anys 90, però no ha estat fins ara que s’ha aconseguit assolir una tècnica estable i prou eficient<br />

com per portar-la a temps real. És per això que aquest nou enfocament és tan rellevant, doncs<br />

s’obtenen qualitats superiors amb un consum de recursos menor.<br />

L’altre implementació important és la de Sony per la PS3, que tot i tenir molt a veure amb<br />

la implementació que ha fet AMD, obté millors resultats mitjançant la paralel·lització de cinc de<br />

les seves SPUs. Cal afegir però, que en aquest cas, la llibreria de l’MLAA es troba a l’SDK, i per<br />

tant, són els mateixos desenvolupadors els que han donat suport per decidir quan utilitzar-lo.<br />

D’altra banda, un dels punts a favor de la implementació de Sony, és que treballa amb el<br />

frame abans de que s’afegeixi el text, i per tant no pateix una de les conegudes limitacions de<br />

l’MLAA. AMD en canvi, treballa amb el frame complert i no pot evitar aquest problema.<br />

Finalment, Jimenez’s MLAA és una optimització de l’MLAA per la GPU que investiga una<br />

solució viable per portar el morphological a l’Xbox 360. Els seus resultats es troben entre el<br />

4xMSAA i 8xMSAA amb una fracció del consum de temps i de memòria.<br />

Al marge de les diferents implementacions que es van proposant, s’està fomentant la teoria<br />

d’una tècnica híbrida que combini el multisampling i el morphological. Jiménez suggereix<br />

combinar el 4xMSAA per reduir les característiques a nivell de subpíxel, i a continuació aplicar<br />

l’MLAA, per tal de corregir la resta d’aliasing de la imatge.<br />

Com a demostració dels efectes de l’MLAA, es poden comprovar algunes d’aquestes<br />

implementacions en els següents videojocs: Dead Space, Half-Life 2, Final Fantasy XIV,<br />

Dragon Age, Mass Effect2, etc.<br />

23


6. Cronologia del desenvolupament del projecte<br />

A continuació es mostren els diagrames que representen el temps dedicat a cada part del<br />

projecte final de carrera.<br />

Figura 12. Diagrama de Gantt<br />

25


26<br />

Figura 13. Continuació diagrama de Gantt<br />

Cronologia del desenvolupament del projecte<br />

Com podem veure als diagrames, la data d’inici de desenvolupament del projecte va ser el<br />

27/02/2010 i la de finalització el 21/06/2011.<br />

Al diagrama trobem detallades cada una de les etapes del projecte, amb la seves dates<br />

corresponents. Aquestes fases, són el desglossament en detall de les fases que hem dut a terme<br />

per realitzar el projecte. Es poden resumir en cinc passos:<br />

- Anàlisi de la documentació (1/03/10 – 3/07/10)<br />

- Implementació de la versió en blanc i negre (5/07/10 – 16/10/10)<br />

- Implementació de la versió en color (18/10/10 – 25/05/11)<br />

- Implementació de l’aplicació per comparar imatges (24/05/11 – 25/05/11)<br />

- Redacció d’aquesta documentació (2/03/11 – 21/06/11)


7. Aplicació de l’MLAA<br />

7.1 Descripció detallada de l’MLAA<br />

L’estudi de la documentació de l’algorisme ens ha portat, en molts casos, a prendre<br />

decisions basant-nos en la informació que l’autor ens ofereix. Aquesta informació, en ser poc<br />

detallada, pot desembocar en interpretacions errònies que s’han hagut de descartar i replantejar<br />

per tal d’arribar a un resultat satisfactori.<br />

Com ja havíem avançat, tant a la documentació com a la nostra implementació, es<br />

distingeixen un cas base on s’aplica l’MLAA sobre imatges en blanc i negre, i un cas genèric per<br />

a imatges en color.<br />

L’algorisme es pot descomposar en tres fases: la cerca de discontinuïtats, la localització de<br />

patrons i l’assignació de colors.<br />

A continuació, desglossarem cada un d’aquests passos per a la versió en blanc i negre, tot<br />

analitzant què diu la documentació i com hem arribat a la seva implementació.<br />

7.1.1 Cerca de discontinuïtats<br />

El primer pas de l’algorisme consisteix en comprovar cada una de les fileres de píxels per<br />

tal d’obtenir aquelles arestes que separen els píxels blancs dels píxels negres.<br />

La forma de fer-ho és comparant cada fila de píxels amb la seva adjacent, repetint aquest<br />

mateix procés per a les columnes.<br />

Cada una d’aquestes arestes trobades formarà part d’una línia i es veurà definida a partir<br />

dels seus vèrtexs més llunyans. Podríem interpretar aquesta línia com un espai entre dues files o<br />

dues columnes; en conseqüència, una línia podrà contenir més d’una discontinuïtat.<br />

Com a cas particular per poder gestionar els píxels dels extrems de la imatge, l’autor ens<br />

proposa el següent conveni: suposar que els píxels de la vora es dupliquen en una filera<br />

imaginària.<br />

Observem l’exemple:<br />

Figura 14. Esquerra: imatge original en blanc i negre; dreta: els píxels de la vora creen<br />

una filera imaginària<br />

En la imatge original, el píxel I-C es troba a un extrem de la imatge, per tant existirà una<br />

fila imaginària 0 on tots els seus píxels seran de color blanc, excepte el píxel 0-C, que serà<br />

negre. El mateix succeeix amb els píxels IV-A i V-A: existiran els píxels de color negre IV-Z i<br />

V-Z, que formaran part d’una columna imaginària Z on la resta de píxels seran de color blanc.<br />

27


28<br />

Aplicació de l’MLAA<br />

Comparem la fila I amb la fila II. Veiem que existeix una discontinuïtat entre el píxel I-C<br />

(negre) i el píxel II-C (blanc); el mateix succeeix en comparar els píxels I-G i II-G. Com cada<br />

una d’aquestes discontinuïtats té longitud 1, obtenim una línia amb dues discontinuïtats (la línia<br />

es troba entre la fila I i la fila II de la Figura 14, correspon a la línia 2 de la Figura 15).<br />

La imatge de la Figura 15 mostra les discontinuïtats que es troben a les línies, per tant, ja<br />

no tindrem una graella de píxels: tindrem línies de discontinuïtats, on cada línia correspon a la<br />

zona entre dos píxels de la imatge original.<br />

Seguint amb l’exemple anterior, comprovem que en la línia 2 existeixen dos<br />

discontinuïtats: de c a d i de g a h.<br />

Figura 15. Discontinuïtats localitzades<br />

Si remarquem cada una de les discontinuïtats trobades per cada una de les línies, tant per<br />

files com per columnes, visualitzarem el contorn de la silueta de la imatge original.<br />

7.1.2 Identificació de patrons<br />

En aquest segon pas de l’algorisme, es tracta de localitzar aquelles arestes que són<br />

ortogonals a una determinada aresta en el seu punt més llunyà; és a dir, aquells segments que es<br />

troben units per l’extrem a un segment perpendicular.<br />

Existeixen dos tipus de segment: els que pertanyen a la vora de la imatge, que només<br />

tindran un segment ortogonal, i els de la resta de la imatge que en tindran dos. Aquests últims<br />

seran els més habituals.<br />

Considerem cada patró format per una aresta primària, que correspon a la línia que hem<br />

trobat en el primer pas de l’algorisme (cerca de discontinuïtats), i una o dues arestes<br />

secundàries. Les arestes secundàries són els segments ortogonals a l’aresta primària i que es<br />

localitzen en aquesta segona fase.<br />

L’aresta primària podrà tenir qualsevol longitud més gran que 0, però les arestes<br />

secundàries sempre seran considerades de longitud 1. Encara que les arestes secundàries siguin<br />

en realitat de mida més gran, nosaltres només seleccionarem aquell fragment.<br />

En l’MLAA ens proposen classificar aquests conjunt d’arestes primàries i secundàries<br />

segons la seva forma. Tindrem tres patrons diferents: en forma de U, L o Z.<br />

Podem reconèixer alguns d’aquests patrons a la imatge següent. Per enumerar-los farem<br />

servir la següent nomenclatura: per exemple, a l’aresta primària que va de 4a a 4c<br />

l’anomenarem 4a4c; i la secundària que va de 4c a 5c serà 4c5c.


Aplicació de l’MLAA<br />

Figura 16. S’han identificat alguns patrons L,U i Z<br />

El patró L es forma quan un dels segments de separació té el seu origen a la vora de la<br />

imatge. És per això que es composa d’una aresta primària i només una de secundària: allà on hi<br />

hauria d’haver l’altra aresta secundària es troba la vora de la imatge.<br />

A la imatge, identifiquem una L que es composa de les arestes 4a4c (primària) i 4c5c<br />

(secundària).<br />

El patró U és producte de la unió d’una aresta primària i dues arestes secundàries que es<br />

troben en la mateixa direcció. Un exemple seria l’aresta principal 8d8f amb les arestes<br />

secundàries 7d8d i 7f8f.<br />

Figura 17. S’ha identificat un nou patró U<br />

Podríem identificar altra U a la imatge que il·lustraria el cas on, encara que les arestes<br />

secundàries tinguin una longitud més gran, només escolliríem aquell fragment de longitud 1.<br />

Aquest és el cas que es forma amb l’aresta principal 6h7h i les arestes secundàries 6g6h i 7g7h.<br />

El patró Z es troba quan tenim una aresta primària i dues arestes secundàries que van en<br />

direccions oposades. És el cas de l’aresta primària 5c5f i les secundàries 4c5c i 5f6f<br />

Un mateix segment pot formar part de diferents patrons (en realitat, fins a quatre). Posem<br />

l’exemple de l’aresta 6g6h que fins ara era una aresta secundària que formava part d’un patró U.<br />

Podem comprovar que aquest fragment, ja que l’aresta forma part d’un segment de separació<br />

més gran, també forma part de l’aresta principal 6f6h. I aquesta aresta, junt amb les secundàries<br />

5f6f i 6h7h formen un patró Z. Si ens fixem més, aquesta mateixa aresta secundària de Z<br />

correspon a l’aresta principal de la U que havíem trobat en la imatge anterior.<br />

29


30<br />

Aplicació de l’MLAA<br />

Figura 18. Mostra d’un patró Z que comparteix aresta amb el patró U anterior<br />

Tècnicament, l’MLAA no tindrà en compte la múltiple participació de les arestes en<br />

diferents patrons alhora i processarà cada una de les formes un cop hagin estat identificades. És<br />

a dir, en cas de solapament de patrons l’algorisme els processarà tots, com succeeix amb els dos<br />

patrons U i Z (color blau) de la imatge de la Figura 17 i de la Figura 18. D’aquesta manera<br />

s’obtindrà un lleuger desenfocament en la zona que permetrà, al mateix temps, atenuar les altes<br />

freqüències injustificades que hi puguin haver.<br />

Donat que la cerca de patrons es realitzarà tant de forma horitzontal (files) com de forma<br />

vertical (columnes), aquests són tots els possibles patrons que podem trobar:<br />

7.1.3 Assignació de colors<br />

Figura 19. Possibles patrons de l’MLAA<br />

La idea principal d’aquest tercer pas, és associar un pes a cada un dels píxels per tal<br />

d’assignar el color més adient. Per tal d’aconseguir aquest objectiu, l’MLAA proposa la<br />

descomposició dels patrons U i Z en dos patrons L. D’aquesta manera, simplifica el problema ja<br />

que només s’hauran de processar patrons amb forma de L en aquesta part de l’algorisme.<br />

Figura 20. Descomposició de patrons


Aplicació de l’MLAA<br />

Les arestes primàries, com ja havíem dit, poden tenir qualsevol longitud major o igual que<br />

0. Si tenim un patró U o Z amb una aresta primària de longitud 1, en descomposar-lo en dos<br />

patrons L, les seves arestes primàries seran de longitud 0,5.<br />

Cada forma L està formada per tres vèrtexs (V0, V1, V2) . Per poder trobar els pesos dels<br />

píxels que intervenen en l’assignació de colors, es fa una connexió des del punt mig de l’aresta<br />

secundària (as ) fins al vèrtex restant de l’aresta primària (ap). D’aquesta manera, cada una de les<br />

cel·les que contenen aquest patró L quedaran dividides en dos trapezoides que ens permetran<br />

assignar el pes corresponent a partir de la seva àrea.<br />

Figura 21. Connexió de les arestes primària i secundària del patró L<br />

La unió d’aquests dos vèrtexs forma alhora un supertriangle. En aquest cas, la última<br />

cel·la, que conté el vèrtex V2 no s’haurà dividit en dos trapezoides: tindrà un triangle, que<br />

correspondrà a la punta del supertriangle, i el polígon restant de la cel·la.<br />

Un cop connectades les dues arestes, es procedeix al càlcul de l’àrea α de cada un dels<br />

trapezoides adjacents a la L. També es calcularà l’àrea del triangle petit, en cas de ser necessari.<br />

La fórmula per a calcular l’àrea d’un trapezoide és:<br />

α = ( ( b1 + b2) · h ) / 2<br />

On b1 i b2 és la mida de les bases del trapezoide i h correspon a l’alçada. I per calcular<br />

l’àrea del triangle:<br />

On b és la base i h l’alçada.<br />

α = ( b · h ) / 2<br />

En el nostre exemple, l’alçada h del trapezoide sempre serà 1, ja que correspon a un costat<br />

sencer de la cel·la, que a més a més coincideix amb un fragment de l’aresta primària. De la<br />

mateixa manera obtindrem b1, que serà 0,5, corresponent a la meitat de la longitud de la cel·la<br />

(aresta secundària). El problema el trobem per b2, ja que és un valor desconegut fins ara.<br />

31


32<br />

Aplicació de l’MLAA<br />

Per calcular b2 partirem de la idea del supertriangle que teníem i, mitjançant una senzilla<br />

regla de tres, obtindrem la mida de l’altra base del trapezoide:<br />

Si 1 /2 és a 3 /2 com X és a 1 /2, llavors X és 1 /6<br />

Figura 22. Visualització dels trapezoides que es formen després de connectar les arestes<br />

Ara ja podrem calcular l’àrea del trapezoide de la cel·la cd45 (cel·la limitada per c i d per<br />

a 4 i 5):<br />

α = ( ( 1 /2 + 1 /6 ) · 1 ) / 2 = 1 /3<br />

Figura 23. Càlcul de les àrees del trapezoide i del triangle


Aplicació de l’MLAA<br />

El càlcul d’aquesta àrea ens permetrà obtenir, segons la següent fórmula, el valor del color<br />

que assignarem a la cel·la:<br />

cnew = (1 – α) · cold + α · copposite<br />

On cnew és el nou color, cold és el color anterior de la cel·la i copposite és el color de la cel·la<br />

que trobem al costat oposat de l’aresta primària.<br />

Per tant, si tenim que cold, corresponent al color de la cel·la actual, és blanc (valor 1) i<br />

copposite , corresponent al color de la cel·la cd56, és negre (valor 0), calcularem el nou color de la<br />

forma següent:<br />

cnew = (1 – 1 /3) · 1 + 1 /3 · 0 = 2 /3<br />

Per obtenir el color de la cel·la de45, calcularem en aquest cas l’àrea del triangle:<br />

α = ( 1 /6 · 1 /2) / 2 = 1 /24<br />

Si cold és blanc i copposite és negre, el nou color serà:<br />

cnew = (1 – 1 /24) · 1 + 1 /24 · 0 = 23 /24<br />

D’aquesta manera ja tindríem els nous colors per tot el patró L.<br />

Figura 24. Assignació del nou color als píxels que formen el patró L<br />

L’autor es refereix a com a one-size-fits-all al fet d’escollir el punt mig de l’aresta<br />

secundària com a norma general per a tots els patrons, ja que estem establint que tots tindran<br />

una mida standard. Aquesta aproximació però, crearà un error sistemàtic en l’àrea i l’estimació<br />

del color. D’altra banda reduirà la variància donant com a resultat una imatge més bona i<br />

suavitzada.<br />

33


34<br />

7.2 Blanc i negre vs. Color<br />

Aplicació de l’MLAA<br />

Per treballar amb imatges en color, és necessari adaptar els passos de l’algorisme. Tal com<br />

veurem a continuació, l’autor dona una idea molt genèrica de com ha tractat aquesta part. Cal<br />

afegir però, que la nostra implementació de l’algorisme en aquest punt té algunes diferències<br />

respecte a la idea original. Les comentarem en el capítol següent.<br />

7.2.1 Cerca de discontinuïtats<br />

La primera gran diferència entre la versió en blanc i negre (B&W) i la versió en color, és la<br />

localització de discontinuïtats.<br />

En B&W treballàvem en un espai binari: o és blanc o és negre. Ara, no només disposem de<br />

tres canals diferents per cada canal RGB, sinó que cada un d’aquests canals pot prendre 256<br />

valors diferents.<br />

Per tal d’afrontar aquest problema, tenim dues possibles solucions: tractar les diferències<br />

de color entre píxels veïns, o bé, treballar amb informació addicional: geomètrica o discreta.<br />

L’MLAA implementa la primera solució. Un dels avantatges d’aquesta tècnica és produeix<br />

en l’estalvi en processar alguns píxels, ja que només es processen aquells píxels que tenen<br />

colors diferents.<br />

Els píxels de color similar es passaran per alt, doncs es considera que el seu procés no<br />

alteraria el color resultant de forma significativa. De la mateixa manera, també pot ocórrer que<br />

es processin píxels innecessaris que provoquin una alteració en el color resultant.<br />

L’MLAA pot funcionar amb qualsevol mètode que ens permeti establir si dos píxels són<br />

diferents. L’autor proposa utilitzar la més simple i universal: s’establirà un llindar a partir del<br />

qual s’especificarà quins colors són iguals i quins diferents.<br />

En aquest cas, s’agafaran els 4 bits més significatius de cada canal RGB (8 bits cada un).<br />

En cas d’existir alguna diferència en aquests bits per a qualsevol dels canals, es considerarà que<br />

es tracta de colors diferents. El fet d’escollir 5 o 6 bits no alteraria el resultat de forma<br />

significativa, i escollint 3 perdríem alguna informació rellevant.<br />

Amb aquest mètode doncs, s’hauran trobat totes les discontinuïtats entre píxels.<br />

7.2.2 Identificació de patrons i assignació de color<br />

Recordem l’expressió d’assignació de colors que fèiem servir en blanc i negre:<br />

cnew = (1 – α) · cold + α · copposite<br />

Per tractar imatges en color utilitzarem aquesta mateixa expressió, doncs simplement cal<br />

aplicar-la a cada un dels canals RGB per separat a l’hora d’assignar el color del píxel.<br />

L’ús d’aquesta fórmula en B&W implica que, quan tinguem patrons adjacents els uns als<br />

altres, els colors assignats variaran de forma suau. Això és conseqüència directa de l’ús del punt<br />

mig en les arestes secundàries, ja que defineix una aproximació lineal contínua a la vora de la<br />

silueta.<br />

Per a imatges en color, l’MLAA vol conservar aquesta aproximació continua de la silueta,<br />

però ho farà de forma menys restrictiva.


Aplicació de l’MLAA<br />

Tenim el cas particular de la Figura 25 on visualitzem dos patrons Z:<br />

Figura 25. Exemple d’identificació de colors [55]<br />

Els colors dels píxels que es troben sota la línia que marca els patrons serien els mateixos<br />

en B&W, en color no podem concretar tant i direm que són similars. El mateix succeeix amb els<br />

colors dels píxels que es troben per sobre d’aquesta línia.<br />

En B&W, el valor de hd i hc seria ½, doncs segueix la regla del punt mig a l’aresta<br />

secundària. Donat que r caracteritza la relació que existeix entre les dues bases del trapezoide,<br />

podem afirmar que:<br />

r = hd / l<br />

on l és la longitud de l’aresta primària del patró Z.<br />

En el cas que la longitud de dos patrons connectats sigui la mateixa, els trapezoides blaus<br />

seran congruents de la mateixa manera que ho seran els grocs. Per tal d’establir els requeriments<br />

per una transició suau entre dues formes, computarem el mateix color assignat dos cops,<br />

utilitzant els paràmetres de cada forma:<br />

(hc – r) c1 + (1 – hc + r) c2 = (hd – r) d2 + (1 – hd + r) d3<br />

hc + hd = 1<br />

Aquelles imatges on els colors de les cel·les c1 i d2 siguin similars (c1 = d2), i també ho siguin<br />

els de les cel·les c2 i d3 (c2 = d3), simplificaran aquestes equacions de forma considerable.<br />

Doncs obtindrem que hc = hd, i per tant:<br />

hc = hd = ½<br />

Precisament aquesta és la regla del punt mig que hem aplicat a la versió en B&W. Aquest<br />

però, és un cas particular que no es donarà sempre, doncs volem conèixer tots aquells casos en<br />

que el punt d’intersecció de les dues formes sigui diferent del punt mig.<br />

Per obtenir aquest punt, solucionarem les equacions per tal de conèixer el valor de hc i hd.<br />

Donat que tenim tres canals de color, existeix la possibilitat de resoldre les equacions per cada<br />

un dels canals, o bé, fer la suma dels tres canals de color i utilitzar aquests valors per c1, c2, d2 i<br />

d3.<br />

35


36<br />

Aplicació de l’MLAA<br />

En aquest cas, l’autor decideix simplificar el càlcul mitjançant la suma dels tres canals i<br />

tractant-los com si tots tres tinguessin el mateix pes, doncs aquests valors només s’utilitzen per<br />

trobar hc i hd; L’assignació de colors es farà amb cada canal per separat.<br />

Un cop tinguem el punt d’intersecció de les dues formes, podrem processar-les. Per fer-ho,<br />

provarem tots els possibles candidats. Si els valors de hc i hd trobats es troben en l’ interval<br />

[0,1], el patró serà processat, en cas contrari s’ignorarà.<br />

Hem de tenir en compte una diferència important entre els possibles patrons a B&W i a<br />

color. A blanc i negre, si teníem una línia de discontinuïtats horitzontal, sabíem que com a<br />

màxim, trobaríem dues línies verticals que formessin un patró amb ella. Això és degut a que, al<br />

tenir només dos possibles valors (blanc o negre), quan un color acaba comença l’altre; en<br />

conseqüència, existeix un únic camí possible entre discontinuïtats.<br />

A color no és així. A color podem tenir diferents línies verticals que afectin a la nostra línia<br />

horitzontal. És per això que és important poder identificar quins patrons seran vàlids i quins no.<br />

En el cas que a una mateixa línia de separació es puguin formar diferents patrons vàlids, es<br />

processarà el primer patró trobat per cada un dels possibles tipus (dos patrons Z i dos patrons<br />

U). És a dir, si una línia pot formar per exemple 3 patrons U, processarà la primera que trobi per<br />

cada tipus i configuració (una U amb forma còncava i una U amb forma convexa).<br />

Amb aquest criteri, s’eviten càlculs innecessaris alhora que s’assegura la transició suau<br />

entre formes connectades.<br />

Aquesta seria l’explicació oficial que ens proporciona l’autor en el seu article per tal<br />

d’implementar aquesta segona versió en color. Malauradament, les seves indicacions basant-se<br />

en un cas particular, que precisament és el cas idèntic a la versió en blanc i negre, no ens ha<br />

permès desxifrar quina seria la manera més adequada per fer-ho en color.<br />

Recordem el cas específic que ens proposen com exemple, dues formes Z d’igual longitud:<br />

I les equacions que hem de solucionar per tal d’obtenir els valors de hc i hd, gràcies als<br />

quals podrem establir el punt d’intersecció de les formes adjacents:<br />

(hc – r) c1 + (1 – hc + r) c2 = (hd – r) d2 + (1 – hd + r) d3<br />

hc + hd = 1<br />

Aquestes equacions són necessàries per poder obtenir els valors de hc i hd en els casos que<br />

les formes no tinguin la mateixa longitud, i per tant, el seus valors siguin diferents.


Aplicació de l’MLAA<br />

Si r és la relació que existeix entre les dues bases del trapezoide, és cert que quan hc = hd,<br />

la relació entre les bases dels dos trapezoides serà la mateixa. En canvi, no serà de la mateixa<br />

manera quan hc ≠ hd, doncs els trapezoides seran de mides diferents, per tant tindrem dues r (una<br />

per cada trapezoide) amb valors diferents.<br />

En conclusió, haurem de resoldre una equació que conté una variable a la que no podem<br />

assignar un valor, ja que no sabem a quin valor en concret fa referència. En cas de no fer-ho,<br />

obtindríem uns resultats per hc i hd en funció de r, que tampoc ens permetrien seguir amb la<br />

mecànica proposada per l’autor.<br />

Un altre punt que l’autor no específica, és si aquest càlcul el farà servir només per<br />

descartar aquells patrons que no siguin vàlids, o si farà servir aquests valors com alçada exacta<br />

de l’aresta secundària a l’hora d’assignar el color al píxel.<br />

Donat que l’objectiu d’obtenir hc i hd era minimitzar les diferències de color entre formes, i<br />

que degut a la falta d’informació, no només no podem justificar la necessitat d’aquest pas sinó<br />

que tampoc podem realitzar-lo, hem decidit passar per alt aquesta convenció en la nostra<br />

implementació. Per tant, hem continuat aplicant la regla del punt mig que, tal com veurem més<br />

endavant, ens ha permès obtenir uns resultats similars als de l’autor.<br />

7.3 Limitacions<br />

La limitació més gran de l’MLAA és la seva incapacitat per gestionar característiques de la<br />

mida d’un píxel.<br />

Un bon exemple seria el cas de la Figura 62 de la comparativa, al capítol 9, on els<br />

quadrats més pròxims a la càmera es composen de múltiples píxels, per tant, l’MLAA els<br />

processarà correctament removent les altes freqüències de la imatge. En canvi, els quadrats de la<br />

part superior no seran fàcilment identificables. En no disposar d’informació sobre la geometria,<br />

no seran processats de forma correcta.<br />

Un altre exemple de la inacció de l’MLAA per a objectes molt petits o molt prims, és el de<br />

la Figura 111 on els cables i les antenes no han rebut cap tipus de correcció significativa.<br />

Tot i tractar-se d’un defecte més subtil que els anteriors, la gestió de les vores de la imatge<br />

és altre dels problemes que presenta l’MLAA, ja que no disposem de tota la informació<br />

necessària respecte als veïns. Aquest problema és comú en aquelles tècniques que només<br />

treballen amb una mostra per píxel.<br />

Un altre problema específic de l’MLAA és produeix a les animacions, doncs l’algorisme no<br />

pot controlar els canvis temporals que pateixen els contorns dels polígons a nivell de subpíxel,<br />

ja que no disposa de la informació geomètrica de l’escena.<br />

Donat que l’MLAA només utilitza la informació de la imatge resultant, en animacions on la<br />

càmera es mogui a nivell de subpíxel (extremadament lenta), podria succeir que imatges en<br />

diferents frames continguin el mateix tipus de patrons. En aquets cas, els canvis entre frames<br />

serien imperceptibles i les transicions entre un frame i l’altre no estarien suavitzades. A la<br />

pràctica, això no és perceptible si la resolució de sortida és més gran que 200x200 píxels [1].<br />

En imatges en color, tot i que dues imatges tinguin el mateix conjunt de patrons, podria<br />

resultar en correccions diferents, doncs l’MLAA depèn del valor dels colors de la imatge.<br />

Altra conseqüència de la falta d’informació sobre la geometria, és que l’MLAA pot<br />

suavitzar alguns angles que geomètricament no requerissin aquest tipus de correcció (per<br />

exemple, angles que en realitat són molt pronunciats). Tot i això, es tracta d’un defecte molt<br />

subtil i difícil de percebre a simple vista.<br />

MLAA també presenta problemes en el processament de text, doncs no distingeix el primer<br />

pla del fons i pot resultar en la distorsió de les lletres. Aquest efecte s’amplia quan la font<br />

original ja estava suavitzada per un antialiasing:<br />

37


38<br />

Aplicació de l’MLAA<br />

Figura 26. 1a fila: font 1 amb aliasing; 2a fila: font 2 amb antialiasing; 3a fila: MLAA<br />

sobre la font 1; 4a fila: MLAA sobre la font 2. Les mides de la font d’esquerra a dreta<br />

són: 24, 12, 8 i 6.[55]<br />

Bàsicament, l’MLAA intenta corregir el contorn del text i el pot distorsionar de tal manera<br />

que sigui difícil de llegir.


8. Implementació en C++<br />

8.1 B&W<br />

8.1.1 Estructures de dades<br />

En primer lloc, descriurem les estructures de dades utilitzades per a la implementació de<br />

l’algorisme:<br />

- MyLine: classe que encapsula les dades de cada línia de discontinuïtat. Es composa de<br />

index (enter), que indica la posició de la línia en la imatge; de v1 (enter) que és el<br />

vèrtex origen i de v2 (enter) que és el vèrtex final.<br />

- MyPattern: Classe que encapsula els tres tipus de patrons possibles: L, U i Z.<br />

o MyL: classe que representa el patró L. Està format per v0, v1 i v2, enters que<br />

indiquen en quin número de línia es troba cada un dels vèrtexs; i per p i s,<br />

també enters que indiquen el número de línia de l’aresta primària i secundària<br />

respectivament.<br />

o MyU: classe que representa el patró U. Està format per v0 i v2, enters que<br />

indiquen en quin número de línia es troba cada un dels vèrtexs; i per p i s,<br />

altres enters que indiquen el número de línia de l’aresta primària i secundària<br />

respectivament.<br />

o MyZ: classe que representa el patró Z. Està format per v0 i v2, enters que<br />

indiquen en quin número de línia es troba cada un dels vèrtexs; i per p, s1 i<br />

s2, enters que indiquen el número de línia de l’aresta primària i les arestes<br />

secundàries.<br />

- MyImage: classe que encapsula les dades de la imatge amb les seves dimensions, les<br />

seves discontinuïtats, el valor dels píxels i els patrons. Es composa dels següents<br />

atributs:<br />

o x i y: enters que emmagatzemen les dimensions de la imatge.<br />

o pixels: vector de double que emmagatzema el valor dels píxels de tota la<br />

imatge.<br />

o rows: vector de vectors del tipus MyLine que emmagatzemarà les línies de<br />

discontinuïtat per cada fila. Necessitem un vector de MyLine, per<br />

emmagatzemar varies línies de discontinuïtat en una mateixa fila; i necessitem<br />

que hi hagi un d’aquests per cada una de les files de la imatge. Per aquest<br />

motiu tindrem un vector de vectors MyLine per cada imatge.<br />

o columns: el mateix tipus que rows, però orientat a les columnes de la imatge.<br />

o rL: vector del tipus MyL. Emmagatzemarà tots els patrons de tipus L que es<br />

trobin a les files de la imatge.<br />

o cL: el mateix tipus que rL, però orientat a les columnes de la imatge.<br />

o rU: vector del tipus MyU. Emmagatzemarà tots els patrons de tipus U que es<br />

trobin a les files de la imatge.<br />

o cU: el mateix tipus que rU, però orientat a les columnes de la imatge.<br />

o rZ: vector del tipus MyZ. Emmagatzemarà tots els patrons de tipus Z que es<br />

trobin a les files de la imatge.<br />

o cZ: el mateix tipus que rZ, però orientat a les columnes de la imatge.<br />

39


40<br />

8.1.2 Explicació detallada de la implementació de l’algorisme en blanc i negre<br />

Mètode principal<br />

Implementació en C++<br />

L’algorisme comença carregant una imatge en blanc i negre en format TGA. A través<br />

d’una crida al mètode read(), crearem un objecte MyImage de nom im on emmagatzemarem<br />

les dimensions de la imatge, i el valor dels seus píxels (0 o 1).<br />

Al mateix temps, creem un altre objecte MyImage, copia de l’original que anomenarem<br />

alias. Aquesta imatge és la que utilitzarem per visualitzar les zones amb aliasing que seran<br />

corregides.<br />

A continuació, es realitza una crida al mètode findDiscontinuities() que<br />

s’encarrega de trobar les discontinuïtats entre píxels de la imatge.<br />

Seguidament, el mètode identifyPattern()s’encarrega d’identificar els patrons<br />

existents a partir de les discontinuïtats trobades.<br />

Finalment, el mètode blendColors()processa els patrons detectats i assigna un color a<br />

cada un dels píxels que els composen.<br />

Per acabar, el mètode writeBW() guardarà la nova imatge corregida en format TGA.<br />

Seguidament, el mètode writeAlias()processarà l’objecte alias, pintant de color vermell<br />

aquelles zones que requereixen correcció. A continuació guardarà la imatge resultant en format<br />

TGA.<br />

Finalment, s’alliberarà la memòria i acabarà l’execució. Com a sortida de l’execució<br />

obtindrem dues imatges.<br />

La primera serà la imatge resultant d’aplicar l’MLAA. La segona serà la imatge original en<br />

blanc i negre, amb les zones que requereixen correcció marcades de color vermell.<br />

Cerca de discontinuïtats<br />

El mètode findDiscontinuities() s’encarrega de comprovar, per cada parell de<br />

píxels adjacents, si tenen el mateix color o són diferents. Aquesta cerca es realitzarà tant per<br />

files, com per columnes. Detallarem el procés de les files.<br />

Crearem un objecte MyLine, que anirem instanciant cada cop que afegim una línia nova.<br />

Els valors dels seus atributs (index, v1 i v2) estaran inicialitzats a -1. D’aquesta manera, serà<br />

possible distingir quan estem processant amb una línia nova i quan es tracta d’una línia que<br />

havíem descobert.<br />

A continuació, per cada una de les files, anirem comprovant cada un dels píxels que les<br />

composen, que correspon a cada una de les columnes de la imatge (j), si existeix alguna<br />

diferència amb el píxel de la fila anterior que es troba en la mateixa posició j. En cas de ser<br />

així, s’establirà una discontinuïtat entre els dos píxels.<br />

Haurem de controlar quan detectem una línia nova, o bé, quan una línia que estàvem<br />

processant ha arribat a la fi (a la posició j–1 hi havia una discontinuïtat que a la posició j ja no<br />

hi és).<br />

Al mateix temps que emmagatzemem les discontinuïtats al vector rows, anirem deixant<br />

constància d’aquestes diferències a l’objecte alias. Per aconseguir-ho, per cada píxel que<br />

sigui diferent al seu adjacent, posarem -1 el seu valor a la imatge alias. Per tant, a l’hora de<br />

guardar aquesta imatge pintarem de color vermell tots els píxels que estiguin a -1. D’aquesta<br />

manera tindrem les zones amb aliasing ben senyalitzades.


Implementació en C++<br />

Funció findRowDiscontinuities(im: MyImage) no retorna res;<br />

fper;<br />

Ffunció;<br />

line: MyLine;<br />

i: enter;<br />

j: enter<br />

per i:= 1 fins i< im.x fer<br />

per j:= 1 fins j< im.y fer<br />

//hem trobat una discontinuïtat<br />

si im(i,j) != im(i-1,j) llavors<br />

fper;<br />

//es tracta d’una línia que ja havíem iniciat<br />

si line->v1 != -1 llavors<br />

line->v2++;<br />

//es tracta d’una línia nova<br />

sino<br />

fsi;<br />

line->v1:= j;<br />

line->v2:= j+1;<br />

line->index:= i;<br />

//no hem trobat discontinuïtat<br />

Sino<br />

//teníem una línia que ha arribat a la fi<br />

si line->v1 != -1 llavors<br />

line->v2:= j;<br />

im.rows[i].push_back(line);<br />

fsi;<br />

fsi;<br />

//marquem la línia a corregir a alias<br />

markAlias(line,0);<br />

//es tracta d’una línia que arriba fins a la vora de la<br />

//imatge, creua la última columna<br />

si line->v1 != -1 llavors<br />

im.rows[i].push_back(line);<br />

fsi;<br />

Finalment, es repetirà tot el procés per les columnes de la imatge.<br />

Identificació de patrons<br />

El mètode identifyPattern()s’encarrega de localitzar els patrons L, U i Z existents<br />

a partir de les discontinuïtats trobades. Aquest procés també es realitzarà tant per files com per<br />

columnes. A continuació, el detall de les files.<br />

Crearem tres objectes MyL, MyU i MyZ, que anirem instanciant cada cop que trobem un<br />

patró d’aquest tipus. Els valors dels seus atributs s’aniran assignant durant tot el procés de la<br />

localització.<br />

41


42<br />

Implementació en C++<br />

Per cada una de les línies de discontinuïtat, es comprovarà en primer lloc, de quin tipus de<br />

patró es tracta. Si un dels seus extrems v1 o v2 pertany a la vora de la imatge, es tractarà d’un<br />

patró L. En cas contrari, sabrem que es tracta d’una U o una Z.<br />

Quan tinguem un patró L, identificarem si pertany a la vora esquerra de la imatge (inici) o<br />

a la dreta (final). Un cop sabem la direcció que té la L, podrem assignar valors a v0, v1 i v2.<br />

Per obtenir l’aresta primària p i la secundària s, haurem de saber la orientació de la L. Per<br />

aconseguir-ho, utilitzarem el punt v1 (que no pertany a la vora) i comprovarem, per la columna<br />

v1, si l’aresta secundària es troba en la filera superior o en la inferior. Finalment, afegirem la<br />

nova L al vector rL.<br />

En cas que el patró no sigui una L, haurem de calcular en quina direcció es troben les<br />

arestes secundàries. Ho farem de la mateixa manera que amb L, excepte que ara utilitzarem els<br />

punts v1 i v2, per obtenir les arestes secundàries s1 i s2.<br />

Un cop tinguem s1 i s2, comprovarem si són iguals. Si és així es tracta d’un patró U. En<br />

cas contrari es tractarà d’un patró Z. Emmagatzemarem els patrons als seus vectors<br />

corresponents im.rU o im.rZ.<br />

Funció identifyRowPattern(im: MyImage) no retorna res;<br />

L: MyL;<br />

U: MyU;<br />

Z: MyZ;<br />

v1: enter;<br />

v2: enter;<br />

s1: enter;<br />

s2: enter;<br />

per i:= 1 fins i< im.rows.size() fer<br />

per j:= 1 fins j< rows[i].size()fer<br />

si im.rows[i][j]!= NULL llavors<br />

v1:= im.rows[i][j]->v1; //aresta secundària 1<br />

v2:= im.rows[i][j]->v2; //aresta secundària 2<br />

//si v1 o v2 pertanyen al a vora és un patró L<br />

si esL(v1,v2) llavors<br />

//mirem a quina vora pertany la L<br />

detectaPosició();<br />

detectaOrientació();<br />

//asignem valors i creem nova L<br />

im.rL.push_back(L);<br />

sino<br />

s1:=posicioArestaSecundaria(v1);<br />

s2:=posicioArestaSecundaria(v2);<br />

si s1 == s2 llavors //és una U<br />

//asignem valors i creem nova U<br />

im.rU.push_back(U);<br />

sino<br />

//asignem valors i creem nova Z<br />

im.rZ.push_back(Z);<br />

fsi;<br />

fsi;<br />

fsi;<br />

fper;<br />

fper;<br />

Ffunció;<br />

Finalment, repetirem el procés per les columnes.


Implementació en C++<br />

Assignació de colors<br />

El mètode blendColors() és el que, finalment, assigna un nou color a cada un dels<br />

píxels que formen part d’un patró.<br />

Per a cada tipus de forma L, U i Z, es processarà primer el vector de files corresponent:<br />

im.rL, im.rU, im.rZ. A continuació es processaran les columnes amb im.cL, im.cU,<br />

im.cZ.<br />

El cas de les L és el més senzill, doncs només s’ha de processar aquella forma. En canvi,<br />

amb les U i les Z, s’hauran de dividir per la meitat per obtenir dues formes L, que són les que<br />

processarem.<br />

La única diferència rellevant entre els tres mètodes (colorL(), colorU() i<br />

colorZ()), és la gestió de la forma de les L i de la seva longitud.<br />

A colorL() només tindrem una forma L, i la seva longitud no variarà. A colorU()<br />

tindrem dues formes L simètriques entre elles; en canvi a colorZ() tindrem dues formes L<br />

oposades. Les L que hagin sorgit de patrons U o Z, tindran la meitat de la longitud del patró<br />

original.<br />

La longitud de la L que tractem és important, doncs si aquesta longitud és parell, en<br />

connectar el punt mig de l’aresta secundària amb l’extrem lliure de l’aresta primària, les cel·les<br />

quedaran dividides de forma sencera; si en canvi la longitud és senar, la última cel·la quedarà<br />

dividida en dos, la meitat per cada forma L resultant.<br />

Cada una de les cel·les quedarà dividida en forma de trapezoide, amb l’excepció de la<br />

última que tindrà forma de triangle. Això serà vàlid per a tots els patrons.<br />

Al marge d’aquestes diferències, el funcionament serà exactament el mateix: trobar la<br />

orientació i la direcció de la L que tractem, identificar la seva longitud per saber quants píxels<br />

hem de processar i, finalment, executar una sèrie de càlculs que ens permetran assignar un nou<br />

color a cada píxel.<br />

Els càlculs necessaris per trobar el nou color són la mida de les bases de cada un dels<br />

trapezoides que formen la L, i el càlcul de la seva àrea.<br />

Al començament només tenim la mida d’una de les bases del trapezoide adjacent a l’aresta<br />

secundària, que sabem que és 0,5; i la longitud de la L.<br />

Per tant, com ja havíem explicat al capítol anterior, per poder calcular les noves bases<br />

farem servir la regla de tres, amb la qual obtindrem un nou valor per cada píxel que avancem.<br />

Enlloc de calcular l’àrea de cada trapezoide que trobem a partir de les seves bases, hem<br />

optimitzat la tasca: calcularem l’àrea del supertriangle inicial, i li restarem l’àrea del triangle<br />

que es forma a partir de la cel·la següent. Guardarem aquest resultat com a “àrea anterior” i<br />

repetirem el procés fins al triangle final.<br />

Les dades necessàries per a calcular-ho d’aquesta manera són les mateixes, i ens permet no<br />

haver de diferenciar si hem de calcular l’àrea dels trapezoides o la del triangle final.<br />

L’ordre de procés de la L serà, des de la cel·la adjacent a l’aresta secundària, fins a<br />

l’extrem final de l’aresta primària, on trobem el triangle final.<br />

Cada cop que obtinguem una base nova, calcularem l’àrea del nou trapezoide, i cridarem al<br />

mètode setNewColor().<br />

43


44<br />

Funció colorL(im: MyImage) no retorna res;<br />

Index1: enter; Index2: enter; opposat: enter;<br />

area: real; areaT: real; areaNext: real;<br />

newHeight: enter; oldHeight: enter; newLength: enter;<br />

per i:= 1 fins i< im.rL.size() fer<br />

fper;<br />

Ffunció;<br />

index1:= orientacioL();<br />

index2:= direccioL();<br />

oposat:= posicioOposat();<br />

areaT:= areaSupertriangle();<br />

newLength:= longitudL -1;<br />

oldHeight:= 0.5;<br />

per j:= 0 fins j


Implementació en C++<br />

8.1.3 Decisions<br />

En la versió en blanc i negre de l’algorisme, hem hagut de prendre un parell de decisions<br />

que tenen a veure amb els resultats que ens mostra l’autor en la imatge d’exemple.<br />

Aquestes decisions estan relacionades amb les formes U de longitud un píxel, i amb la<br />

existència o no de sobreescriptura (overlap) de dades. Donat que l’autor no dona cap informació<br />

exacte al respecte, ens hem basat en la realització de diferents proves.<br />

Figura 27. Figura original amb aliasing<br />

En el cas de les U de longitud 1, si tenim en compte la figura anterior, tal i com entenem<br />

l’algorisme, considerem que el píxel II-G es veurà afectat per 4 patrons U. Dos per les files i dos<br />

per les columnes, en totes les seves possibles combinacions.<br />

Veiem que hi ha altres casos amb formes U de longitud 1: el píxel I-C i el píxel VI-G.<br />

Figura 28. Figura original amb les U de longitud 1 marcades<br />

Si tenim en compte que cada patró U es descomposará en dues formes L, donat que la<br />

longitud de l’aresta primària de la U és 1, l’aresta primària de cada L tindrà una mida de 0,5.<br />

Figura 29. Píxel II-G, on coincideixen 4 patrons U<br />

45


46<br />

Implementació en C++<br />

Un cop realitzem la connexió entre el punt mig de l’aresta secundària i l’extrem de l’aresta<br />

primària per a tots els patrons, veurem que l’únic fet destacable és que es sobreescriurà<br />

informació, ja que tot el procés es realitza sobre un sol píxel.<br />

Figura 30. Resultat obtingut per la nostra implementació de l’MLAA<br />

L’autor en canvi, processa aquesta forma de tal manera que afecta als píxels del seu<br />

voltant.<br />

Figura 31. Resultat obtingut per la implementació de l’autor<br />

Donat que no hem aconseguit desxifrar de quina manera tracta aquests píxels aïllats, ja que<br />

és tracta d’un cas excepcional que només succeeix quan tenim una U de longitud 1, i havent<br />

comprovat que el impacte visual resultant de no prendre cap mesura especial és nul, hem decidit<br />

aplicar la norma general en la que només es corregirà un píxel.<br />

Altre punt en el que hem detectat una alteració del que seria el plantejament de<br />

l’algorisme, és a l’hora de processar els patrons L que corresponen a la vora de la imatge.<br />

Estem suposant que l’autor no processa els patrons L de la vora ja que, després d’un<br />

conjunt de proves, hem detectat que les imatges resultants del nostre algorisme presenten<br />

diferències notables quan les processem.<br />

En canvi, si només processem els patrons U i L, les vores de les imatges són pràcticament<br />

idèntiques a les de l’autor.<br />

Visualment, podem comprovar que el fet de processar els patrons L pot provocar que en<br />

una imatge que mostri parcialment una silueta es corregeixi la vora de forma equivocada, doncs<br />

la imatge resultant podria suggerir que el contorn de la silueta forma part de la imatge quan en<br />

origen no era així. És a dir, podria trencar la continuïtat de la imatge, tal com passa a la primera<br />

imatge de la Figura 32.


Implementació en C++<br />

Figura 32. Comparativa de executar la nostra implementació de l’MLAA i la de l’autor.<br />

Podem veure que la segona i tercera columna d’imatges tracten la vora de la mateixa<br />

manera (sense processar les L). En canvi la primera, tot i que dona millor resultat en la zona<br />

ressaltada en vermell, processa la vora de la resta de la imatge creant una diferència respecte a la<br />

imatge original: dona a entendre que la silueta està mostrant part del seu contorn en la part<br />

esquerra de la imatge.<br />

Entenem que d’aquesta manera no només s’està corregint l’aliasing si no que s’estan<br />

produint canvis rellevants. Donat que considerem que alterar la continuïtat de la imatge és més<br />

perceptible a l’ull humà que l’aliasing que es produeix a les vores, en la nostra implementació<br />

de l’algorisme per a blanc i negre tampoc processarem els patrons L.<br />

8.2 Color<br />

8.2.1 Estructures de dades<br />

Les estructures utilitzades en la versió en color de l’algorisme són molt similars a les que<br />

s’utilitzen en blanc i negre, amb alguna petita diferència. Les classes MyLine i MyPattern,<br />

són exactament les mateixes. En canvi tindrem dues noves classes:<br />

- RGB: és una classe que encapsula els tres enters r, g i b. Aquestes variables guardaran<br />

el valor de cada un dels canals d’un píxel en RGB.<br />

- MyCImage: és una variant de la classe MyImage. La única diferència que hi ha entre<br />

les dues classes es troba en l’atribut pixels:<br />

o pixels: és un vector del tipus RGB. Contindrà el valor de cada un dels píxels<br />

de la imatge en color (RGB).<br />

47


48<br />

o x i y: enters.<br />

o rows: vector de vectors del tipus MyLine.<br />

o columns: vector de vectors del tipus MyLine.<br />

o rL: vector del tipus MyL.<br />

o cL: : vector del tipus MyL.<br />

o rU: vector del tipus MyU.<br />

o cU: vector del tipus MyU.<br />

o rZ: vector del tipus MyZ.<br />

o cZ: vector del tipus MyZ.<br />

- MyLine: classe que encapsula a index (enter), v1 (enter) i v2 (enter).<br />

Implementació en C++<br />

- MyPattern: Classe que encapsula els tres tipus de patrons possibles: L, U i Z.<br />

o MyL: classe que representa el patró L, formada per v0, v1, v2, p i s (enters).<br />

o MyU: classe que representa el patró U, formada per v0, v2, p i s (enters).<br />

o MyZ: classe que representa el patró Z, formada per v0, v1, v2, p, s1 i s2<br />

(enters).<br />

8.2.2 Explicació detallada de la implementació de l’algorisme en color<br />

Mètode principal<br />

L’algorisme comença carregant una imatge en color en format TGA. Crearem 4 objectes<br />

MyCIMage, de nom im, im2, im3 i alias. En aquests objectes, mitjançant el mètode<br />

read(), emmagatzemarem les dimensions de la imatge i el valor del seus píxels per cada un<br />

dels canals RGB.<br />

La imatge im és la imatge original sobre la que processarem tots els passos de l’algorisme.<br />

Les imatges im2 i im3 s’utilitzaran per no sobreescriure dades quan assignem colors als píxels.<br />

La imatge alias, tal com es feia a la versió en blanc i negre, s’utilitzarà per visualitzar<br />

les zones amb aliasing que seran corregides.<br />

A continuació, es realitza una crida al mètode convertBW() que transformarà la imatge<br />

en color alias, a una imatge en blanc i negre. D’aquesta manera, farem ressaltar les zones<br />

d’aliasing en color vermell sense que hi hagi cap interferència amb els colors reals de la imatge.<br />

La resta de procés en el mètode principal és la mateixa que per la versió B&W: es crida al<br />

mètode findDiscontinuities() per tal de trobar les discontinuïtats entre píxels de la<br />

imatge; es realitza la crida al mètode identifyPattern() que identificarà els patrons<br />

existents a partir de les discontinuïtats trobades; i finalment, es cridarà al mètode<br />

blendColors() que processarà els patrons detectats i assignarà un color a cada un dels<br />

píxels que els composen.<br />

Per acabar, el mètode writeBW() guardarà la nova imatge corregida i el mètode<br />

writeAlias()processarà l’objecte alias, pintant de color vermell aquelles zones que<br />

requereixen correcció. Ambdues imatges es guardaran en format TGA. S’alliberarà memòria i<br />

acabarà l’execució donant com a resultat la imatge corregida i la imatge en blanc i negre que<br />

mostra les zones amb aliasing de color vermell.


Implementació en C++<br />

Cerca de discontinuïtats<br />

El mètode findDiscontinuities() és exactament el mateix que hem utilitzat a la<br />

versió en blanc i negre, amb una petita diferència: la forma com comparem colors.<br />

En aquesta part, l’autor ens proposa agafar els 4 bits més significatius de cada canal RGB,<br />

i comparar-los. En cas d’existir alguna diferència per qualsevol dels canals es considerarà que<br />

són colors diferents. En cas contrari, són iguals.<br />

Com havíem avançat, en la implementació en color hem hagut d’introduir alguns canvis<br />

per tal d’obtenir un resultat satisfactori. El primer canvi s’ha produït en aquest pas.<br />

La forma amb que l’autor selecciona quins colors són diferents i quins no, ha resultat molt<br />

problemàtica per la nostra implementació.<br />

Suposem dos colors RGB:<br />

Figura 33. Exemple de colors numèricament diferents<br />

Els canals G i B són idèntics. Però els canals R tenen la següent codificació binària:<br />

01110000 i 01101111.<br />

Si tenim en compte els 4 bits més significatius, segons el mètode proposat per l’autor, els<br />

haurem de tractar com a colors diferents: 0111 i 0110.<br />

Per tant, tot i tractant-se d’una diferència d’una unitat en un canal, diferència que no és<br />

perceptible per l’ull humà, aquest mètode la detectarà i marcarà una discontinuïtat entre els dos<br />

colors.<br />

Uns quants píxels aïllats on s’estableixin discontinuïtats que no són significatives (com<br />

l’exemple), no representaria cap problema, doncs reassignar colors en aquella zona no<br />

provocarà canvis significatius.<br />

El problema es produeix quan aquests colors “diferents” es troben en zones on realment<br />

s’està produint aliasing. Si aquestes diferències subtils es barregen amb diferències reals,<br />

s’estaran creant patrons que no es corresponen a la realitat de la imatge, doncs a l’hora d’escollir<br />

quines línies formen cert patró no es distingiran unes discontinuïtats de les altres: per<br />

l’algorisme totes les diferències són iguals d’importants.<br />

El resultat de processar una imatge d’aquesta manera pot produir que algunes zones amb<br />

aliasing es quedin sense corregir, ja que s’estarà corregint altra zona que, degut als canvis de<br />

color tan subtils, no serem capaços d’apreciar.<br />

Per tant, donat que aquest mètode no ens pot garantir un bon resultat en tots els casos,<br />

l’hem descartat i hem optat un altre molt més efectiu: el càlcul de la distància euclidiana.<br />

49


50<br />

Implementació en C++<br />

El càlcul de la distància euclidiana, ens permetrà especificar un llindar a partir del qual<br />

establirem quan considerem que dos píxels són diferents. La distància euclidiana es calcula amb<br />

la següent expressió:<br />

Per tant, quan la distància sigui més gran que el llindar, es considerarà que són colors<br />

diferents. En cas contrari, seran colors iguals.<br />

El valor del llindar s’ha escollit analitzant els resultats obtinguts amb diferents imatges. Per<br />

exemple:<br />

Error quadràtic mitjà (MSE) 2xMSAA 4xMSAA 8xMSAA<br />

Llindar = 40 50.4224 34.6535 62.3057<br />

Llindar = 60 45.0752 28.4326 56.4061<br />

Llindar = 65 44.6881 28.1375 56.0789<br />

Llindar = 70 44.718 28.1334 56.0535<br />

Llindar = 75 44.7821 28.2095 56.1653<br />

Llindar = 80 44.7705 28.2264 56.1832<br />

Llindar = 100 45.0839 28.6263 56.6313<br />

Figura 34. MSE de la imatge en escala de grisos de la Figura 77, per a diferents llindars<br />

Per a imatges en escala de grisos s’utilitzarà un llindar de 70.<br />

En canvi, per a les imatges en color ens hem basat en la qualitat de la imatge que<br />

percebem, doncs hem comprovat que el valor de l’error no sempre acompanya a la qualitat de la<br />

imatge resultant. En aquest cas l’error pateix petites variacions per cada un dels canals, però són<br />

tots valors molt similars:<br />

Error quadràtic mitjà (MSE) Autor<br />

R G B<br />

Llindar = 40 49.9683 29.2705 8.51368<br />

Llindar = 50 52.249 30.7255 8.71822<br />

Llindar = 60 51.4641 30.216 8.53027<br />

Llindar = 70 54.1101 31.8242 8.87037<br />

Llindar = 80 54.7732 32.3782 8.99488<br />

Llindar = 90 57.7813 34.3805 9.55004<br />

Figura 35. MSE de la imatge en color de la Figura 116, per a diferents llindars<br />

Per a imatges en color s’utilitzarà un valor de 80.<br />

Identificació de patrons<br />

El mètode identifyPattern() d’aquesta versió en color, és una ampliació del que ja<br />

teníem en blanc i negre. La diferència principal entre ambdós mètodes, és que en B&W<br />

sabíem que quan teníem una aresta primària i buscàvem la secundària, només trobaríem<br />

una per formar un sol patró. En aquest cas, ja no és així.<br />

Al color podrem tenir diferents línies verticals que facin d’aresta secundària, de manera<br />

que tinguem diferents patrons per aquella aresta primària.<br />

En aquest punt, tenim la següent diferència significativa de la nostra implementació amb la<br />

de l’autor. Com ja havíem dit, l’autor proposa una sèrie de càlculs que, per la manca


Implementació en C++<br />

d’informació, no és possible dur a terme. Per tant, com no hem trobat cap argument en contra, a<br />

l’hora de connectar les arestes primàries amb les secundàries, utilitzarem el punt mig de les<br />

secundàries, tal i com hem fet en B&W.<br />

En aquesta implementació, no descartarem patrons en sí, però sí que escollirem aquells de<br />

longitud més gran. A partir d’una línia de discontinuïtat, buscarem totes les arestes secundàries<br />

possibles que siguin perpendiculars als seus extrems.<br />

Per tant, si tenim un línia de discontinuïtat que entremig té arestes secundàries, no es<br />

tindran en compte, doncs estarem creant un patró més gran que ja inclou aquells píxels.<br />

Quan es processin els patrons de forma vertical (si estàvem mirant les files, per exemple),<br />

es processaran els píxels de l’aresta secundària que havíem trobat i afectaran als mateixos píxels<br />

del patró que hem decidit no crear.<br />

En aquest pas també ens hem diferenciat de l’autor que fa una proposta més arbitrària:<br />

processar el primer patró trobat per cada un dels possibles tipus (dos patrons Z i dos patrons U).<br />

Cal afegir, que abans d’establir aquest mètode s’han realitzat altres proves que no han<br />

donat un resultat tan bo. Una d’elles era processar el patró més llarg de tots els tipus possibles<br />

(dos Z i dos U), que a diferència del mètode actual, podien tenir diferent mida els uns dels<br />

altres: s’escollia la U còncava de més longitud, etc. El resultat obtingut però, no va ser de la<br />

qualitat esperada.<br />

Altre mètode va ser processar absolutament tots els patrons trobats, el resultat va ser pobre<br />

tant per qualitat com per rendiment.<br />

Per tant, a la vista dels resultats obtinguts, considerem que la nostra opció és la més<br />

adequada.<br />

D’aquesta manera, la diferència principal del mètode identifyPattern() en B&W<br />

amb l’actual, és la possibilitat de crear múltiples patrons alhora.<br />

Quan detectem la orientació del patró, comprovarem quantes arestes secundàries tenim. En<br />

cas de tenir dos, mirarem quans patrons possibles podem obtenir i els crearem.<br />

Ara no diferenciarem de la mateixa manera el tipus de patró que construirem. Mirarem si<br />

és una L o si serà un patró compost (U o Z). En cas de ser una L, comprovarem si és una o seran<br />

dues. En cas de ser un patró compost, mirarem quantes arestes secundàries tenim i quines<br />

combinacions podem fer.<br />

Per exemple, a la Figura 36, el primer cas és una aresta primària amb una secundària amb<br />

cada extrem que forma una U.<br />

El segon mostra el cas en que, en un extrem hem trobat una aresta secundària i en l’altre<br />

hem trobat dos, per tant haurem de crear els patrons possibles amb totes aquestes arestes: un<br />

patró U i un patró Z.<br />

El tercer exemple és el més elaborat, doncs hem trobat dos arestes secundàries a cada<br />

extrem, per tant, tindrem tots els patrons possibles: dos patrons U i dos patrons Z.<br />

L’últim cas, és un altre exemple senzill, on només tenim una aresta secundària per cada<br />

extrem, i per tant, tindrem un patró Z.<br />

51


52<br />

Implementació en C++<br />

Figura 36. Exemple de procés de formes a partir de les arestes obtingudes<br />

Un cop més, repetirem el procés tant per files com per columnes.<br />

Assignació de colors<br />

L’assignació de colors es realitzarà amb el mètode setNewColor()que serà el mateix<br />

que a la versió blanc i negre, però calculant cada canal RGB per separat.<br />

Funció setNewRowColor(im: MyImage, i: enter, j: enter, area: float,<br />

opposite: enter) no retorna res;<br />

Ffunció;<br />

newColor: enter;<br />

oldColor: enter;<br />

oppColor: enter;<br />

oldColor:= im(i,j).r;<br />

oppColor:= im(i,opposite).r;<br />

newColor:= (1 - area) * oldColor + area * oppColor;<br />

im(i,j).r:= newColor;<br />

oldColor:= im(i,j).g;<br />

oppColor:= im(i,opposite).g;<br />

newColor:= (1 - area) * oldColor + area * oppColor;<br />

im(i,j).g:= newColor;<br />

oldColor:= im(i,j).b;<br />

oppColor:= im(i,opposite).b;<br />

newColor:= (1 - area) * oldColor + area * oppColor;<br />

im(i,j).b:= newColor;


Implementació en C++<br />

8.3 Codi per comparar<br />

Per tal de comparar els resultats obtinguts en la nostra implementació amb d’altres<br />

imatges, hem creat un petit programa que s’encarrega de calcular la imatge diferència i l’error<br />

quadràtic mig (MSE).<br />

D’aquesta manera, podrem comprovar quin grau de correcció té el nostre algorisme<br />

respecte a d’altres tan de forma visual com de forma numèrica.<br />

La imatge diferència és un càlcul senzill, doncs només cal restar el valor dels píxels d’una<br />

imatge respecte a l’altre. L’únic requeriment és que ambdues imatges tinguin la mateixa mida.<br />

L’error quadràtic mesura la quantitat de diferència que té en una imatge respecte a una<br />

altra. És calcula de la següent manera:<br />

Figura 37. Expressió per calcular l’MSE (Mean Square Error) [8]<br />

On N és el número total de píxels de la imatge.<br />

53


9. Comparativa de resultats<br />

A continuació, presentarem una sèrie d’imatges a les quals hem aplicat l’MLAA. Algunes<br />

de les imatges s’han comparat amb l’SSAA i altres amb l’MSAA. El procés en tots els casos és el<br />

mateix: partim d’una imatge amb aliasing (NAA – no antialiasing), la corregim amb l’MLAA i<br />

comparem la imatge resultant amb la millor imatge de l’antialiasing corresponent (MSAA o<br />

SSAA).<br />

Aquesta comparativa ens donarà el valor de l’error quadràtic mitjà i una imatge diferència.<br />

A efectes de poder reconèixer les zones on s’ha aplicat la correcció, hem invertit la imatge<br />

diferència i posteriorment, l’hem multiplicat fins a fer-la visible. D’aquesta manera es pot tenir<br />

una visió detallada de totes les zones de la imatge que presentin alguna diferència respecte a<br />

l’altra, independentment del grau d’aquesta.<br />

Cal destacar, que en el càlcul de l’error quadràtic mitjà, hem afegit el càlcul de l’error per<br />

la imatge resultant de la implementació de l’autor amb l’antialiasing de més alta qualitat<br />

(8xMSAA o 16xSSAA). D’aquesta manera, confirmem que els resultats obtinguts en les nostres<br />

proves no es veuen afectats per les diferències entre la nostra implementació i la de l’autor, ja<br />

que s’obtenen valors molts similars. S’analitzarà amb més detall en l’apartat 9.13.<br />

Per tal de realitzar la comparativa, diferenciarem els resultats obtinguts amb l’algorisme<br />

per a imatges en blanc i negre dels de les imatges en color. Les hem classificat de la següent<br />

manera:<br />

- B&W:<br />

- Color:<br />

o Siluetes en blanc i negre:<br />

Flors<br />

Nena<br />

o Patrons de freqüència variable<br />

o Potrace<br />

o Escàner<br />

Cercles<br />

Checker 1<br />

Checker 2<br />

o Imatges creades amb un exemple de DirectX<br />

o Imatges en Maya<br />

o Imatges del Half-Life 2<br />

Imatge 1<br />

Imatge 2<br />

Imatge 3<br />

Finalment, compararem algunes imatges resultants de la nostra implementació de l’MLAA<br />

amb les resultants de la demo de l’autor. D’aquesta manera, apreciarem el grau d’equivalència<br />

entre unes i altres.<br />

En aquest cas, utilitzarem dues imatges:<br />

- Color: imatge de la Fada (exemple de l’article original).<br />

- B&W: silueta de la nena.<br />

- Imatge 1 del Half-Life 2.<br />

55


56<br />

9.1 Siluetes en blanc i negre: flors<br />

Comparativa de resultats<br />

A la Figura 38 tenim la silueta en blanc i negre d’unes flors sobre una petita superfície.<br />

Aquesta escena ha estat renderitzada amb Maya amb un supersampling de 4 i 16 mostres per<br />

píxel. La resolució de la imatge és 220x220, i és una escena totalment en blanc i negre.<br />

Comprovem que l’MLAA detecta tot el contorn de la silueta com a zona a corregir.<br />

A la Figura 39, en comparar el 4xSSAA amb l’MLAA veiem que, a simple vista, l’MLAA<br />

produeix un contorn igual de suavitzat que el 4xSSAA però més definit, ja que el contorn del<br />

supersampling està força emborronat. Es pot veure amb més detall en Figura 41.<br />

També podem apreciar algunes zones, com la part superior de la muntanya, que l’MLAA<br />

ha corregit correctament i el supersampling de 4x no. Podem observar-ho amb més detall en la<br />

Figura 42.<br />

Tot i que l’MLAA proporcioni (a simple vista) una imatge de millor qualitat mantenint la<br />

definició de la silueta i eliminant la majoria de l’aliasing, fins i tot quan el 4xSSAA no ho fa, el<br />

fet que el seu contorn no es trobi tan difuminat produeix que, numèricament, l’MSE de l’MLAA<br />

sigui superior al del 4xSSAA (Taula 1.<br />

A la Figura 40 en canvi, en comparar l’MLAA amb el 16xSSAA, comprovem que ara el<br />

resultat del supersampling ens mostra un contorn igual de difuminat que el 4x però molt més<br />

suavitzat, doncs han desaparegut els últims jaggies que restaven de la imatge original.<br />

L’error quadràtic mitjà de la Taula 1. ens indica la diferència entre les diferents imatges.<br />

Podem comprovar-ho visualment a les imatges de la Figura 39 i la Figura 40.<br />

MSE NAA - 4xSSAA - MLAA - Autor -<br />

16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />

B&W 384.244 3.42862 217.865 211.745<br />

Taula 1. Error quadràtic mitjà (MSE) de la silueta B&W de les flors<br />

Per tant, la relació de l’error entre les diferents imatges és:<br />

MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />

D’aquí podem extreure que l’MSE de l’MLAA és superior al 4xSSAA, tot i que de forma<br />

visual siguin imatges equivalents: ambdues presenten avantatges respecte a l’altra.


Comparativa de resultats<br />

9.1.1 NAA i MLAA<br />

Figura 38. Silueta B&W: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a<br />

corregir; 3 - Imatge resultant de la correcció amb l’MLAA.<br />

57


58<br />

9.1.2 4xMSAA<br />

Comparativa de resultats<br />

Figura 39. Silueta B&W: 1 - Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 -<br />

Imatge diferència entre el 4xSSAA i el 16xSSAA.


Comparativa de resultats<br />

9.1.3 16xSSAA<br />

Figura 40. Silueta B&W: 1 - Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 -<br />

Imatge diferència entre l’MLAA i el 16xSSAA.<br />

59


60<br />

9.1.4 Zoom<br />

Figura 41. Zoom d’una zona de la silueta<br />

Figura 42. Zoom d’una zona de la silueta<br />

Comparativa de resultats


Comparativa de resultats<br />

9.2 Siluetes en blanc i negre: nena<br />

A la Figura 43 tenim la silueta en blanc i negre d’una nena [3]. L’original d’aquesta<br />

escena és un jpeg amb alguns artifacts, però disposem de la versió binària amb aliasing que ens<br />

ha permès realitzar la comparativa.<br />

A la Figura 44 comprovem que l’MLAA detecta tot el contorn de la silueta com a zona a<br />

corregir. A la Figura 45 podem comprovar a simple vista que la correcció de l’aliasing és bona.<br />

Si comparem el resultat de l’MLAA (Figura 45) amb l’original (Figura 46), la diferència<br />

més notable la trobem en que l’MLAA ha suavitzat el contorn de manera que algunes<br />

irregularitats de la imatge original han desaparegut (Figura 50). L’error entre aquestes imatges<br />

és de 51.8372.<br />

Quan comparem l’MLAA amb la imatge amb blur (Figura 47), comprovem que la<br />

correcció d’aliasing del blur no és suficient per suavitzar el contorn de la silueta. Per tant, el<br />

resultat de l’MLAA en contrast amb aquesta imatge és molt superior (Figura 51). L’MSE entre<br />

aquestes imatges és de 78.7343.<br />

Càlcul de l’error quadràtic mitjà:<br />

MSE Original Blur<br />

MLAA 51.8372 78.7343<br />

Taula 2. Error quadràtic mitjà (MSE) de la silueta B&W de la nena<br />

61


62<br />

Figura 43. Silueta B&W amb aliasing.<br />

Comparativa de resultats


Comparativa de resultats<br />

Figura 44. Imatge de la silueta B&W ressaltant les zones que requereixen correcció.<br />

63


64<br />

Figura 45. Imatge de la silueta B&W després d’aplicar l’MLAA.<br />

Comparativa de resultats


Comparativa de resultats<br />

Figura 46. Imatge original de la silueta B&W de la nena.<br />

65


66<br />

Figura 47. Silueta B&W a la que li han aplicat un blur.<br />

Comparativa de resultats


Comparativa de resultats<br />

Figura 48. Imatge diferència entre les imatges de la Figura 45 i de la Figura 47<br />

Figura 49. Imatge diferència entre les imatges de la Figura 45 i la de la Figura 47<br />

67


68<br />

9.2.1 Zoom<br />

Figura 50. Zoom de la silueta<br />

Figura 51. Zoom de la silueta<br />

Comparativa de resultats


Comparativa de resultats<br />

9.3 Patrons de freqüència variable<br />

Els patrons de freqüència variable són l’exemple concret que comentàvem al capítol 7.3,<br />

quan fèiem referència a la incapacitat de l’MLAA a l’hora de gestionar característiques de la<br />

mida d’un píxel.<br />

En aquest cas tenim tres exemples diferents: una imatge de cercles concèntrics (Figura 52)<br />

i dues taules d’escacs amb diferent perspectiva i proporcions, checker 1 (Figura 62) i checker 2<br />

(Figura 66).<br />

Com havíem avançat, els cercles o els quadrats més pròxims a la càmera disposen de molts<br />

píxels a partir dels quals l’MLAA obtindrà la informació necessària per corregir la imatge.<br />

Podem observar-ho en detall a Figura 60, Figura 65 i Figura 69.<br />

En canvi, en la zona de la imatge que es troba més lluny de la càmera (zona superior), no<br />

és possible identificar els píxels que formen part de cada objecte. Com l’MLAA només disposa<br />

de la informació de pantalla i no pot accedir a la informació geomètrica, intentarà reconstruir<br />

aquesta zona de la imatge de forma incorrecta. Es pot observar amb detall en la Figura 61, la<br />

Figura 65 i la Figura 69.<br />

En els tres casos, la correcció de l’MLAA té similituds amb la del 4xSSAA, tot i que per les<br />

zones més conflictives la qualitat de l’MLAA és molt pitjor. Això es pot comprovar sobretot a la<br />

Figura 63 i a la Figura 67.<br />

En comparació amb el 16xSSAA, la qualitat de l’MLAA és realment baixa. Es fa evident a<br />

la Figura 58, la Figura 64 i la Figura 68.<br />

Podem comprovar-ho numèricament mitjançant el càlcul de l’error quadràtic mitjà:<br />

MSE NAA - 4xSSAA - MLAA - Autor -<br />

16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />

Cercles 1202.81 156.224 295.429 293.252<br />

Checker 1 3196.67 57.6541 2625.97 2419.39<br />

Checker 2 4010.79 77.1382 3347.32 3265.29<br />

Taula 3. Error quadràtic mitjà (MSE) per tots els patrons<br />

Tal com podem veure en el càlcul de l’MSE, l’MLAA es troba per sota de la qualitat del<br />

4xSSAA per aquest tipus de patrons:<br />

MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />

Podem comprovar-ho visualment a les imatges diferència de: la ¡Error! No se encuentra<br />

el origen de la referencia., la Figura 57 i la Figura 59 per als cercles; la Figura 63 i la Figura<br />

64 per al checker1; i la Figura 67 i la Figura 68 per al checker2.<br />

69


70<br />

9.3.1 Cercles<br />

NAA i MLAA<br />

Figura 52. Cercles amb aliasing<br />

Figura 53. Imatge resultant de la correcció amb l’MLAA<br />

Comparativa de resultats


Comparativa de resultats<br />

Figura 54. Imatge que destaca les zones que requereixen correcció<br />

Figura 55. Imatge diferència entre la imatge amb aliasing i la del 16xSSAA<br />

71


72<br />

4xSSAA<br />

Figura 56. Imatge resultant de la correcció amb el 4xSSAA<br />

Comparativa de resultats<br />

Figura 57. Imatge diferència entre el resultat del 4xSSAA i del 16xSSAA


Comparativa de resultats<br />

16XSSAA<br />

Figura 58. Imatge resultant de la correcció amb el 16xSSAA<br />

Figura 59. Imatge diferència entre el resultat de l’MLAA i del 16xSSAA<br />

73


74<br />

Zoom<br />

Figura 60. Zoom del patró dels cercles<br />

Figura 61. Zoom del patró dels cercles<br />

Comparativa de resultats


Comparativa de resultats<br />

9.4 Checker 1<br />

Figura 62. Checker 1: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a corregir;<br />

3 -Imatge resultant de la correcció amb l’MLAA.<br />

75


76<br />

4xSSAA<br />

Comparativa de resultats<br />

Figura 63. Checker 1: 1- Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />

diferència entre el 4xSSAA i el 16xSSAA.


Comparativa de resultats<br />

16XSSAA<br />

Figura 64. Checker 1: 1- Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />

diferència entre l’MLAA i el 16xSSAA<br />

77


78<br />

Zoom<br />

Figura 65. Zoom del patró checker 1<br />

Comparativa de resultats


Comparativa de resultats<br />

9.5 Checker 2<br />

Figura 66. Checker 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a corregir;<br />

3 -Imatge resultant de la correcció amb l’MLAA.<br />

79


80<br />

4xSSAA<br />

Comparativa de resultats<br />

Figura 67. Checker 2: 1- Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />

diferència entre el 4xSSAA i el 16xSSAA


Comparativa de resultats<br />

16XSSAA<br />

Figura 68. Checker 2: 1- Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />

diferència entre l’MLAA i el 16xSSAA<br />

81


82<br />

Zoom<br />

Figura 69. Zoom del patró de checker 2<br />

Comparativa de resultats


Comparativa de resultats<br />

9.6 Potrace<br />

Potrace és una utilitat per transformar imatges binàries en imatges vectorials. D’aquesta<br />

manera, es pot obtenir, a partir d’una imatge amb aliasing, una de suavitzada sense cap tipus<br />

d’alteració.<br />

Hem volgut comprovar l’efecte de corregir la imatge binària amb l’MLAA per tal de<br />

comparar-la amb la imatge vectorial que s’obté amb Potrace.<br />

Figura 70. Esquerra: imatge amb aliasing; Dreta: imatge vectorial resultant de Potrace[9]<br />

Figura 71. Esquerra: imatge que destaca les zones amb aliasing. Dreta: imatge corregida<br />

per l’MLAA<br />

83


84<br />

Comparativa de resultats<br />

Figura 72. Esquerra: imatge diferència entre l’obtinguda per Potrace i l’obtinguda per<br />

l’MLAA; Dreta: zoom d’una zona de la imatge<br />

Si tenim en compte la qualitat de la imatge binària, comprovarem que la correcció que<br />

realitza l’MLAA és adequada, doncs la imatge original no disposa de molta informació (Figura<br />

71).<br />

En canvi, quan comparem la resultant per l’MLAA amb l’obtinguda per Potrace (Figura<br />

70), comprovem que l’MLAA proporciona una imatge de molt baixa qualitat en vers a<br />

l’altíssima qualitat de la imatge vectorial de Potrace. L’MSE entre ambdues imatges és de<br />

1491.19.<br />

Concretament, en la Figura 71 podem detectar la principal limitació de l’MLAA:<br />

problemes amb els objectes prims. Tot la silueta en sí és un objecte prim on, en algunes zones,<br />

l’amplada del contorn pot arribar a tenir un píxel de mida.<br />

Entenem que els mètodes per obtenir les dues imatges són completament diferents, i que<br />

mentre que l’MLAA pot intentar reconstruir el contorn de la imatge, Potrace està especialitzat en<br />

suavitzar aquest tipus d’imatges.


Comparativa de resultats<br />

9.7 Escàner<br />

Un bon exemple d’aliasing en blanc i negre és un escaneig a baixa resolució. Aquest tipus<br />

d’escaneig produirà una imatge amb dents de serra i línies trencades. Hem volgut comprovar<br />

l’efecte d’aplicar l’MLAA sobre un escaneig a 75 PPP comparant-lo amb un de 600ppp.<br />

Figura 73. Esquerra: escàner a 75 PPP; dreta: escàner a 600ppp [10]<br />

Figura 74. Esquerra: zones amb aliasing; dreta: imatge resultant d’ l’MLAA<br />

Figura 75. Imatges diferència: NAA - MLAA (esquerra) i escàner de 600 PPP - MLAA<br />

85


86<br />

Comparativa de resultats<br />

Hem comprovat que, tot i que la falta d’informació no ens permet recuperar totes les<br />

formes originals, es produeix un augment de resolució força significatiu. L’error quadràtic mitjà<br />

entre l’MLAA i l’escaneig de 75ppp és de 1438.44; amb el de 600ppp és de 11918.6.<br />

Atribuïm aquets valors tan grans a que, en imatges en blanc i negre, dos píxels diferents<br />

tenen un valor de diferència de 255 (0 negre i 255 blanc). Això dispara l’error de forma<br />

considerable


Comparativa de resultats<br />

9.8 DirectX<br />

Amb una aplicació d’exemple de DirectX, hem pogut modificar la configuració de la<br />

nostra tarja gràfica (GeForce GT 330M) per poder mostrar el model 3d proposat amb diferents<br />

tipus de multisampling: 2x, 4x i 8x.<br />

Si observem la Figura 76 i la Figura 77, podem destacar que a simple vista l’MLAA ha<br />

corregit la majoria de defectes de la imatge. Tot i això, podríem seleccionar algunes zones on<br />

encara queden artifacts després de la correcció, com per exemple al zoom superior de la Figura<br />

79.<br />

En el cas de la Figura 80, on l’antialiasing utilitzat és un 2xMultisampling, podem<br />

comprovar que l’aliasing segueix completament visible a la imatge. Només s’ha suavitzat<br />

breument respecte a la imatge de la Figura 76. Per tant, podem afirmar que la qualitat de<br />

l’MLAA en imatges d’aquest tipus, és superior que el 2xMSAA.<br />

No és possible però, realitzar aquesta mateixa afirmació per les imatges a la Figura 84 i a<br />

la Figura 85, doncs a simple vista resulten molt similars. Si observem amb atenció, veurem que<br />

la imatge del 4xMSAA manté unes irregularitats de forma constant, mentre que l’MLAA presenta<br />

la majoria de zones amb una correcció completa i d’altres amb irregularitats que pràcticament<br />

no han rebut correcció. Es pot apreciar en detall en el zoom de la Figura 87.<br />

És per això que en aquest cas no és possible identificar, a simple vista, el nivell de qualitat<br />

de l’MLAA respecte al 4xMSAA. Si analitzarem els valors de l’MSE a la Taula 4. comprovarem<br />

que la quantitat d’error de l’MLAA es troba entre el 2xMSAA i el 4xMSAA. Això coincideix amb<br />

el fet que, tot i que ambdues imatges conservin aliasing, la superfície del 4xMSAA és més<br />

homogènia en la correcció que l’MLAA.<br />

El cas oposat el trobem per la Figura 88, on l’aliasing és pràcticament imperceptible, i<br />

entra en contrast amb la imatge resultant de l’MLAA on encara es poden identificar jaggies. Al<br />

zoom de la Figura 91 es pot veure com la imatge del 8xMSAA té un contorn més difuminat i de<br />

forma més regular que el de la imatge de l’MLAA. En aquest cas, no hi ha cap dubte que la<br />

qualitat del 8xMSAA és superior.<br />

Numèricament, podem confirmar aquests resultats mitjançant el càlcul de l’error quadràtic<br />

mitjà:<br />

MSE NAA – 2xMSAA - 4xMSAA - MLAA - Autor -<br />

8xMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />

R 128.551 67.3414 43.3295 55.7158 51.8903<br />

G 128.551 67.3414 43.3295 55.7158 51.8903<br />

B 128.551 67.3414 43.3295 55.7158 51.8903<br />

Taula 4. Error quadràtic mitjà (MSE) de l’exemple de DirectX<br />

D’aquesta taula podem deduir que la qualitat de l’MLAA en aquest tipus d’imatges es troba<br />

entre el 2xMSAA i el 4xMSAA:<br />

MSE(NAA - 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) > MSE(MLAA – 8xMSAA) ><br />

> MSE (4xMSAA – 8xMSAA)<br />

Podem comprovar visualment l’MSE a les imatges diferència de la Figura 82, la Figura 86 i la Figura<br />

90.<br />

87


88<br />

9.8.1 NAA i MLAA<br />

Figura 76. Imatge del model amb aliasing<br />

Comparativa de resultats<br />

Figura 77. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing


Comparativa de resultats<br />

Figura 78. Zones de la imatge amb aliasing que han de ser corregides<br />

Figura 79. Zoom d’algunes zones de les imatges de la Figura 76 i de la Figura 77<br />

89


90<br />

9.8.2 2xMSAA<br />

Figura 80. Imatge corregida pel 2xMultisampling<br />

Comparativa de resultats<br />

Figura 81. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing


Comparativa de resultats<br />

Figura 82. Imatge diferència entre el 2xMSAA i el 8xMSAA<br />

Figura 83. Zoom d’algunes zones de les imatges de la Figura 80 i la de la Figura 81<br />

91


92<br />

9.8.3 4xMSAA<br />

Figura 84. Imatge corregida pel 4xMultisampling<br />

Comparativa de resultats<br />

Figura 85. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing


Comparativa de resultats<br />

Figura 86. Imatge diferència entre el 4xMSAA i el 8xMSAA<br />

Figura 87. Zoom d’algunes zones de les imatges de la Figura 84 i la de la Figura 85<br />

93


94<br />

9.8.4 8xMSAA<br />

Figura 88. Imatge corregida pel 8xMultisampling<br />

Comparativa de resultats<br />

Figura 89. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing


Comparativa de resultats<br />

Figura 90. Imatge diferència entre l’MLAA i el 8xMSAA<br />

Figura 91. Zoom d’algunes zones de les imatges de la Figura 88 i la de la Figura 89<br />

95


96<br />

9.9 Maya<br />

Comparativa de resultats<br />

A la Figura 92 tenim l’escena renderitzada sense cap antialiasing activat. Com podem<br />

veure, l’MLAA detecta el contorn dels objectes de l’escena com a zones amb aliasing. En el cas<br />

de les rajoles de la paret, l’algorisme està detectant aquelles zones que tenen un alt contrast<br />

respecte als seus veïns.<br />

El cas d’aquesta escena és molt pràctic, doncs disposem de dues zones molt interessants: la<br />

paret de maons i el personatge de l’Avionetta.<br />

Recordem que la nostra implementació de l’MLAA utilitza un llindar de 80 per identificar<br />

quins colors són similars i quins són diferents.<br />

En el cas de la paret, podem veure que hi ha zones on l’aliasing no s’ha corregit<br />

correctament. Doncs l’espai detectat entre els totxos és tan estret, que l’MLAA no disposa de<br />

prou informació per processar-ho correctament, ja que només ha establert una línia. Altres<br />

zones, senzillament no han estat detectades per l’MLAA com a zones amb aliasing, i per tant, no<br />

han estat corregides.<br />

Si establim un llindar de 40, enlloc de 80, comprovarem que l’MLAA selecciona més zones<br />

a corregir, doncs ara detecta més colors com a diferents (Figura 97). En aquest cas, la correcció<br />

que es fa de la paret és d’una qualitat molt superior a la de la Figura 92.<br />

Això és degut a que ara s’estan detectant més diferències de color entre píxels, per tant<br />

s’estan seleccionant més patrons i, en conseqüència, l’espai entre els totxos disposarà de molta<br />

més informació de color.<br />

No succeeix el mateix en el cas de l’Avionetta. Com ja van comentar, el llindar de 80 s’ha<br />

seleccionat després de realitzar diferents proves i detectar que és un valor generalment adequat<br />

per a les imatges en color. Com a exemple, en aquest cas la silueta del personatge es troba<br />

correctament suavitzada per a la Figura 92.<br />

En el moment que establim un llindar de 40, estem assumint que colors que són iguals<br />

siguin considerats diferents (quan més baix el llindar, més correcció es produirà). Això afecta de<br />

forma molt negativa al contorn del personatge, doncs s’estan detectant colors que interfereixen<br />

en la correcció de la seva silueta. Podem comprovar amb detall les diferències entre la paret i<br />

l’Avionnetta a la Figura 98.<br />

Més concretament: amb aquest valor de llindar, el contorn del personatge està patint la<br />

problemàtica que comentàvem a 8.2.2, a l’apartat de Cerca de discontinuïtats. Aquest problema<br />

és precisament el motiu pel qual vam establir un llindar per poder diferenciar uns colors<br />

d’altres.<br />

Per tant, donades aquestes circumstàncies podríem afirmar que, tot i que la modificació del<br />

llindar ens permetria atenuar alguns dels defectes que l’MLAA pugui passar per alt en algunes<br />

situacions, no podem intentar superar les limitacions de l’algorisme a base d’empitjorar zones<br />

de la imatge que haurien de ser corregides sense cap problema, doncs s’alteraria completament<br />

la utilitat de l’algorisme.<br />

D’altra banda, si comparem les imatges de la Figura 93 i de la Figura 94 amb les<br />

obtingudes per l’MLAA, comprovarem que la qualitat de l’MLAA és inferior.<br />

En el cas del 4xSSAA, tot i tenir zones similars, l’acabat del supersampling és molt més bo.<br />

Tot i no corregir del tot alguna zona, el contorn dels objectes està suavitzat de forma molt més<br />

homogènia que amb l’MLAA.<br />

Amb el 16xSSAA en canvi, la qualitat és altíssima i l’MLAA mostra uns resultats molt<br />

pobres em comparació.<br />

Podem comprovar-ho numèricament mitjançant el càlcul de l’MSE a la Taula 5. A la<br />

Figura 93 i la Figura 94 podem visualitzar l’MSE entre les diferents imatges a partir de la<br />

imatge diferència.


Comparativa de resultats<br />

MSE NAA - 4xSSAA - MLAA - Autor -<br />

16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />

R 212.572 8.74309 174.622 169.184<br />

G 123.516 4.68394 102.69 105.489<br />

B 69.6465 2.6938 58.1515 60.2413<br />

Taula 5. Error quadràtic mitjà (MSE) de l’Avionetta<br />

És a dir, la relació de l’error entre les diferents tècniques equival a:<br />

MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />

Per tant, a partir dels resultats obtinguts tant amb l’MSE com amb les imatges, podem<br />

afirmar que en aquest cas, la qualitat de les imatges resultant de l’MLAA es troba per sota de la<br />

qualitat del 4xSSAA.<br />

97


98<br />

Comparativa de resultats<br />

Figura 92. Render de Maya: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a<br />

corregir; 3 - Imatge resultant de la correcció amb l’MLAA.


Comparativa de resultats<br />

9.9.1 4xSSAA<br />

Figura 93. Render de Maya: 1 - Correcció amb 4xSSAA; 2 - Correcció amb MLAA;<br />

3 - Imatge diferència entre el 4xSSAA i el 16xSSAA.<br />

99


100<br />

9.9.2 16xSSAA<br />

Comparativa de resultats<br />

Figura 94. Render de Maya: 1 - Correcció amb 16xSSAA; 2 - Correcció amb MLAA;<br />

3 - Imatge diferència entre 1 i 2.


Comparativa de resultats<br />

9.9.3 Zoom<br />

Figura 95. Zoom per a totes les variacions de la imatge<br />

Figura 96. Zoom per a totes les variacions de la imatge<br />

101


102<br />

Comparativa de resultats<br />

Figura 97. Render de Maya: 1 - Imatge mostrant les zones a corregir per un llindar de 40;<br />

2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 40; 3 - Imatge<br />

resultant de l’MLAA amb llindar de 80;


Comparativa de resultats<br />

Figura 98. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 40. Podem<br />

apreciar les diferències entre les parets de maons i les siluetes de l’Avionetta<br />

103


104<br />

9.10 Half-Life 2: Imatge 1<br />

Comparativa de resultats<br />

Les imatges del Half-Life 2 van ser capturades a una resolució de 1280x720, però nosaltres<br />

hem retallat les imatges a 420x220 per poder mostrar amb detall les zones més interessants.<br />

Aquesta imatge té algunes similituds amb la imatge de l’apartat 9.9, doncs també perd<br />

qualitat en alguns detalls que podrien millorar-se modificant el llindar. Això sí, el resultat de la<br />

resta de la imatge es deterioraria completament.<br />

Si partim de la imatge de la Figura 99, veurem que tot i que l’escala presenta aliasing en<br />

tota la seva superfície, l’MLAA no l’ha detectat completament. En aquest cas estem parlant<br />

d’una zona amb colors molt similars, per tant és fàcil que l’algorisme els passi per alt.<br />

A més a més, comprovem que la reixa del fons de la imatge no s’ha detectat en cap<br />

moment. La raó és la mateixa, doncs es tracta de colors molt similars i aquest llindar (80) els<br />

tracta com iguals.<br />

Per tant, a la Figura 99 podem comprovar que la correcció de l’MLAA ha tractat totes les<br />

zones identificades amb un resultat final decent. Les zones no identificades segueixen mostrant<br />

els mateixos defectes.<br />

Tenint en compte que estem ignorant parts importants de la imatge que evidentment<br />

requereixen antialiasing, hem comprovat quin seria el resultat en establir un llindar més baix.<br />

El llindar mínim necessari per detectar l’enreixat del fons és de 20, un valor<br />

extremadament baix, ja que trobarà diferències entre colors molt similars. A la Figura 104<br />

comprovem que ara sí s’han detectat totes les zones amb aliasing de la imatge.<br />

El problema el trobem quan comprovem la imatge resultant d’aquest MLAA: amb un<br />

llindar tan baix, estem identificant diferències on realment no n’hi ha. D’aquesta manera, les<br />

barres verticals de l’escala, que per un llindar de 80 (Figura 99) s’havien corregit correctament,<br />

tornen a mostrar aliasing.<br />

Respecte a les barres horitzontals, en la Figura 99 no aconseguíem detectar-les per<br />

complet. Amb aquest llindar sí que ho fem però tot i així, al tractar-se d’objectes prims, el<br />

resultat de la seva correcció és molt pobre. Es pot veure en detall en la Figura 105.<br />

D’aquesta manera, arribem a la mateixa conclusió: modificar el valor del llindar pot arribar<br />

a millorar les zones més conflictives de la imatge, però motivarà la pèrdua de qualitat de la resta<br />

de la imatge.<br />

Sobre les imatges a les que s’ha aplicat el multisampling, cal recordar (2.2.3) que<br />

l’inconvenient més gran de l’MSAA és el fet de no tractar les textures internes dels objectes, i<br />

per tant les textures alpha (amb transparència) que són habituals a les escenes amb reixes<br />

tampoc es veuran corregides.<br />

Tenint això en compte, podem comprovar que per totes les versions del multisampling<br />

(Figura 100, Figura 101 y Figura 102), en cap moment s’ha corregit la reixa del fons.<br />

En el cas de la Figura 100, per al 2xMSAA, a simple vista es pot veure que els resultats de<br />

l’MLAA són de millor qualitat.<br />

En el cas de la Figura 101 no és tan senzill d’avaluar, doncs si mirem la imatge amb detall<br />

es pot veure que el 4xMSAA està corregint lleugerament l’aliasing de les barres horitzontal de<br />

l’escala.<br />

Sabem que l’MLAA no ha corregit aquesta zona, però en canvi, si que ha corregit<br />

perfectament les barres verticals. El 4xMSAA en canvi, no ha arribat a suavitzar completament<br />

aquesta zona. La seva correcció és més homogènia en el conjunt de la imatge, però la de<br />

l’MLAA és més complerta en les zones que s’ha aplicat.<br />

Si analitzem només la qualitat de la imatge de forma visual, l’efecte de l’MLAA és més<br />

polit (recordem que les zones que no ha corregit són molt petites, les grans es veuen<br />

perfectament suavitzades), suposarem que el resultat de l’MLAA per aquesta imatge és


Comparativa de resultats<br />

lleugerament superior que el del 4xMSAA. Podem comprovar els detalls en la imatge de la<br />

Figura 103. Però si relacionem l’MSE entre les imatges amb aquesta qualitat, trobarem certa<br />

incoherència en els resultats: l’MSE de l’MLAA és superior al 2xMSAA (Taula 6. Aquesta<br />

contradicció es deu a que el multisampling no està tractant les textures alpha, i per tant, totes les<br />

seves imatges resultants (per 2x, 4x i 8x) són més semblants entre sí, el que implica un MSE<br />

més baix. Podem comprovar-ho visualment a les imatges diferència de la Figura 100, la Figura<br />

101 i la Figura 102.<br />

Finalment, en comparar el resultat de l’MLAA amb la correcció realitzada amb el 8xMSAA,<br />

l’alta qualitat del multisampling respecte al morphological és evident. Tot i així, si observem<br />

amb atenció les imatges de la Figura 102 i de la Figura 103, podem apreciar que a la barra<br />

vertical de l’escala, la correcció de l’MLAA està lleugerament més suavitzada. Al marge<br />

d’aquest detall, el resultat global del multisampling és tan bo i homogeni, que considerem que la<br />

seva qualitat en aquest cas és superior a l’MLAA.<br />

A continuació, el càlcul de l’error quadràtic mitjà i la seva relació entre les diferents<br />

tècniques:<br />

és:<br />

MSE NAA – 2xMSAA - 4xMSAA - MLAA - Autor -<br />

8xMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />

R 7.19529 3.44433 2.2368 5.18829 6.88284<br />

G 13.4076 6.35743 4.07806 9.57029 15.269<br />

B 8.28486 3.94289 2.5142 5.89152 11.4049<br />

Taula 6. Error quadràtic mitjà (MSE) de la imatge 1 del Half-Life 2<br />

Per tant, la relació existent entre el multisampling i l’MLAA per a aquest tipus d’imatges<br />

MSE(NAA - 8xMSAA) > MSE(MLAA – 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) ><br />

> MSE (4xMSAA – 8xMSAA)<br />

Com ja hem comentat, els valors numèrics es veuen afectats per la limitació del<br />

multisampling amb les textures alpha, per tant, la qualitat de l’MLAA per a aquestes imatges<br />

seria, com a mínim, equivalent al 4xMSAA, i en aquest cas concret lleugerament superior.<br />

105


106<br />

Comparativa de resultats<br />

Figura 99. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2- Imatge que mostra les zones<br />

a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.


Comparativa de resultats<br />

9.10.1 2xMSAA<br />

Figura 100. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA.<br />

107


108<br />

9.10.2 4xMSAA<br />

Comparativa de resultats<br />

Figura 101. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA


Comparativa de resultats<br />

9.10.3 8xMSAA<br />

Figura 102. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre l’MLAA i el 8xMSAA.<br />

109


110<br />

9.10.4 Zoom<br />

Figura 103. Zoom per a totes les variacions de la imatge<br />

Comparativa de resultats


Comparativa de resultats<br />

Figura 104. Imatge del Half-Life 2: 1 - Imatge mostrant les zones a corregir per un llindar<br />

de 20; 2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 20;<br />

3 - Imatge resultant de l’MLAA amb llindar de 80;<br />

111


112<br />

Comparativa de resultats<br />

Figura 105. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 20. Podem<br />

apreciar les diferències entre l’escala i la reixa


Comparativa de resultats<br />

9.11 Half-Life 2: Imatge 2<br />

Aquesta imatge (Figura 106), és l’exemple perfecte de com l’MLAA pot superar en<br />

algunes ocasions al multisampling. En aquest cas, tornem a tractar amb una escena amb textures<br />

alfa, on ja sabem que l’MSAA falla. A més a més, es tracta d’una imatge amb uns colors molt<br />

contrastats. Això afavoreix el procés del nostre algorisme, doncs no evita problemes amb zones<br />

que no es detecten per tenir colors similars.<br />

Per tant, només comprovant la Figura 106 podem fer-nos una idea que l’MLAA ha fet una<br />

correcció de molt alta qualitat. L’escala del centre de la imatge és la zona més fàcil de comparar<br />

a simple vista amb la resta de imatges. Podem comprovar altres zones en detall amb el zoom a<br />

la Figura 110.<br />

Si comparem les imatges, veurem que el multisampling no està corregint pràcticament res<br />

a 2xMSAA (Figura 107). Amb 4xMSAA (Figura 108) el resultat millora, però segueix deixant<br />

zones importants sense corregir.<br />

Finalment, a 8xMSAA (Figura 109) el resultat és acceptable, però en comparar-lo amb<br />

l’MLAA comprovem que la qualitat del morphological és molt superior al multisampling en<br />

aquesta ocasió.<br />

Podem confirmar aquests resultats a partir del càlcul de l’error quadràtic mitjà:<br />

MSE NAA - 2xMSAA - 4xMSAA - MLAA - Autor -<br />

8XMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />

R 100.117 36.2895 16.197 126.907 148.871<br />

G 116.668 42.1394 18.7934 146.851 171.922<br />

B 141.224 51.3838 22.5801 178.814 208.033<br />

Taula 7. Error quadràtic mitjà (MSE) de la imatge 2 del Half-Life 2<br />

Com podem veure, la relació entre el multisampling i l’MLAA és la següent:<br />

MSE(MLAA – 8xMSAA) > MSE(NAA - 8xMSAA) > MSE( 2xMSAA – 8xMSAA) ><br />

> MSE(4xMSAA – 8xMSAA)<br />

Podem veure les imatges diferència corresponents al càlcul de l’MSE a la Figura 107, a la<br />

Figura 108 i a la Figura 109.<br />

113


114<br />

Comparativa de resultats<br />

Figura 106. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les<br />

zones a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.


Comparativa de resultats<br />

9.11.1 2xMSAA<br />

Figura 107. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA<br />

115


116<br />

9.11.2 4xMSAA<br />

Comparativa de resultats<br />

Figura 108. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA.


Comparativa de resultats<br />

9.11.3 8xMSAA<br />

Figura 109. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre 1 i 2.<br />

117


118<br />

9.11.4 Zoom<br />

Figura 110. Zoom per a totes les variacions de la imatge<br />

Comparativa de resultats


Comparativa de resultats<br />

9.12 Half-Life 2: Imatge 3<br />

Aquesta imatge, a diferència de l’anterior, conté tots els elements que perjudiquen al nostre<br />

algorisme: objectes molt petits i tonalitats molt similars.<br />

Si observem la imatge de la Figura 111 veurem que s’han detectat molt poques zones per<br />

corregir. Per tant, ja sabem que la resta de contorns amb aliasing que no s’han marcat no seran<br />

corregits.<br />

Comprovem que una de les zones detectades és la part de dalt de l’edifici amb les antenes.<br />

Només cal observar la imatge resultant de l’MLAA per comprovar que no ha aconseguit corregir<br />

res en aquests objectes tan petits. El mateix succeeix amb els cables que van d’un edifici a<br />

l’altre. Podem comprovar-ho amb detall en la Figura 115.<br />

Si observem amb atenció la Figura 112, podrem detectar algunes zones on l’MLAA ha<br />

suavitzat amb millor qualitat que el 2xMSAA: el sostre dels edificis i algunes parets. La resta de<br />

zones o bé no s’han corregit perquè es tracta d’objectes molt petits, o bé la qualitat de la<br />

correcció dels dos antialiasings és realment baixa.<br />

Quan comparem el resultat de l’MLAA amb el del 4xMSAA a la Figura 113, comprovem<br />

que les zones que l’MLAA sí que havia corregit (sostres, alguna paret) són equivalents en les<br />

dues imatges. Els objectes petits, en canvi, estan correctament suavitzats amb el multisampling.<br />

I lògicament, la part de la imatge que l’MLAA no ha corregit, ha estat suavitzada pel 4xMSAA.<br />

Si tenim en compte l’MSE de l’MLAA amb el 2xMSAA i amb el 4xMSAA, a la vista dels<br />

resultats, podríem entendre que la qualitat de la imatge resultant de l’MLAA és troba entre mig<br />

dels dos.<br />

Tot i que l’MLAA no hagi corregit els objectes petits i el 2xMSAA sí que ho hagi fet, els<br />

contorns que l’MLAA ha corregit són de millor qualitat que els del multisampling, i alhora són<br />

més fàcils de percebre que les antenes o els cables. Per tant, entendrem que visualment l’MLAA<br />

és lleugerament superior al 2xMSAA per aquesta imatge.<br />

En aquest cas, el valor numèric de l’MSE no coincideix amb la percepció que tenim de la<br />

imatge, doncs tot i que visualment es pot apreciar la millor qualitat de l’MLAA respecte al<br />

2xMSAA, l’MSE de l’MLAA és més gran. Atribuïm aquesta diferència a algunes zones de la<br />

imatge de l’MLAA on l’aliasing és molt evident: per exemple, a la Figura 112, a la columna<br />

inclinada de l’esquerra de la imatge.<br />

MSE NAA - 2xMSAA - 4xMSAA - MLAA - Autor -<br />

8XMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />

R 26.5243 5.23815 2.55316 16.1521 18.5586<br />

G 20.6 4.6945 2.40291 13.8925 15.4219<br />

B 14.7427 3.52288 1.9843 11.1844 12.5476<br />

Taula 8. Error quadràtic mitjà (MSE) de la imatge 3 del Half-Life 2<br />

Per tant, la relació de l’error entre el multisampling i l’MLAA quedaria:<br />

MSE(NAA - 8xMSAA) > MSE(MLAA – 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) ><br />

> MSE (4xMSAA – 8xMSAA)<br />

Podem comprovar visualment l’MSE a les imatges diferència de la Figura 112, la Figura<br />

113 i la Figura 114.<br />

119


120<br />

Comparativa de resultats<br />

Figura 111. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les<br />

zones a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.


Comparativa de resultats<br />

9.12.1 2xMSAA<br />

Figura 112. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA.<br />

121


122<br />

9.12.2 4xMSAA<br />

Comparativa de resultats<br />

Figura 113. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />

MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA.


Comparativa de resultats<br />

9.12.3 8xMSAA<br />

Figura 114. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />

MLAA; 3 -imatge diferència entre l’MLAA i el 8xMSAA.<br />

123


124<br />

9.12.4 Zoom<br />

Figura 115. Zoom per a totes les variacions de la imatge<br />

Comparativa de resultats


Comparativa de resultats<br />

9.13 Autor<br />

9.13.1 Fada<br />

Figura 116. Conjunt d’imatges en totes les versions possibles: sense antialiasing; destacant<br />

la zona de correcció; imatge resultant de l’autor; imatge resultant de la nostra<br />

implementació.<br />

Figura 117. Imatge diferència entre la nostra implementació de l’MLAA i la de l’autor<br />

125


126<br />

Comparativa de resultats<br />

Figura 118. Zoom de la Fada amb la nostra implementació de l’MLAA (esquerra) i la<br />

sortida de l’aplicació de l ‘autor (dreta).<br />

La Fada és l’exemple que trobem a l’article de l’autor. Per tant, hem considerat que és el<br />

més adequat per comprovar l’eficàcia de la nostra implementació en la versió a color, doncs és<br />

una de les imatges a partir de les quals hem realitzat les principals proves per refinar<br />

l’algorisme.<br />

Si comprovem la Figura 116, veiem que no s’aprecien canvis en els contorns de la imatge.<br />

Quan observem la Figura 118, comprovem que la única diferència és troba en les textures,<br />

doncs l’autor ha aplicat l’algorisme creant un efecte d’emborronament.<br />

En el nostre cas, hem escollit un llindar que només afecta al contorn dels objectes de la<br />

imatge, i per tant, és en aquesta zona on es corregeix l’aliasing, tal i com podem comprovar a la<br />

Figura 116.<br />

Per tant, donat que no existeixen diferències perceptibles a simple vista a la imatge de la<br />

Figura 116 i que la correcció de l’aliasing és realitza correctament, atribuïm el valor de l’MSE<br />

a aquesta aplicació de l’MLAA de l’autor sobre les textures de la imatge.<br />

D’aquesta manera, donem per vàlida l’eficàcia del nostre algorisme en comparació amb els<br />

resultats obtinguts per l’aplicació de l’autor.<br />

Càlcul de l’error:<br />

MSE R G B<br />

MLAA vs. Autor 54.7732 32.3782 8.99488<br />

Taula 9. Error quadràtic mitjà (MSE) de la imatge de la Fada


Comparativa de resultats<br />

9.13.2 Silueta<br />

Figura 119. Imatge resultant d’aplicar la nostra implementació a la silueta de la Figura 43<br />

127


128<br />

Comparativa de resultats<br />

Figura 120. Imatge resultant d’utilitzar l’aplicació de l’autor per la imatge de la Figura 43


Comparativa de resultats<br />

Figura 121. Zoom de les imatges de la Figura 119 i de la Figura 120<br />

129


130<br />

Comparativa de resultats<br />

Figura 122. Diferència de les imatges de la Figura 119 i de la Figura 120<br />

Hem escollit la silueta de la nena per a aquesta comparació, perquè considerem que és una<br />

imatge amb característiques variades. Si comprovem les imatges a simple vista, no s’aprecia cap<br />

diferència entre elles. El seu MSE és de 17.012.<br />

Quan fem un zoom sobre alguna de les zones conflictives (Figura 121), per exemple les<br />

fulles, tampoc apreciem cap canvi significatiu. Per tant, considerem que la implementació<br />

d’aquesta part de l’algorisme ha estat adequada.<br />

Càlcul de l’error quadràtic mitjà:<br />

9.14 Half-Life 2: Imatge 1<br />

MSE Autor<br />

MLAA 17.012<br />

L’única diferència problemàtica que hem trobat amb l’autor és en casos com els de la<br />

Figura 99, quan el valor del llindar que establim per diferenciar colors pugui ser determinant<br />

pel resultat final, però no sigui el mateix llindar per a totes les zones de la imatge.


Comparativa de resultats<br />

En aquest cas concret, sabem que la reixa del fons rebrà una correcció molt bona amb un<br />

llindar amb valor entre 10 i 20. Sabem que amb aquest mateix valor, obtindrem la millor<br />

correcció possible de les barres horitzontals de l’escala.<br />

Però també sabem que per corregir les barres verticals de l’escala i algun contorn més de la<br />

imatge, necessitem un llindar de 80; i que a més a més, l’aliasing d’aquestes zones és el més<br />

destacable a simple vista.<br />

És per això que en la nostra implementació hem d’escollir aquest últim valor per tal de<br />

quedar-nos amb el millor resultat possible d’entre tots els que podem obtenir.<br />

Amb l’aplicació de l’autor no és així. A la Figura 123 podem comprovar que la seva<br />

imatge és una combinació de les bones correccions de les nostres. La seva reixa és equivalent a<br />

la nostra reixa pel llindar 15. El mateix succeeix per les barres horitzontals de l’escala. En el cas<br />

de les barres verticals, tenen la qualitat de la nostra imatge per llindar 80. Més detall a la Figura<br />

124.<br />

Per tant, a la vista dels resultats hem de suposar que l’autor aplica un mètode que li permet<br />

trobar l’equilibri entre aquests llindars, i que és quelcom que s’escapa de les nostres<br />

possibilitats.<br />

Donat que les nostres proves amb el seu mètode per diferenciar colors van obtenir uns<br />

resultats realment dolents, considerem que aquesta no és la part rellevant, o com a mínim, el<br />

resultat no depèn directament d’aquest sistema.<br />

Com ja vam comentar a 8.2.2, la nostra implementació presenta algunes convencions que<br />

hem hagut de prendre per falta d’informació. Creiem que aquesta informació és la que ens<br />

permetria processar les imatges de manera que obtinguéssim el resultat òptim per a cada zona de<br />

la imatge (dintre de les possibilitats de l’MLAA).<br />

D’altra banda, cal destacar que aquestes diferències amb l’autor no alteren la nostra<br />

comparativa amb l’MSAA, tal com es demostra a cada una de les taules comparatives de l’MSE<br />

on l’error del nostre MLAA i el de l’autor és similar. Podem comprovar-ho visualment a la<br />

Figura 125, on la imatge de l’autor segueix sent lleugerament de millor qualitat que la del<br />

4xMSAA i la imatge del 8xMSAA segueix sent clarament superior a totes les demés.<br />

En el cas de la Figura 126, la imatge de l’autor segueix sent visualment superior a la del<br />

2xMSAA i, degut a la quantitat d’objectes petits de la imatge, segueix sense tenir tan bona<br />

qualitat com la del 4xMSAA, tot i que en aquest cas, està lleugerament per sota (en la nostra<br />

implementació es diferencien més).<br />

A continuació, mostrem en detall el càlcul de l’error quadràtic mitjà de les imatges:<br />

MSE Autor - MLAA 80 Autor - MLAA 15 Autor - 8xMSAA<br />

Imatge 1<br />

Imatge 2<br />

R 3.66149 2.62338 6.8557<br />

G 9.09481 5.1006 15.0577<br />

B 7.76597 3.60386 11.2835<br />

R 20.8738<br />

G 17.305<br />

B 14.0528<br />

Taula 10. Error quadràtic mitjà (MSE)<br />

131


132<br />

Comparativa de resultats<br />

Figura 123. Imatge 1: 1 - Imatge resultant de l’MLAA amb llindar de 80;<br />

2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 15;<br />

3 – Imatge resultant de la implementació de l’autor;


Comparativa de resultats<br />

Figura 124. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 15 i per la<br />

versió de l’autor. Podem apreciar les diferències entre l’escala i la reixa<br />

133


134<br />

Comparativa de resultats<br />

Figura 125. Comparativa de la imatge resultant de la implementació de l’autor amb les<br />

obtingudes amb el supersampling de 4x i de 8x


Comparativa de resultats<br />

Figura 126. Imatge 2: Comparativa de la imatge resultant de la implementació de l’autor<br />

amb les obtingudes amb el supersampling de 4x i de 8x<br />

135


10. Conclusions<br />

Després de tot l’estudi i desenvolupament del Morphological Antialiasing, hem pogut<br />

explorar en detall els seus avantatges i les seves limitacions.<br />

Hem confirmat que el punt fort de l’algorisme és el seu plantejament, una nova manera<br />

d’enfocar el problema: el fet de treballar amb imatges processades implica no haver de realitzar<br />

càlculs amb la geometria de l’escena i, en conseqüència, s’obtenen resultats de millor qualitat<br />

amb un consum de recursos més baix.<br />

D’altra banda, hem comprovat que el punt feble principal de l’MLAA és la falta<br />

d’informació a nivell de subpíxel. Per aquesta causa, l’algorisme no proporcionarà bons<br />

resultats per a imatges amb objectes molt prims o petits. Tampoc podrà gestionar correctament<br />

els canvis temporals que afectin als polígons a nivell de subpíxel en diferents frames, de manera<br />

que es veurà reflexat en l’animació final. En últim lloc, el fet de no distingir entre primer pla i<br />

fons, suposarà un problema per al processament de text, que resultarà en una distorsió<br />

considerable de les lletres.<br />

En quant a la implementació, malauradament, degut a l’escassa (i en ocasions confusa)<br />

informació que es proporciona a l’article original, hem hagut d’afegir una limitació extra a la<br />

nostra versió de l’algorisme.<br />

Tenim la certesa que, si l’autor hagués escollit un exemple genèric per explicar la versió de<br />

l’algorisme per a imatges en color, hauria estat possible extreure la informació necessària per<br />

poder desenvolupar una implementació equivalent.<br />

Donat que tota la descripció de la segona part de l’algorisme es basa en un cas molt<br />

particular que no aporta cap dada nova, la informació que sí ofereix sobre com tractar el color<br />

esdevé incoherent i, en algun cas, injustificada.<br />

A banda de les dificultats per reproduir la implementació, hem pogut avaluar correctament<br />

els punts forts i dèbils de l’algorisme, tenint sempre en compte quines limitacions són de<br />

l’MLAA i quines corresponen a la nostra implementació.<br />

A partir dels resultats de la nostra comparativa, podem concloure que l’MLAA presenta uns<br />

resultats equivalents al 4xSupersampling. En el cas dels patrons de freqüència variable però, la<br />

seva qualitat és menor a la del 4xSSAA, doncs no disposa de suficient informació per processar<br />

algunes zones de la imatge.<br />

En el cas de multisampling, l’MLAA té generalment una qualitat equivalent al 4xMSAA,<br />

arribant en ocasions a superar-lo. En les imatges que continguin textures amb transparència, la<br />

qualitat de l’MLAA pot superar fàcilment la del 8xMSAA.<br />

Aquests resultats es veuen afectats però, per les limitacions ja conegudes de l’MLAA. Per<br />

tant, aquelles escenes amb text, objectes petits o molt prims, rebran la conseqüent pèrdua de<br />

qualitat, on la qualitat de l’MLAA es trobarà entre el 2xMSAA i el 4xMSAA, i en el cas del<br />

supersampling, per sota del 4xSSAA.<br />

En conclusió, l’MLAA és un bon punt de partida per millorar les tècniques d’antialiasing<br />

que es feien servir fins ara. Considerem que aquest algorisme ha revolucionat la forma de tractar<br />

l’aliasing, tal com estem veient en les diferents implementacions que s’han dut a terme partint<br />

de la base de l’MLAA.<br />

És raonable pensar doncs, que el fet d’obtenir resultats de bona qualitat a un rendiment tan<br />

alt en comparació amb altres algorismes, obre un nou ventall de possibilitats que, junt amb les<br />

tècniques ja conegudes, probablement desembocarà en una optimització que combini el millor<br />

de cada una d’elles.<br />

137


11. Glossari<br />

[G1] Jaggies: dents de serra, artifacts.<br />

[G2] Artifacts: defectes, alteracions en la imatge que produeixen pèrdua de qualitat.<br />

[G3] Frame: fotograma, imatge concreta en una successió d’imatges.<br />

[G4] Motion blur: efecte de moviment a partir d’un desenfocament de la imatge.<br />

[G5] Bandwidth: ample de banda respecte el consum de la memòria de vídeo.<br />

[G6] Fillrate: taxa d’ompliment de píxels.<br />

[G7] Frame buffer: ubicació de memòria dels píxels que es mostraran per pantalla.<br />

139


12. Referències<br />

[1] Advanced Graphics Lab (Intel). Morphological Antialiasing<br />

http://visual-computing.intel-research.net/publications/papers/2009/mlaa/mlaa.pdf<br />

[2] Whathis?com. Moire effect<br />

http://whatis.techtarget.com/definition/0,,sid9_gci768750,00.html<br />

[3] Hardware y software gráfico. Antialiasing<br />

http://giga.cps.unizar.es/~spd/work/curso_hs/<br />

[4] Wikipedia. Supersampling<br />

http://en.wikipedia.org/wiki/Supersampling<br />

[5] Tom’s hardware. Anti-aliasing – Removing the “jaggies”<br />

http://www.tomshardware.com/reviews/high,294-23.html<br />

[6] nvNews Forums. NV40 antialiasing sample patterns<br />

http://www.nvnews.net/vbulletin/showthread.php?t=30641&highlight=Anti+aliasing<br />

[7] pcgameshardware. Ati Catalyst 9.11 delivers higher visual quality to Radeon HD 5000<br />

series<br />

http://www.pcgameshardware.com/aid,699987/Ati-Catalyst-911-delivers-higher-visualquality-to-Radeon-HD-5000series/Practice/&menu=browser&mode=article&image_id=1223598&article_id=699987&page<br />

=1<br />

[8] Web Programming & Digital Media Assignment. Mean Square Error<br />

http://goanna.cs.rmit.edu.au/~ronvs/teaching/WebProgramming-<br />

DigitalMedia/ass2002s2/ass1.html<br />

[9] Potrace. Examples<br />

http://potrace.sourceforge.net/samples.html<br />

[10] CreativePro. Scanning 101: setting the right resolution<br />

http://www.creativepro.com/article/scanning-101-setting-the-right-resolution<br />

[11] realtimerendering. Morphological Antialiasing<br />

http://www.realtimerendering.com/blog/morphological-antialiasing/<br />

141


142<br />

[12] Gaspard Monge Institut. Morphological antialiasing on the GPU<br />

http://igm.univ-mlv.fr/~biri/mlaa-gpu/MLAAGPU.pdf<br />

[13] Practical Morphological Antialiasing. MLAA<br />

http://www.iryoku.com/mlaa/<br />

Referències


13. Bibliografia<br />

13.1 Llibres<br />

HEARN Donald; BAKER M. Pauline. Gráficos por computadora con OpenGL. Madrid:<br />

Pearson Educación, 2006<br />

13.2 Recursos electrònics<br />

http://www.iryoku.com/mlaa/<br />

http://es.wikipedia.org/wiki/Aliasing<br />

http://en.wikipedia.org/wiki/Anti-aliasing<br />

http://www.nvidia.com/object/feature_hraa.html<br />

http://sites.amd.com/us/game/technology/Pages/morphological-aa.aspx<br />

http://www.impresszio.hu/szabolcs/MentalRay/MentalRaySampling.htm#adaptivesampling<br />

http://www.x86-secret.com/articles/divers/v5-6000/datasheets/FSAA.pdf<br />

http://www.scribd.com/doc/34187921/Aliasing-y-Anti-Aliasing<br />

http://www.tomshardware.com/reviews/high,294-23.html<br />

http://foro.noticias3d.com/vbulletin/showthread.php?p=3680042<br />

http://www.realtimerendering.com/blog/2009/07/<br />

http://www.eurogamer.net/articles/digitalfoundry-saboteur-aa-blog-entry<br />

http://blogs.amd.com/play/2011/03/28/morphological-anti-aliasing-is-a-smooth-operator/<br />

http://news.softpedia.com/es/La-tecnologia-NVIDIA-SRAA-competira-con-el-metodo-dealisado-AMD-MLAA-181633.html<br />

http://www.innerjuegos.com/noticias/12924<br />

143

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!