Per comprendere la natura del filtro anisotropico, è necessario avere una solida conoscenza di cosa significhi realmente la mappatura delle trame.
Il termine "mappatura delle trame" significa assegnare posizioni su un oggetto a posizioni in una trama. Ciò consente al rasterizzatore / shader di, per ogni posizione sull'oggetto, recuperare i dati corrispondenti dalla trama. Il metodo tradizionale per fare ciò consiste nell'assegnare a ciascun vertice su un oggetto una coordinata di trama, che mappa direttamente quella posizione su una posizione nella trama. Il rasterizzatore interpolerà questa coordinata di trama attraverso le facce dei vari triangoli per produrre la coordinata di trama utilizzata per recuperare il colore dalla trama.
Ora, pensiamo al processo di rasterizzazione. Come funziona? Prende un triangolo e lo scompone in blocchi di dimensioni pixel che chiameremo "frammenti". Ora, questi blocchi di dimensioni pixel hanno dimensioni di pixel rispetto allo schermo.
Ma questi frammenti non hanno dimensioni in pixel rispetto alla trama. Immagina se il nostro rasterizzatore generasse una coordinata di trama per ogni angolo del frammento. Ora immagina di disegnare quei 4 angoli, non nello spazio dello schermo, ma nello spazio delle trame . Che forma sarebbe?
Bene, questo dipende dalle coordinate della trama. Cioè, dipende da come la trama è mappata sul poligono. Per ogni particolare frammento, potrebbe essere un quadrato allineato agli assi. Potrebbe essere un quadrato non allineato sull'asse. Potrebbe essere un rettangolo. Potrebbe essere un trapezio. Potrebbe essere praticamente qualsiasi figura a quattro facce (o almeno, quelle convesse).
Se si stesse eseguendo correttamente l'accesso alla trama, il modo per ottenere il colore della trama per un frammento sarebbe capire qual è questo rettangolo. Quindi recupera ogni texel dalla trama all'interno di quel rettangolo (usando la copertura per ridimensionare i colori che si trovano sul bordo). Quindi fai una media di tutti insieme. Sarebbe una perfetta mappatura delle trame.
Sarebbe anche estremamente lento .
Nell'interesse della performance, cerchiamo invece di approssimare la vera risposta. Basiamo le cose su una coordinata di trama, piuttosto che sulle 4 che coprono l'intera area del frammento nello spazio texel.
Il filtro basato su mipmap utilizza immagini a bassa risoluzione. Queste immagini sono fondamentalmente una scorciatoia per il metodo perfetto, pre-calcolando come apparirebbero grandi blocchi di colori quando mescolati insieme. Pertanto, quando seleziona una mipmap inferiore, utilizza valori pre-calcolati in cui ogni texel rappresenta un'area della trama.
Il filtro anisotropico funziona approssimando il metodo perfetto (che può e dovrebbe essere accoppiato al mipmapping) prendendo fino a un numero fisso di campioni aggiuntivi. Ma come riesce a capire l'area nello spazio texel da cui recuperare, dato che ha ancora una sola coordinata di trama?
Fondamentalmente, imbroglia. Poiché gli shader di frammenti vengono eseguiti in blocchi adiacenti 2x2, è possibile calcolare la derivata di qualsiasi valore nello shader di frammento nello spazio dello schermo X e Y. Quindi utilizza queste derivate, accoppiate con le coordinate della trama effettiva, per calcolare un'approssimazione di quale sarebbe l'impronta della trama del vero frammento. E quindi esegue un numero di campioni all'interno di quest'area.
Ecco un diagramma per aiutarti a spiegarlo:
I quadrati in bianco e nero rappresentano la nostra trama. È solo una scacchiera di 2x2 texel bianchi e neri.
Il punto arancione è la coordinata della trama per il frammento in questione. Il contorno rosso è l'impronta del frammento, che è centrato sulla coordinata della trama.
Le caselle verdi rappresentano i texel a cui potrebbe accedere un'implementazione del filtro anisotropico (i dettagli degli algoritmi di filtro anisotropico sono specifici della piattaforma, quindi posso solo spiegare l'idea generale).
Questo particolare diagramma suggerisce che un'implementazione potrebbe accedere a 4 texel. Oh sì, le caselle verdi ne coprono 7, ma la casella verde al centro potrebbe recuperare da una mipmap più piccola, recuperando così l'equivalente di 4 texel in un solo recupero. L'implementazione peserebbe ovviamente la media per quel recupero di 4 rispetto a quelli single texel.
Se il limite di filtro anisotropico fosse 2 anziché 4 (o superiore), l'implementazione selezionerebbe 2 di quei campioni per rappresentare l'impronta del frammento.