Meine Frage bezieht sich speziell auf Metal, da ich nicht weiß, ob sich die Antwort für eine andere API ändern würde.
Was ich bisher zu verstehen glaube, ist Folgendes:
Eine Mip-Map-Textur hat vorberechnete "Detailebenen", bei denen niedrigere Detailebenen erzeugt werden, indem die ursprüngliche Textur auf eine sinnvolle Weise heruntergesampelt wird.
Auf Mipmap-Ebenen wird in absteigender Detailebene Bezug genommen, wobei Ebene
0
die ursprüngliche Textur ist und höhere Ebenen eine Potenz-aus-zwei-Reduktion derselben sind.Die meisten GPUs implementieren eine trilineare Filterung, bei der für jedes Sample zwei benachbarte Mipmap-Ebenen ausgewählt, Samples von jeder Ebene mit bilinearer Filterung abgetastet und diese Samples dann linear gemischt werden.
Was ich nicht ganz verstehe, ist, wie diese Mipmap-Ebenen ausgewählt werden. In der Dokumentation für die Metal-Standardbibliothek sehe ich, dass Proben mit oder ohne Angabe einer Instanz eines lod_options
Typs entnommen werden können . Ich würde annehmen, dass dieses Argument die Auswahl der Mipmap-Ebenen ändert und es anscheinend drei Arten von lod_options
2D-Texturen gibt:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Leider wird in der Dokumentation nicht erläutert, was diese Optionen bewirken. Ich kann mir vorstellen, dass bias()
einige automatisch gewählte Detaillierungsgrade voreingenommen sind, aber was bedeutet dann die Voreingenommenheit value
? Auf welcher Skala arbeitet es? In ähnlicher Weise wird die lod
von level()
in diskrete Mipmap-Ebenen übersetzt? Und unter der Annahme, dass gradient2d()
der Gradient der Texturkoordinate verwendet wird, wie wird dieser Gradient zur Auswahl des Mipmap-Levels verwendet?
Noch wichtiger ist, wenn ich das weglasse lod_options
, wie werden dann die Mipmap-Ebenen ausgewählt? Unterscheidet sich dies je nach Art der ausgeführten Funktion?
Und wenn die standardmäßige, von no lod options festgelegte Operation der sample()
Funktion so etwas wie gradient2D()
(zumindest in einem Fragment-Shader) ist, werden einfache Bildschirmableitungen verwendet oder es wird direkt mit Rasterizer- und interpolierten Texturkoordinaten gearbeitet man eine genaue Steigung berechnet?
Und 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 komplexe gerätespezifische Mipmap-Auswahl, aber ich weiß nicht, ob die Mipmap-Auswahl auf neueren Architekturen besser definiert ist.