di  -  mercoledì 8 aprile 2009

Nella scorsa puntata erano state sommariamente descritte le principali forme di aliasing ed erano state introdotte nozioni di carattere teorico sugli algoritmi di antialiasing. Oggi si farà cenno alle tecniche adottate in concreto, sui chip grafici, per tentare di ridurre questo tipo di disturbi.

Iniziamo subito col dire che le tecniche comunemente utilizzate fanno ricorso ad algoritmi di sovracampionamento con filtraggio di tipo lineare o bilineare, operanti a livello di screen space. Aggiungiamo alcune considerazioni sul comportamento dell’occhio umano, che possono aiutare a capire meglio la natura di certe scelte a livello progettuale. In particolare, è opportuno specificare che il sistema occhio-cervello è più sensibile a disposizioni simmetriche e ordinate di elementi.

Inoltre il livello di sensibilià è maggiore lungo determinate direzioni o, per meglio dire, per determinati angoli (il che ha influenzato, come si vedrà in futuro, anche le scelte relative alle implementazioni del filtro anisotropico). In particolare. dividendo lo schermo in quattro quadranti, con gli assi X e Y lungo le direzioni verticale ed orizzontale, si è rilevato che è più facile notare artefatti lungo le direttrici relative agli angoli multipli di 45° (assi e bisettrici dei quadranti).

Questo significa che se si vuole mascherare un artefatto, è opportuno farlo utilizzando distribuzioni di “rumore” che non seguano le direttrici indicate.  Non a caso, ho parlato di “rumore”, poichè, di fatto, un’operazione di filtraggio dei tipo di quelle menzionate introduce dei disturbi che servono a mascherare altri disturbi.

Fatta questa premessa, cerchiamo di capire come agisce un algoritmo che opera un sovracampionamento dell’immagine.  Di fatto, si prende ciascun pixel dell’immagine originale o di parte di essa, lo si scompone in una serie di subpixel, si compiono alcune operazioni con questi subpixel e, infine, si riporta l’immagine alle dimensioni originarie.  Ciò che contraddistingue un algoritmo da un altro è la modalità di scelta delle posizioni, del numero dei subpixel (ovvero del tipo di pattern) e delle operazioni che si compiono su di essi.

point-sampling.bmpIl metodo più semplice di filtraggio è il POINT SAMPLING, in cui si ha campionamento 1:1 tra immagine originale e immagine “filtrata”.

In pratica, si immagina come se i valori di LUMINANZA (Y) e CROMINANZA (C) del pixel, fossero concentrati in un punto e tutto il pixel assumesse una distribuzione di Y e C uniforme, data proprio da quei valori. Ovviamente questo metodo è ben lungi dall’eliminare gli artefatti, soprattutto se si sceglie sempre come riferimento il centro del pixel. Le cose migliorano se si effettua un’operazione di point sampling facendo ricorso a pattern di tipo fully jittered, come in figura

point-sampling-jittered.bmp

per quanto detto circa la sensibilità dell’occhio umano alle distribuzioni uniformi. In pratica, un pattern di tipo random come quello proposto qui sopra,  ha lo scopo di introdurre del “rumore bianco” che maschera i disturbi da aliasing. Nei fatti, l’utilizzo di un solo sample per pixel non è molto utile e migliora solo di poco la situazione rispetto ad un’operazione di sampling con distribuzione ordinata.

2x-og.bmpLe cose migliorano, ma non in maniera drastica, scegliendo 2 campioni per pixel; anche in questo caso vale il discorso relativo alle distribuzioni simmetriche e alle direttrici fatto in precedenza; quindi la scelta migliore è quella di un pattern di tipo 2x jittered, la peggiore è quella rappresentata in figura .

Di fatto, però, 2 campioni sono troppo pochi per generare una cifra di rumore bianco accettabile per mascherare la meglio l’aliasing nel caso di ditribuzione jittered, e risulta altrettanto difficile percepire i benefici di una scelta, ad esempio, di una griglia di tipo ROTATED rispetto ad una di tipo ORDERED (come le due in figura).

Con questi due termini abbiamo introdotto altrettanti nuovi concetti che risulteranno più chiari quando si inizierà a parlare della modalità 4x, ovvero con 4 sample per pixel.

A questo punto, è opportuno aprire una parentesi per introdurre altri nuovi concetti: in particolare le definizioni di Full Scene AntiAliasing (FSAA), Edge AntiAliasing (EAA), MultiSampling AntiAliasing (MSAA) e SuperSampling AntiAliasing (SSAA).

