Grafik-Filter: Bilinear bis Anisotrop im Detail
10. Dezember 2001 / von aths / Seite 6 von 9 / Update vom 2. Mai 2002
Der Zungenbrecher | |
(Anisotrope Filterung) |
Eigentlich sollte der trilineare Filter doch ausreichen: In allen drei Richtungen wird die Nachkommastelle korrekt ausgewertet. Es ist nicht sofort ersichtlich, was man jetzt noch tun kann. Doch dieser Filter hat noch einen Mangel. Der Grund ist, dass die perspektivische Verzerrung zwar bei der Bestimmung der Texel-Position berücksichtig wurde, bei der (bi)linearen Interpolation jedoch unter den Tisch fällt. Man müsste Texturen, auf die man sehr schräg sieht, mit anderen Verfahren filtern als jene auf die man etwa im 90° Winkel guckt.
|
Die Pfeile sollen die Pixel-Breite veranschaulichen. Bei den grünen Pfeilen stellen beide Strecken wenigstens ungefähr die gleiche tatsächliche Strecke auf dem Polygon dar. Das ist bei den blauen Pfeilen anders: Die X-Strecke umfasst zwar schon etwas mehr, die Y-Strecke jedoch deutlich mehr, als noch bei den grünen Pfeilen. Das berücksichtigt der trilineare Filter aber nicht, der nach wie vor stur in alle Richtungen gleichmäßig arbeitet.
Da für beste Qualität nicht mehr isotrop, also einheitlich gefiltert werden kann, muss das uneinheitlich, sprich an-isotrop umgesetzt werden. Die Uneinheitlichkeit betrifft leider auch die Bezeichnung des Features. Zählt man die bereits bilinear gefilterten Texel als tap, wie es ATI und Bitboys machen? Oder werden die ungefilterten Texel gezählt, wie es nVidia eine längere Zeit tat? Um die Werte einer GeForce mit denen der Konkurrenz zu vergleichen, muss man die von nVidia angegebene anisotrope Stufe durch 4 teilen.
Beim bilinearen Filter werden bekanntlich nur 4 Texel gemischt. Für den trilinearen Filter sind 2 bilinear gefilterte Texel notwendig, was 8 ungefilterten entspricht. Der anisotrope mischt in der Regel deutlich mehr Texel zusammen. Nach welchem Muster, hängt vom Betrachter-Winkel ab.
|
Um es einfach zu erklären: Wenn man bei schrägem Sichtwinkel ein Pixel auf das Polygon projiziert, fällt auf, dass es ein rechteckähnliches Gebilde darstellen muss. Weil ein Texel aber eine quadratische Fläche repräsentiert, wird einfach ein Rechteck aus der Textur ausgelesen. Da der bilineare Filter nur ein Quadrat (aus 2 x 2 Texeln) berücksichtigt, und der trilineare Filter ebenfalls nur Quadrate ausliest, ist der anisotrope überlegen.
Es gibt wieder mal eine Low-Cost-Variante: Anisotrope Filterung ohne trilineare Interpolation. So dass nur eine MIP-Stufe pro Pixel berücksichtig wird. Das fügt wieder MIP-Banding ein und kann eigentlich nicht Sinn eines hochwertigen Filters sein. nVidias GeForce3 bietet beide Verfahren. ATIs Radeon beherrscht keine trilineare anisotrope Filterung, sondern geht einen anderen Weg. Zunächst ein Vergleichsbild von nVidia.
|
Eine Möglichkeit, performancegünstig bilinear anisotrop zu filtern, stellt das RIP-Mapping-Verfahren dar. Vom Namen her erinnert das an MIP-Mapping, und in der Tat haben die Verfahren etwas gemeinsam: Das Vorberechnen von verkleinerten Texturen. Dazu ein ergänztes Beispielbild von SGI:
|
Dank der voraus berechneten Texturen kann man der Überfilterung in X- bzw. Y-Richtung entgegen wirken. RIP-Maps können wie MIP-Maps von Programmierer geladen werden, oder man kann die Erzeugung der Hardware überlassen. Es wurde ja schon angesprochen, dass bei schrägem Sichtwinkel ein Pixel für ein rechteckähnliches Gebilde steht. In diesen RIP-Maps repräsentiert ein Texel kein kleines Quadrat mehr, sondern ebenfalls ein (teilweise ziemlich langes bzw. breites) Rechteck. Da der Texel-Umfang mit der dargestellten Pixel-Fläche deutlich besser übereinstimmt, lässt sich so auf einfachem Wege ein optisch ganz gutes Ergebnis erzielen. Man sehe sich die beispielhaft vergrößerte RIP-Textur an. Sie eignet sich hervorragend, um Seitenwand-Flächen zu tapezieren.
In der vergrößerten RIP-Map sind nun keine Rechtecke zu sehen, von denen dauernd gesprochen wird. Das kommt natürlich durch die bilineare Filterung der Textur. Würde man ein hellen Pixel auf dunklem Untergrund derart behandeln, ergäbe sich zwar ein Rechteck. Doch es würde zunächst allmählich heller werden, und dann wieder dunkler. Das sieht eher ellipsenförmig aus.
RIP-Mapping liefert vor allem bei Winkeln, die ganzzahlige Vielfache von 90° sind, gute Ergebnisse. Das trifft in den meisten Spielen auf die meisten Flächen zu. Sind die Polygone um 45° zur Z-Achse gedreht, wird weniger gute Qualität erreicht. Während der erforderliche Texturspeicher durch das MIP-Mapping um bis zu einem Drittel ansteigt, kann er sich beim RIP-Mapping verdreifachen. Angesichts heutiger Speichergrößen ist das allerdings zu verschmerzen.
Es ist jedoch (noch) nicht entgültig geklärt, ob die Radeon wirklich RIP-Mapping verwendet - eine offizielle Stelle behauptet zumindestens das Gegenteil. Richtig ist jedoch auch, dass eine Radeon nur jeweils komplett horizontale oder vertikale Bereiche aus einer Textur ausliest, um die anisotrope Filterung zu bewerkstelligen, dies ermöglicht einen effizienteren Speicher-Zugriff. Hier ist auch die Ursache für die gute Geschwindigkeit der Radeon 8500 unter anisotropen Filter zu suchen. ATi´s Behauptung, sie würden eine Möglichkeit gefunden haben, nur dann zu filtern, wenn es notwendig ist, kann man getrost unter Ulk abbuchen.
Ein anisotroper Filter arbeitet grundsätzlich adaptiv. Je stärker der Neigungswinkel des Polygons, desto mehr Texel werden gelesen - bis zum eingestellten Maximalwert. Allerdings leidet die Implementation bei den GeForce-Karten daran, dass sich die Füllrate grundsätzlich halbiert, wenn der anisotrope Filter zugeschaltet ist. Die eingestellte Stufe verändert dann lediglich die Bandbreiten-Anforderungen.
In der Welt der Grafikkarten gibt es noch andere Wege, um eine möglichst gute Qualität zu erreichen. Doch zunächst eine Zwischenbemerkung.