2017-08-26 4 views
1

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.

Antwort

0

Dies ist ein relativ großes Thema, das Sie besser auf https://computergraphics.stackexchange.com/ fragen könnte, aber sehr kurz, Papier Lance Williams "Pyramidal Parametrics" die trilineare Filterung eingeführt und die Begriff ‚MIP-Mapping‘, hat einen Vorschlag, der von Paul kam Heckbert (siehe Seite 3, 1. Spalte), von dem ich denke, dass er in manchen Systemen bis zu einem gewissen Grad noch verwendet werden kann.

Tatsächlich basieren die Ansätze zur Berechnung der MIP-Kartenebenen normalerweise auf der Annahme, dass Ihr Bildschirmpixel ein kleiner Kreis ist und dieser Kreis wieder auf die Textur abgebildet werden kann, um ungefähr eine Ellipse zu erhalten. Sie schätzen die Länge der längeren Achse in Texeln der Karte mit der höchsten Auflösung. Dies sagt Ihnen dann, welche MIP-Karten Sie probieren sollten. Wenn die Länge beispielsweise 6 ist, d. H. Zwischen 2^2 und 2^3, möchten Sie die MIP-Kartenebenen 2 und 3 überblenden.

Verwandte Themen