Per farlo, scendiamo un po’ più nel dettaglio delle operazioni di “campionamento e ricostruzione” dell’immagine, partendo da quello che alcuni definiscono approccio di tipo brute force, ovvero il SSAA.  Tralasciando la modalità 2x, come detto, poco efficace, mi limito a fare l’esempio di ciò che accade con l’applicazione del SSAA 4x.

Per ogni pixel si individuano 4 subpixel e, per ciascuno di essi, si calcolano i valori di Y e C relativi. I valori ottenuti vengono interpolati tra di loro, fino ad ottenere un unico valore che sarà una media, pesata o meno a seconda del tipo di algoritmo, di questi 4 campioni. La scelta della griglia di campionamento e ricostruzione può essere fatta in diversi modi con differenti livelli di efficacia. Qui di seguito, sono riportati gli esempi di Ordered Grid SSAA e di Rotated Grid SSAA

Img1

Il primo ad essere implementato è stato l’OG SSAA, in quanto più semplice da implementare. Il SSAA RG, infatti, prevede un ulteriore passaggio prima dell’output, ovvero la rotazione della griglia del filtro ricostruttore. Questa operazione può essere affetuata servendosi di buffer supplementari, detti accumulation buffer, il cui utilizzo, però, prevede che l’operazione di jittering, ovvero di rotazione, avvenga via software con notevole impiego di bandwidth.

3dFX, con la Voodoo 5, risolse il problema abbinando agli accumulation buffer un circuito che si occupava dell’operazione di interpolazione e rotazione in hardware e inviava i campioni filtrati direttamente alla ramDAC. In modalità SSAA 4x, i due VSA-100 operavano su 2 sample ciascuno e i rispettivi valori erano immagazzinati in altrettanti T-buffer e ricombinati immediatamente a monte della ramDAC. In tal modo si risparmiava banda passante e non si avevano immagini alla display resolution nel frame buffer. La tecnologia in oggetto permise a 3dFX di ottenere un’eccellente implementazione dell’antialiasing, superiore a quella della concorrenza a parità di “costo computazionale”.

Il SSAA presenta, però, degli inconvenienti. Innanzitutto è applicato a tutta la scena (FSAA) e, di conseguenza, risulta molto pesante a livello di calcoli, richiede molto spazio all’interno del frame buffer, spreca molta bandwidth. Inoltre, l’azione di un filtro di questo tipo è quella di impastare i colori, attenuando le brusche transizioni di C e Y (corrispondenti a frequenze di segnale elevatissime). Questa azione, da un lato attenua i disturbi da aliasing, dall’altro, agendo anche dove non serve, fa perdere profondità all’immagine. Le soluzioni sono diverse: l’utilizzo di algoritmi più sofisticati di semplici interpolazioni lineari; l’adozione di filtri più selettivi.

La strada che si è seguita, dopo la generazione dei chip DX7, è stata la seconda.

Fanno così la loro comparsa gli algoritmi di tipo MSAA che non agiscono più sull’intera immagine ma solo sui bordi dei poligoni.

Il principio del MSAA è analogo a quello del SSAA ma, in questo caso, per ogni pixel si selezionano n sample, disposti secondo la griglia prevista dal tipo di algoritmo scelto,  e si attribuisce a tutti il valore di Y e C del pixel d’origine. Questo tipo di filtro è meno raffinato rispetto al SSAA e la sua azione di attenuazione delle transizioni è meno efficace. In maniera grossolana, potremmo dire che l’azione principale di questo filtro è quella di ispessire quei bordi dei poligoni in cui compaiono le scalettature, riducendo la visibilità di queste ultime. Anche per il MSAA esistono le due modalità OG e RG, come appare in figura, dove il pixel originario è quello blu al centro e i subsample i 4 rossi.

msaa-og-e-rg.bmp

Da questa immagine appare chiaro uno dei motivi per cui una griglia di tipo rotated risulta più efficace di una  di tipo ordered: si raddoppia il numero di assi percepiti in ogni direzione (le linee verdi che passano per i subpixel); in tal modo diminuisce la loro reciproca distanza aumentando la sensazione di “confusione” percepita. In pratica si inganna meglio il sistema occhio-cervello, sfruttando i limiti del potere risolutivo spaziale del primo e la capacità di ricostruire l’immagine anche con dati parziali da parte del secondo.

Per cercare di ottenere prestazioni migliori senza penalizzare troppo la qualità, nVIDIA introduce un tipo di MSAA RG denominato Quincunx il cui principio di base è molto semplice: simulare un algoritmo di tipo RGMS 4x utilizzando due soli sample. Il risultato è quello in figura

Img2

