Cos'è il filtro anisotropico e come impatta sulla GPU nei videogiochi

Il filtro anisotropico è una delle voci sempre presenti nelle impostazioni grafiche dei motori di gioco, il cui effetto però non sempre viene compreso.

Cos'è il filtro anisotropico e come impatta sulla GPU nei videogiochi
Articolo a cura di

I titoli per PC offrono agli utenti la possibilità di modificare, in maniera più o meno approfondita, i settaggi grafici, in modo da adattare la resa finale all'hardware di gioco a loro disposizione. I motori grafici utilizzati nei videogiochi sono sempre più complicati e si trovano nelle impostazioni parametri sempre più difficili da interpretare. Il filtro anisotropico è uno dei parametri che potremmo definire "vecchio stampo", che ha passato indenne molteplici stadi evolutivi ed è presente nelle opzioni grafiche ormai da molto tempo: il suo apporto è più importante di quanto si pensi ed in determinati contesti può fare una grande differenza in termini di qualità finale. Teniamo a precisare che alcune nozioni presenti in questa guida sono state semplificate per consentire la comprensione del testo a tutti gli utenti, senza però snaturare l'argomento.

Il mipmapping per l'uso efficiente delle texture

Molti utenti hanno sicuramente sentito parlare del filtro anisotropico in associazione all'anti-aliasing, come se fossero due facce di una stessa medaglia. In verità i due filtri sono piuttosto diversi, in quanto l'anti-aliasing lavora sui contorni degli oggetti 3D, tentando di renderli meno spigolosi e seghettati. Il filtro anisotropico effettua operazioni sulle texture, cioè il "rivestimento" degli oggetti 3D. Le texture possono rappresentare il materiale di un determinato oggetto e sono in grado di simulare per esempio il legno, il marmo, la pelle o il metallo. Per comprendere fino in fondo il filtro anisotropico, il concetto da far proprio è quello di mipmapping.
Una mipmap è una versione a bassa risoluzione della texture di un oggetto, sfruttata per effettuare il rendering più velocemente e ridurre - a risultato finito - gli artefatti. Per esempio, supponiamo di avere la texture di un muro in mattoni, che normalmente sarebbe grande 512 x 512 pixel. Se siamo in gioco e ci troviamo molto vicini ad una parete che possiede la suddetta texture allora potremmo osservarla in modo piuttosto nitido e dettagliato, e sino a questo punto tutto funziona come dovrebbe. Il problema nasce però quando ci allontaniamo dalla parete: ha veramente senso continuare ad usare una texture 512 x 512? La risposta è no, in quanto andremmo a renderizzare ad elevata risoluzione un'area che sarebbe via via più piccola quanto più ci allontaniamo, perdendo dettagli in ogni caso.

Il risultato sarebbe un consumo inutile di risorse, perché da lontano continueremmo a vederla comunque sfocata (per la draw distance). La soluzione a tale problematica è quindi, come potrete immaginare, proprio il mipmapping. Invece di utilizzare la texture a risoluzione massima ne viene impiegata una a risoluzione minore, che è più bassa quanto più è elevata la distanza dell'osservatore. Per ogni texture, quindi, ogni motore grafico conserva in memoria copie a risoluzione più bassa della stessa, da applicare poi a seconda della lontananza. Ad esempio: da 0 a 10 metri si applica la versione originale a 512 x 512 pixel, da 10 a 100 metri si utilizza invece la variante scalata a 256 x 256, da 100 a 1000 metri si preferisce invece la versione 128 x 128 e via dicendo. Così facendo le risorse vengono ottimizzate, senza che si perda qualità visiva.

Il mipmapping in azione ed il trilinear filtering

Prendiamo come riferimento l'immagine che trovate sulla vostra sinistra, all'inizio di questo capitolo, che appartiene alla suite di test di 3DMark. Essa rappresenta un tunnel di forma cilindrica, con le pareti a cui è stato applicato un texture pattern di test in bianco a nero. Come si può facilmente notare, il "tubo" restituisce bene l'effetto di profondità e le texture non sono piatte. Questo accade grazie alla tecnica nota come bilinear filtering (filtraggio bilineare), mediante il quale il colore di ogni pixel dell'immagine è determinato fondendo assieme più texture. La particolarità risiede nel fatto che le texture non sono diverse, ma provengono tutte dalla stessa mipmap, ed è quindi un insieme (messo su sapientemente) di sample a risoluzione nativa e scalata. Le varianti a risoluzione minore vengono impiegate sul fondo del tunnel, mentre quelle a risoluzione massima sono quelle che percepiamo più vicine. Le frecce rosse puntano, a scopo di esempio, verso due diverse versioni della stessa texture, in cui la porzione più lontana è senza dubbio meno nitida e più sfocata.
I più attenti avranno notato che le transizioni fra un livello e l'altro dell'immagine non sono proprio dolcissime, complice un gradiente troppo scarno.

