Meine Frage bezieht sich speziell auf Metal, da ich nicht weiß, ob sich die Antwort für eine andere API ändern würde.Wie werden Mipmapped-Texturen abgetastet?
Was ich glaube, ich so weit zu verstehen, ist dies:
A mipmapped Textur hat vorberechnet „Detailebenen“, wo niedrigere Detailebenen erstellt werden, indem die ursprüngliche Textur in irgendeiner sinnvollen Weise Abwärtsabtastens.
Mipmap-Levels werden in absteigender Detailebene bezeichnet, wobei Level
0
die ursprüngliche Textur ist und höhere Ebenen sind Zweierpotenzreduktionen.Die meisten GPUs implementieren eine trilineare Filterung, die zwei benachbarte Mipmap-Ebenen für jedes Sample auswählt, Samples von jedem Level mit bilinearer Filterung und dann linear diese Samples mischt.
Was ich nicht ganz verstehe, ist, wie diese Mipmap-Ebenen ausgewählt sind. In der documentation für die Metal-Standardbibliothek sehe ich, dass Proben mit oder ohne Angabe einer Instanz eines Typs genommen werden können. Ich würde davon ausgehen, dass dieses Argument ändert, wie die MipMap Ebene ausgewählt werden, und es gibt offenbar drei Arten von lod_options
für 2D-Texturen:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Leider ist die Die Dokumentation erklärt nicht, was diese Optionen tun. Ich kann schätzen, dass bias()
einige automatisch gewählte Detailebene vorbelastet, aber was bedeutet dann die Verzerrung value
? Auf welcher Skala läuft es? Ähnlich, wie wird die lod
von level()
in diskrete Mipmap-Ebenen übersetzt? Und unter der Annahme, dass gradient2d()
den Gradienten der Textur-Koordinate verwendet, wie verwendet es diesen Gradienten, um die Mipmap-Ebene auszuwählen?
Noch wichtiger, wenn ich die weglasse, wie sind dann die Mipmap-Ebenen ausgewählt? Ist dies abhängig von der Art der ausgeführten Funktion?
Und, wenn die Standard-no-lod-Optionen-spezifizierte Operation der sample()
-Funktion etwas wie gradient2D()
(zumindest in einem Fragment-Shader) tun soll, verwendet es einfache Screen-Space-Derivate, oder funktioniert es direkt mit Rasterizer und interpolierten Texturkoordinaten zur Berechnung eines präzisen Gradienten?
Und schließlich, wie konsistent ist dieses Verhalten von Gerät zu Gerät? Ein alter Artikel (alt wie in DirectX 9), den ich gelesen habe, bezog sich auf eine komplexe gerätespezifische Mipmap-Auswahl, aber ich weiß nicht, ob die Mipmap-Auswahl auf neueren Architekturen besser definiert ist.