Come si vede dalla prima immagine, per ogni pixel sono generati 2 subpixel; nella seconda figura si hanno in totale 4 pixel  e 8 subpixel scelti in posizione tale per cui ognuno fa da subpixel per gli altri circostanti. In realtà questo algoritmo produce effetti migliori rispetto ad un MSAA OG 4x e di poco superiori ad un MSAA 2x di tipo jittered, ma non è comparabile ad un 4x RGMS anche perchè i subpixel sono allocati lungo direttrici poste a 45° con gli assi X e Y.

Sempre in tema di algoritmi di MSAA, invece, ATi  con il suo Smoothvision introduce, per la prima volta, un pattern di tipo fully jittered

jittered-msaa.bmp

Con questo tipo di griglia si possono ottenere risultati paragonabili o superiori a quelli di un MSAA RG anche se 4 sample per pixel sono ancora in numero insufficiente per generare la quantità di white noise sufficiente ad ottenere un filtraggio ottimale.

Gli algoritmi di tipo MSAA, come detto, applicano il filtro in maniera selettiva agendo solo sui bordi dei poligoni; sono filtri di tipo  BOX e devono essere affiancati da algoritmi di edge detect che agiscono a livello di depth-buffer. Nel prossimo articolo approfondiremo alcuni di questi concetti e seguiremo l’evoluzione degli algoritmi di antialiasing, con un cenno ai filtri bilineari ed alla loro attuale implementazione, a quelli che fanno uso di fully jittered grid con un numero elevato di sample e a ciò che prevedono le nuove API.

