In che modo il filtro anisotropico viene generalmente implementato nelle GPU moderne?


14

Il filtro anisotropico "mantiene la nitidezza di una trama normalmente persa dai tentativi della trama della mappa MIP di evitare l'aliasing". L'articolo di Wikipedia fornisce suggerimenti su come può essere implementato ("sondare la trama (...) per qualsiasi orientamento dell'anisotropia"), ma non mi sembra molto chiaro.

Sembrano esserci varie implementazioni, come suggerito dai test illustrati nelle note della presentazione Modelli approssimativi per il rendering basato fisicamente : inserisci qui la descrizione dell'immagine

Quali sono i calcoli concreti eseguiti dalle (moderne) GPU per scegliere il livello MIP corretto quando si utilizza il filtro anisotropico?


3
Le specifiche per GL_EXT_texture_filter_anisotropicsono molto dettagliate. Forse potrebbe aiutarti a capire meglio il processo.
glampert

Risposte:


14

L'hardware del filtro di trama prende diversi campioni dei vari livelli di mipmap (la quantità massima di campioni è indicata dal livello di filtro anisotropico, sebbene l'esatta quantità di campioni prelevati in una determinata operazione di filtraggio dipenderà dalla proporzione tra i derivati ​​sul frammento. ) Se si proietta il cono che visualizza una superficie ad angolo obliquo sullo spazio della trama, si otterrà approssimativamente una sporgenza di forma ovale, che è più allungata per angoli più obliqui. Campioni extra vengono prelevati lungo l'asse di questo ovale (dai livelli di mip corretti, per sfruttare il pre-filtro che offrono) e combinati per dare un campione di trama più nitida.

Un'altra tecnica nota come rip-mapping (menzionata nell'articolo di Wikipedia sul Mipmapping), che non lo ècomunemente presente nelle GPU contemporanee, utilizza il prefiltro delle trame. Contrariamente ai mips, la trama non viene ridimensionata uniformemente ma utilizza vari rapporti altezza-larghezza (fino a un rapporto che dipende dal livello di filtro anisotropico scelto). La variante - o forse due varianti se si utilizza il filtro trilineare - della trama viene quindi scelta in base all'angolo della superficie per ridurre al minimo la distorsione. I valori dei pixel vengono recuperati utilizzando le tecniche di filtro predefinite (bilineare o trilineare). Le rip-map non sono utilizzate in nessun hardware che io conosca a causa delle loro dimensioni proibitive: mentre le mipmap usano un ulteriore 33% di memoria, le ripmap ne usano il 300%. Ciò può essere verificato osservando che i requisiti di utilizzo delle trame non aumentano quando si usa l'AF, ma solo la larghezza di banda.

Per ulteriori letture, potresti dare un'occhiata alle specifiche per l' estensione OpenGL EXT_texture_filter_anisotropic . Descrive in dettaglio le formule utilizzate per calcolare i campioni e come combinarli quando si utilizza il filtro anisotropico.


5
Probabilmente anche le mappe RIP non vengono utilizzate perché non aiutano sul caso diagonale, piuttosto comune. FWIW, se riesci a trovare il codice per Microsoft Refrast, l'implementazione del filtro anistropico in quello è probabilmente un buon riferimento per come lo fa oggi HW.
Simon F

1
"Questo può essere verificato osservando che i requisiti di utilizzo delle trame non aumentano quando si utilizza AF, anzi, solo la larghezza di banda fa." Argomento assassino. Buona risposta!
David Kuri,

Il link "Rasterizzazione del software ad alte prestazioni su GPU" menziona il filtraggio anisotropico solo una volta e non menziona alcun dettaglio. Quindi lo modificherò dalla risposta perché non penso che sia pertinente in modo utile.
yuriks,

@SimonF inoltre possiamo aggiungere che il requisito aggiuntivo di larghezza di banda è piuttosto spaventoso.
v.oddou,

9

I requisiti API possono essere trovati in una qualsiasi delle specifiche o estensioni. Eccone uno: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Tutti i fornitori di GPU probabilmente si discostano dalle specifiche perché la qualità AF faceva parte di molti benchmark. E le attuali implementazioni continueranno a evolversi mentre i nuovi carichi di lavoro sottolineano le approssimazioni esistenti. Sfortunatamente, per sapere esattamente cosa faccia uno dei due, dovrai far parte di una delle aziende. Ma puoi valutare lo spettro delle possibilità dai seguenti documenti, elencati in ordine crescente di qualità e costi di implementazione:

Citando dalle specifiche:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.