La soluzione a questo problema si chiama trilinear filtering (filtraggio trilineare) che, anziché effettuare l'operazione solo su due assi (x ed y, come fa il bilineare), aggiunge al mix un'altra dimensione, con cui si vanno a campionare sample fra due livelli della mipmap. Il risultato è molto buono, come potete vedere dalla seconda immagine, poiché è ridotta la durezza fra una transizione e l'altra. C'è però ancora qualcosa che non va, soprattutto nelle zone più profonde. E' qui che entra in gioco il filtro anisotropico.

Il ruolo del filtro anisotropico

Il termine "isotropico" indica qualcosa che è omogeneo su tutte le direzioni. "Anisotropico", invece, si riferisce a qualcosa che è dipendente dalla direzione. Il filtro anisotropico è quindi un filtraggio che varia a seconda del punto di vista dell'osservatore, che agisce sulle texture e il cui numero di sample dipende dall'angolatura della telecamera. Molto in generale, più elevato è l'angolo rispetto all'oggetto e più i campioni da prendere aumentano.
La sua utilità, come avrete capito, viene così persa quando guardiamo una superficie o un oggetto 3D in maniera perpendicolare (ad es. se il muro è di fronte a noi). In questa situazione effettuare il filtraggio anisotropico non è necessario e, man mano che ci si allontana, basta far entrare in scena la mipmap giusta ed il gioco è fatto. Se invece guardiamo quella determinata superficie da un'angolatura precisa ci torna utile almeno il filtro bilineare/trilineare, che "sfuma" i differenti livelli di una mipmap.

Il filtraggio trilineare, come abbiamo detto, non è l'ideale, in quanto non si riescono ad ottenere risultati totalmente soddisfacenti. Il filtro anisotropico è capace, rispetto a quest'ultimo, di isolare tantissimi sample; per farci un'idea guardiamo la terza immagine del tunnel poco più su: ad essa è stato applicato un filtro anisotropico ad 8x, il che vuol dire che sono stati presi otto volte i campioni di un trilinear filter. Come vediamo, il fondo del tunnel risulta molto più nitido.

L'anisotropic filter nei videogiochi

Nei videogiochi la differenza tra l'utilizzo o meno del filtro anisotropico è sicuramente variabile, ma in alcuni il filtro ha una valenza maggiore. Nei titoli RTS, ad esempio, la telecamera ha un'angolazione fissa rispetto al terreno, che possiamo considerare come visuale isometrica per semplificare. In queste condizioni l'anisotropic filter non è così necessario, in quanto l'angolo in genere non è molto elevato. Il discorso è invece totalmente opposto nei titoli dedicati alle automobili, nei simulatori di volo oppure nei giochi di ruolo, in cui la tecnica dà il proprio massimo per la forte variabilità dell'angolazione a cui sono soggetti telecamera e ambiente circostante. Infine, gli sparatutto possono essere considerati un buon mix fra la massima e la nulla utilità.
Per comprendere nella pratica come funziona il filtro anisotropico con i videogiochi, prendiamo un esempio effettuato da NVIDIA e postato sul sito geforce.com. Il titolo di riferimento è Lord of the Rings Online, un MMORPG in cui la differenza fra filtro applicato e non è netta.
Nell'immagine più a sinistra non c'è alcun effetto anisotropico, ma abbiamo solo un filtro bilineare: in tale scenario si vede come le pietre della pavimentazione stradale vadano a sfocarsi tantissimo col salire della distanza visiva. Se inoltre guardiamo con più attenzione siamo perfettamente in grado di scorgere i vari livelli della mipmap impiegata per quella texture. Spostandoci più a destra troviamo lo stesso ambiente ma col filtro trilineare che, seppur renda le transizioni fra i livelli della mipmap meno visibili, tende comunque a far perdere nitidezza alla pavimentazione. In lontananza, infatti, le pietre non sono più distinguibili e l'impressione è quella di avere solo una massa uniforme di color grigio. Abilitando invece l'anisotropic filter possiamo agevolmente prendere coscienza del miglioramento in termini grafici, già con il filtro impostato a 4x. Con i sample a 16x si ha infine una rappresentazione pressoché perfetta dei ciottoli sulla distanza. Da notare è che, seppur il muretto di fronte al personaggio sia fatto della stessa texture, essa non cambia al variare del filtro del filtro anisotropico: il motivo è che quella superficie si trova in una posizione frontale e non angolata, per cui l'impiego o meno del filtro è sicuramente trascurabile.