Grafica FS2004
file:///C:/Documents%20and%20Settings/arrex/Documenti/arrexhomepage/newhome/arrexvfr/Template.html
Filtraggio delle Texture


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.