Abbiamo già spiegato
come ad ogni punto (pixel) dello schermo debba essere (in
generale) assegnato un punto (texel) di una o più
texture. Questo avviene nello stadio di multisampling della
pipeline 3D. Purtroppo una corrispondenza punto a punto non
esisterà mai e non solo per una questione di leggi di
Murphy, ma perché è onestamente improbabile che
esista una texture che abbia la stessa forma e dimensione
fisica (in termini di punti) dell'area nella quale deve essere
applicata. Quello che succederà è che ad ogni
pixel corrisponderà un certo numero di texel oppure che
un singolo texel sia assegnato ad certo numero di pixel. Un
esempio del primo caso è quando un oggetto si trova in
lontananza e quindi occupa un'area molto piccola dello
schermo, più piccola della risoluzione della relativa
texture. La texture dovrà quindi essere "ristretta"
affinché possa entrare in quella posizione e quindi
più punti di essa (texel) dovranno essere mappati sullo
stesso pixel. Viceversa un esempio del secondo caso è
quando un poligono è molto vicino, quindi molto
grande... più grande della risoluzione della texture.
Per cui in questo caso lo stesso texel dovrà mappare
più pixel.
In entrambi i casi l'immagine subirà delle aberrazioni.
Sono inevitabili. Per cominciare, analizziamo il secondo caso,
quello peggiore: si può fare molto poco per migliorare
la situazione, in quanto il materiale a disposizione
(risoluzione della texture) non ha informazioni sufficienti
per colmare il problema di perdita di qualità. Un
tipico esempio. Le texture di landclass di Flight Simulator
hanno una risoluzione di 4.8 metri/pixel, il che significa che
ogni texel rappresenta un quadrato di 4.8 x 4.8 metri quadri.
Ora se la quota da cui guardiamo il suolo è tale per
cui un pixel sullo schermo è più piccolo di 4.8
x 4.8 metri quadri, non possiamo farci nulla! I dettagli
mancanti non possiamo inventarli. Non ci sono. E la principale
evoluzione in FSX, a mio avviso, sta proprio nel fatto che
permette di avere una risoluzione di landclass maggiore. Ok,
c'è il sistema di resolution enhancement che permette
di disegnare una trama ad alta risoluzione sui pixel e che
è gestito dal pixel shader, ma è un artificio
onestamente poco convincente.
Come si comporterebbe la scheda video in questi casi?
Semplicemente disegnerebbe lo stesso texel su più
pixel. L'aspetto che assumerebbe l'immagine è pessimo,
in quanto si vedrebbero dei quadratoni colorati uniformemente,
come mostrato in questa figura.
La tecnica che si usa in questo caso per migliorare un po' la
situazione, è definita filtraggio bilineare: il colore dei punti
è frutto di una semplice interpolazione lineare tra il
colore del texel in questione con quello dei 2 texel
più vicini (se ad esempio si è vicini al bordo
superiore destro del texel il filtraggio sarà fatto con
il texel superiore e quello più a destra), da cui il
nome filtro bilineare. Il risultato è quello
apprezzabile nell'immagine sottostante, la stessa di prima ma
con filtro bilineare attivo.
L'immagine è quindi più sfumata e meno nitida,
ma più piacevole... è un artefatto, quello che
si vede ha comunque la risoluzione della texture di partenza.
Nel caso invece in cui le texture debbano essere
rimpicciolite, in teoria siamo in vantaggio! Le informazioni
stavolta ci sono ed in abbondanza, tanto che dobbiamo
toglierne qualcuna... ma quale? Ed è qui il bello!
Decidere quale è qualcosa di computazionalmente molto
più dispendioso che "inventarsi" informazioni come nel
caso precedente.
Una prima tecnica, banale, consiste nel fare una media per
ogni pixel del colore di tutti i texel che ci finirebbero
sopra. La tecnica è molto dispendiosa dal punto di
vista computazionale; pensiamo sempre alle texture del
terreno: ogni punto in lontananza potrebbe mappare anche
un'area di 70 x 70 metri quadri, che corrispondono a
più di 200 punti di una texture tradizionale!
Interpolare 200 punti tra di loro si può fare ed il
risultato lo si può intuire nell'immagine sottostante:
si nota un po' di rumore, visto che di fatto tutti i punti
dell'interpolazione contano allo stesso modo, siano essi
più o meno vicini all'osservatore. Il vero problema
è però il dispendio di potenza.
Una prima tecnica per migliorare la situazione prende il nome
di Mip Mapping. Si
tratta di fornire la stessa texture in diverse versioni,
ciascuna con una risoluzione dimezzata rispetto alla
precedente. Per cui se la risoluzione massima delle texture di
landclass ha 4.8 metri/pixel ed è di 256x256, il primo
mipmap sarà di 128x128 pixel (con una risoluzione di
9.6 metri), il terzo di 64x64 e così via. Queste
immagini sono già calcolate e presenti nella stessa
texture; l'algoritmo usato per calcolarle non ci interessa; il
lavoro è giù stato fatto e su queste immagini la
scheda video lavora direttamente.
Se una texture deve essere applicata ad una superficie troppo
piccola, viene usata la versione a mip map inferiore. Questo
anzitutto permette di risparmiare molta potenza elaborativa e
in secondo luogo riduce l'effetto rumore. Ovviamente, come
tutte le texture a risoluzione insufficiente, e' possibile
applicare un filtraggio bilineare. In Flight Simulator si usa
principalmente questa tecnica per rendere l'effetto distanza,
con il risultato mostrato nell'immagine sottostante.
Una limitazione di questo è che l'interpolazione del
filtro bilineare viene fatta solo a livello della stessa
texture. Due mip map adiacenti non hanno alcuna interpolazione
e la transizione tra i due livelli è molto evidente.
È possibile ridurla con un filtro più potente
che viene detto Trilineare:
la terza dimensione riguarda proprio il passaggio tra due mip
adiacenti. Se però il filtraggio bilineare non comporta
quasi alcun aggravio computazionale (è usato sempre per
cui è una funziona altamente ottimizzata nella scheda
video), il filtraggio trilineare è molto più
pesante; il risultato che si ottiene è illustrato nella
seguente figura, e come si vede produce miglioramenti minimi,
di sicuro non tali da giustificare la sua adozione a scapito
di un generale appesantimento.
Concludiamo la carrellata dei filtri spendendo qualche parola
sul filtro più potente che al momento esiste: il filtro
anisotropico. Quando una superficie non perpendicolare al
punto di osservazione, la medesima sarà in genere
schiacciata. In questo caso il filtro bilineare o trilineare
non riesce a dare ottimi risultati, in quanto non tiene conto
delle aberrazioni che si provocano distorcendo la superficie
di applicazione. Tipico esempio, il terreno di Flight
Simulator, ancora una volta. Le texture sono quadrate
perché si applicano su superfici quadrate. Ma l'angolo
di osservazione accentuato rende in due dimensioni quel
quadrato un trapezio o peggio un quadrilatero non regolare.
Il filtro anisotropico è in grado di interpolare una
texture in modo non lineare nelle due direzioni e tenere
quindi conto dell'aberrazione che si introduce distorcendole.
Vengono fatte interpolazioni su un numero di campioni
selezionabile dall'utente (i valori 2x, 4x, 8x, 16x
dell'impostazione); più campioni si prendono più
la resa è migliore e più lo sforzo
computazionale aumenta; la tecnica si combina poi con il
filtraggio bilineare o trilineare. Il risultato è
apprezzabile nella prossima figura, ma bisogna sottolineare
come questo sistema sia molto pesante e rallenti molto il
frame rate. Personalmente trovo che sia l'unico modo in Flight
Simulator per rendere decentemente la nitidezza a distanza, e
suggerisco di accoppiarlo a al filtro bilineare; il filtro
anisotropico va attivato dalle impostazioni della scheda video
e non direttamente in FS.