Um die Natur der anisotropen Filterung zu verstehen, müssen Sie genau wissen, was Texturabbildung wirklich bedeutet.
Der Begriff "Texturabbildung" bedeutet, Positionen auf einem Objekt Positionen in einer Textur zuzuweisen. Dadurch kann der Rasterizer / Shader für jede Position auf dem Objekt die entsprechenden Daten aus der Textur abrufen. Die herkömmliche Methode hierfür besteht darin, jedem Scheitelpunkt eines Objekts eine Texturkoordinate zuzuweisen, die diese Position direkt einer Position in der Textur zuordnet. Der Rasterer interpoliert diese Texturkoordinate über die Flächen der verschiedenen Dreiecke, um die Texturkoordinate zu erzeugen, die zum Abrufen der Farbe aus der Textur verwendet wird.
Lassen Sie uns nun über den Prozess der Rasterung nachdenken. Wie funktioniert das? Es nimmt ein Dreieck und zerlegt es in pixelgroße Blöcke, die wir "Fragmente" nennen werden. Diese pixelgroßen Blöcke sind nun relativ zum Bildschirm pixelgroß.
Diese Fragmente sind jedoch im Verhältnis zur Textur nicht pixelgroß. Stellen Sie sich vor, unser Rasterizer hat für jede Ecke des Fragments eine Texturkoordinate generiert. Stellen Sie sich nun vor, Sie zeichnen diese 4 Ecken nicht im Bildschirmbereich, sondern im Texturbereich . Welche Form wäre das?
Nun, das hängt von den Texturkoordinaten ab. Das heißt, es hängt davon ab, wie die Textur dem Polygon zugeordnet wird. Für ein bestimmtes Fragment kann es sich um ein achsenausgerichtetes Quadrat handeln. Es kann sich um ein nicht achsenausgerichtetes Quadrat handeln. Es könnte ein Rechteck sein. Es könnte ein Trapez sein. Es könnte so ziemlich jede vierseitige Figur sein (oder zumindest konvexe).
Wenn Sie den Texturzugriff korrekt ausführen, können Sie die Texturfarbe für ein Fragment ermitteln, indem Sie herausfinden, um welches Rechteck es sich handelt. Rufen Sie dann jedes Texel aus der Textur in diesem Rechteck ab (verwenden Sie die Abdeckung, um die Farben am Rand zu skalieren). Dann mitteln Sie sie alle zusammen. Das wäre eine perfekte Texturabbildung.
Es wäre auch außerordentlich langsam .
Im Interesse der Leistung versuchen wir stattdessen, die tatsächliche Antwort zu approximieren. Wir basieren auf einer Texturkoordinate und nicht auf der 4, die den gesamten Bereich des Fragments im Texelraum abdeckt.
Bei der Mipmap-basierten Filterung werden Bilder mit niedrigerer Auflösung verwendet. Diese Bilder sind im Grunde eine Abkürzung für die perfekte Methode, indem vorab berechnet wird, wie große Farbblöcke aussehen würden, wenn sie zusammengemischt werden. Wenn also eine niedrigere Mipmap ausgewählt wird, werden vorberechnete Werte verwendet, wobei jedes Texel einen Bereich der Textur darstellt.
Die anisotrope Filterung approximiert die perfekte Methode (die mit Mipmapping gekoppelt werden kann und sollte), indem bis zu einer festen Anzahl zusätzlicher Proben entnommen wird. Aber wie wird der Bereich im Texelraum ermittelt, aus dem abgerufen werden soll, da immer noch nur eine Texturkoordinate angegeben ist?
Grundsätzlich betrügt es. Da Fragment-Shader in 2x2 benachbarten Blöcken ausgeführt werden, ist es möglich, die Ableitung eines beliebigen Werts im Fragment-Shader im Bildschirmraum X und Y zu berechnen. Anschließend werden diese Ableitungen in Verbindung mit der tatsächlichen Texturkoordinate verwendet, um eine Approximation von zu berechnen Was wäre der Textur-Footprint des wahren Fragments? Und dann führt es eine Reihe von Samples in diesem Bereich durch.
Hier ist ein Diagramm, um es zu erklären:
Die schwarz-weißen Quadrate repräsentieren unsere Textur. Es ist nur ein Schachbrett aus 2x2 weißen und schwarzen Texeln.
Der orangefarbene Punkt ist die Texturkoordinate für das betreffende Fragment. Der rote Umriss ist der Footprint des Fragments, der auf der Texturkoordinate zentriert ist.
Die grünen Felder stellt die Texeln , dass eine anisotrope Filterung Implementierung könnte Zugang (die Details der anisotropen Filteralgorithmen sind plattformspezifisch, so kann ich nur die allgemeine Idee erklären).
Dieses spezielle Diagramm legt nahe, dass eine Implementierung möglicherweise auf 4 Texel zugreift. Oh ja, die grünen Kästchen decken 7 davon ab, aber das grüne Kästchen in der Mitte könnte von einer kleineren Mipmap abgerufen werden, wodurch das Äquivalent von 4 Texeln in einem Abruf abgerufen wird. Die Implementierung würde natürlich den Durchschnitt für diesen Abruf im Vergleich zu den einzelnen Texelwerten um 4 gewichten.
Wenn die anisotrope Filtergrenze 2 statt 4 (oder höher) wäre, würde die Implementierung 2 dieser Proben auswählen, um den Fußabdruck des Fragments darzustellen.