12 Commenti »

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.

  • # 1
    TheFoggy
     scrive: 

    Il Quincunx! Mi ricordo che, per chi ce l’aveva, era un po’ come dire “io ce l’ho più lungo!”! Anche se, a dire il vero, le differenze implementative erano visibili eccome, in quanto l’immagine era meno “antialiasata” o più “aliasata”, come preferite, rispetto ad un MSAA 4x standard! Però, faceva decadere meno le prestazioni.. Domanda: il modello Quincunx è ancora utilizzato da NVidia, oppure sono passati ad altro? Perchè continuo a notare dei valori di AA maggiori per le loro schede, rispetto a quelle ATi, che però (a parità di sample), hanno un dettaglio superiore (un 4x ATi è quasi un 8x NVidia).
    Per il resto, due piccoli errori di battitura:
    – appena prima del discorso quincunx c’è un “del secondo” ripetuto
    – nel paragrafo Quincunx si legge “allgitmo”, invece di “algoritmo”.
    Quel che è certo è che questi errorini, non inficiano la qualità di questo trattato, interessante e ben articolato! Bravo Yossarian!

  • # 2
    yossarian (Autore del post)
     scrive: 

    No, il quincunx è stato abbandonato anche perchè, nel frattempo, sono aumentate le potenze di calcolo delle gpu e si è deciso di iniziare a privilegiare la qualità dei filtri rispetto alla velocità di elaborazione (potendoselo permettere proprio grazie a questa aumentata potenza di calcolo). Questo trend risulta evidente anche dalle scelte fatte per l’anisotropic filtering nel corso degli anni e col susseguirsi delle generazioni di chip grafici.
    Per quqnto riguarda l’antialising, ad oggi, l’implementazione migliore, che poi è anche quella che fa uso di più sample, è la CFAA di ATi (di cui parlerò la settimana prossima) che è l’unica che fa realmente uso di un numero di sample superiore a 8 (arriva fino a 24 subpixel reali), con fully jittered grid. L’impatto sulle prestazioni è notevole, ma il risultato è veramente buono.

    Grazie per le segnalazioni di errore e per i complimenti

  • # 3
    James Kirk
     scrive: 

    Grande Joss sempre bravissimo … dai tempi dei forum di NGI.

  • # 4
    Edoardo Costa
     scrive: 

    NVIDIA sta per sfornare un nuovo filtro per l’aliasing, verosimilmente verrà presentato con l’introduzione delle nuove gpu per fine anno.
    qualcuno consce qualche dettaglio in più? dicono che avrà un rendimento strepitoso, ma si sa di cosa si tratta?

  • # 5
    yossarian (Autore del post)
     scrive: 

    @ Edoardo Costa

    Con filtri di tipo box, come quelli implementati nelle render back-end dei chip grafici, le tecniche che garantiscono risultati qualitativamente migliori sono quelle che fanno uso di pattern di tipo fully jittered con almeno 16 sample. Un passo avanti si farebbe con l’adozione di filtri di tipo tent con edge detection. Già con le dx10.1, però, è prevista anche l’adozione di filtri di tipo custom (implementati tramite alu o shader unit che dir si voglia), che fanno uso di algoritmi non lineari che garantirebbero risultati decisamente superiori (il filtro ideale sarebbe una funzione di tipo sinc)

  • # 6
    Tecniche di filtraggio: Antialiasing III parte. - Appunti Digitali
     scrive: 

    […] scorso articolo avevamo iniziato a descrivere le tecniche di antialiasing utilizzate dai produttori di chip grafici […]

  • # 7
    shodan
     scrive: 

    Ciao yossarian,
    volevo segnalarti che, sebbene ATI pubblicizzasse il suo SmoothVision come capace di utilizzare dei sample con pattern psedo-randomica, in effetti era un sempice SSAA.

    Qui trovi un’analisi piuttosto articolata:
    http://www.xbitlabs.com/articles/video/display/antialiasing.html#sect4

    Complimenti per gli articoli, bellissimi da leggere!

  • # 8
    yossarian (Autore del post)
     scrive: 

    @ shodan

    in realtà un pattern fully jittered non esiste neppure ora per una serie di motivi.
    I principali sono che con pochi sample non si hanno vantagi evidenti dall’utilizzo di una griglia ocn disposizione dei campioni di tipo random e, inoltre, in caso di MSAA, non è possibile abbinare un algoritmo di edge detect ad una griglia di tipo fully jittered; questo perchè per rendere efficace l’edge detect si deve avere la certezza che i sample cadano a cavallo della linea su cui si deve fare AA e con pochi cmapioni e disposizione casuale non si ha questa certezza. Per questo motivo, anche le attuali griglie “fully jittered” lavorano con un gruppo di sample che occupano posizioni fisse oppure variabili tra un numero ridotto di posizioni di una griglia predeterminata mentre quelle extra generate dalle rop’s hanno realmente una disposizione casuale.
    In quanto all’efficacia, tecnicamente parlando, a parità di tipologia di algoritmo, non esiste un pattern che garantisce risultati migliori di un altro. Quella che cambia è la percezione soggettiva: poichè il sistema occhio-cervello è più sensibile a disposizioni ordinate, un pattern ordered grid risulta poco efficace, un rotated grid appare migliore, un RG con rotazione random tra pixel adiacenti ancora migliore e una di tipo random o parzialmente random superiore a tutti. Questo per il semplice motivo che questo tipo di disposizione genera quello che viene percepito come rumore meno “fastidioso” che “copre” il rumore da aliasing.
    Dall’analisi di xbit labs è naturale che emerga che l’AA applicato da R200 è di tipo SS, come quello applcato da RV770 o GT200 è di tipo MS. Quella che cambia è la griglia utilizzata che, sulla carta, risulta più efficace. Nella pratica i vantaggi di questo tipo di griglia con un numero esiguo di sample è piuttosto ridotta.

  • # 9
    shodan
     scrive: 

    Ciao yossarian,
    grazie per le info aggiuntive.

    Riguardo all’articolo di xbitlabs, il punto è che, secondo l’autore, R200 applica un normalissimo OG SSAA.
    In effetti, avendo usato per anni una R8500, posso confermare che anche guardando il monitor da 1 cm di distanza l’AA di questo chip sembrava usare un pattern ordered-grid e non pseudo-random come pubblicizzato da ATI.

    Poi magari il patter pseudo-random poteva/andava programmato in modo esplicito, mentre la funzione dal pannello di controllo abilitava il normale OG SSAA…

    Ciao.

  • # 10
    PlayStation 3: troppo potente o… troppo complicata da programmare? - Appunti Digitali
     scrive: 

    […] e shadow map di scarsa qualità, poche normal map, assenza di HDR, filtro AA Quincux (anziché MSAA), e infine la presenza di un pesante filtro di blur per smussare le immagini […]

  • # 11
    ATi vs nVidia, the neverending war, II parte: NV40 e G70, le risposte di nVidia - Appunti Digitali
     scrive: 

    […] ad NV3x, riguarda l’implementazione del MSAA che, finalmente, fa uso di pattern di tipo Rotated Grid; appare, invece, aver fatto un passo indietro l’implementazione del filtro anisotropico, […]

  • # 12
    Tecniche di filtraggio: texture mapping and filtering. Prima parte: le texture 2D - Appunti Digitali
     scrive: 

    […] il discorso sull’aliasing, sulle tecniche di antialiasing e su come queste trovino applicazione nei chip grafici. Questa volta faremo un breve cenno alle tecniche di texture mapping e filtering. Nei tre articoli […]

Scrivi un commento!

Aggiungi il commento, oppure trackback dal tuo sito.

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.