Wie wird die anisotrope Filterung normalerweise in modernen GPUs implementiert?

14

Anisotropes Filtern "behält die Schärfe einer Textur bei, die normalerweise durch die Versuche der MIP-Map-Textur verloren geht, Aliasing zu vermeiden". Der Wikipedia-Artikel gibt Hinweise, wie er implementiert werden kann ("Prüfen Sie die Textur (...) auf eine Orientierung der Anisotropie"), aber er ist mir nicht sehr klar.

Es scheint verschiedene Implementierungen zu geben, wie die in den Anmerkungen der Präsentation dargestellten Tests nahe legen. Ungefähre Modelle für physikalisch basiertes Rendern : Bildbeschreibung hier eingeben

Welche konkreten Berechnungen führen (moderne) GPUs durch, um bei Verwendung der anisotropen Filterung den richtigen MIP-Pegel zu wählen?

wischen
quelle
3
Die Spezifikation für GL_EXT_texture_filter_anisotropicist sehr detailliert. Vielleicht hilft es Ihnen, den Prozess besser zu verstehen.
Glampert

Antworten:

14

Die Texturfilterhardware entnimmt mehrere Abtastwerte der verschiedenen Mipmap-Ebenen (die maximale Menge von Abtastwerten wird durch die anisotrope Filterstufe angegeben, obwohl die genaue Menge von Abtastwerten, die in einer gegebenen Filteroperation entnommen werden, von dem Verhältnis zwischen den Ableitungen auf dem Fragment abhängt. ) Wenn Sie den Kegel so projizieren, dass eine Fläche in einem schrägen Winkel auf den Texturraum blickt, ergibt sich ungefähr eine ovale Projektion, die bei schrägen Winkeln länglicher ist. Entlang der Achse dieses Ovals werden zusätzliche Proben entnommen (ausgehend von den richtigen Mip-Pegeln, um die Vorfilterung zu nutzen) und zu einer schärferen Texturprobe kombiniert.

Eine andere Technik, die als Rip-Mapping bekannt ist (im Wikipedia-Artikel über Mipmapping erwähnt), ist dies nichtWird häufig in modernen GPUs verwendet und verwendet das Vorfiltern von Texturen. Im Gegensatz zu Mips wird die Textur nicht gleichmäßig verkleinert, sondern mithilfe verschiedener Höhen-Breiten-Verhältnisse (bis zu einem Verhältnis, das von der gewählten anisotropen Filterstufe abhängt). Die Variante - oder vielleicht zwei Varianten bei Verwendung der trilinearen Filterung - der Textur wird dann basierend auf dem Winkel der Oberfläche ausgewählt, um die Verzerrung zu minimieren. Pixelwerte werden mit Standardfiltertechniken (bilinear oder trilinear) abgerufen. Ripmaps werden in keiner Hardware verwendet, die ich aufgrund ihrer unerschwinglichen Größe kenne: Während Mipmaps zusätzlichen Speicherplatz von 33% belegen, belegen Ripmaps 300%. Dies kann überprüft werden, indem festgestellt wird, dass die Anforderungen an die Texturnutzung bei Verwendung von AF nicht steigen, sondern nur die Bandbreite.

Für weitere Informationen lesen Sie möglicherweise die Spezifikation für die OpenGL-Erweiterung EXT_texture_filter_anisotropic . Hier werden die Formeln für die Berechnung von Stichproben und deren Kombination bei Verwendung der anisotropen Filterung beschrieben.

Yuriks
quelle
5
RIP-Maps werden wahrscheinlich auch nicht verwendet, da sie in dem eher üblichen diagonalen Fall nicht hilfreich sind. FWIW, wenn Sie den Code für Microsoft Refrast finden können, ist die darin enthaltene anistropische Filterimplementierung wahrscheinlich eine gute Referenz für die heutige HW.
Simon F
1
"Dies kann überprüft werden, indem festgestellt wird, dass die Anforderungen an die Texturnutzung bei Verwendung von AF nicht steigen, sondern nur die Bandbreite." Mörderisches Argument. Gute Antwort!
David Kuri
Der Link "Hochleistungs-Software-Rasterisierung auf GPUs" erwähnt die anisotrope Filterung nur einmal im Vorbeigehen und erwähnt keine Details. Also werde ich es aus der Antwort herausschneiden, weil ich nicht denke, dass es auf hilfreiche Weise relevant ist.
Yuriks
@ SimonF können wir auch hinzufügen, dass die zusätzliche Bandbreite Anforderung ziemlich beängstigend ist.
v.oddou
9

Die API-Anforderungen finden Sie in den Spezifikationen oder Erweiterungen. Hier ist eine: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Alle GPU-Hersteller weichen wahrscheinlich von der Spezifikation ab, da die AF-Qualität Bestandteil vieler Benchmarks war. Die aktuellen Implementierungen werden sich weiterentwickeln, da neue Workloads die vorhandenen Annäherungen belasten. Um genau zu wissen, was Sie tun, müssen Sie leider Teil eines Unternehmens sein. Das Spektrum der Möglichkeiten können Sie jedoch anhand der folgenden Dokumente abschätzen, die in aufsteigender Reihenfolge der Qualität und der Implementierungskosten aufgeführt sind:

Zitat aus der Spezifikation:

 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 
ap_
quelle