Zum 3DCenter Forum
Inhalt




Grafik-Filter: Bilinear bis Anisotrop im Detail

10. Dezember 2001 / von aths / Seite 5 von 9



  Nimm drei!
  (Der trilineare Filter)

Beim bilinearen Filter spielen die Nachkomma-Stellen zwar eine Rolle. Doch bei der Wahl der MIP-Stufe wird nur eine Stufe pro Texel berücksichtigt. Angenommen, für unseren Beispiel-Pixel wurde eine MIP-Stufe von 1.4 ausgerechnet. Die Entfernung zu Level 1 ist dann 0.4, zu Level 2 entsprechend 0.6. Mit anderen Worten müsste MIP-Level 1 mit 60% und Level 2 mit 40% berücksichtigt werden.

In der Regel liegt ein Pixel nicht exakt auf einer MIP-Stufe, sondern irgendwo dazwischen.

Genau das wird beim trilinearen Filter gemacht: Es werden zwei bilinear gefilterte Punkte aus je vier Texeln berechnet, und das Ergebnis wird nochmals linear interpoliert. Das ist eine Interpolation mehr, so dass man vom tri-linearen Filter spricht.

Unser bilinear gefiltertes Beispiel-Pixel hatte den Farbvektor von (214 54 8). Bei diesem Beispiel wird von einer Genauigkeit von 8 Bit ausgegangen. Viele Beschleuniger rechnen intern schon etwas genauer, was darauf hinaus läuft, dass bereits Kommastellen möglich sind. Für dieses Beispiel wird auf erweiterte Genauigkeit verzichtet, obwohl das in der Praxis sinnvoll ist. (Um Color-Banding zu vermeiden und in der Zukunft Overbright Lighting, also Helligkeiten größer 100% zu ermöglichen.) Angenommen, der gleiche Texel auf MIP-Stufe 2 würde einen Farbvektor von (108 122 58) zurück liefern.

Zwei bereits bilinear gefilterte Farbwerte werden untereinander linear gefiltert.

Jede Farb-Komponente wird mit ihrem Gewicht mulipliziert und gemerkt. Die jeweils gewichteten Werte addiert ergeben die neue Farbe. Vorher sind, wie angesprochen, zwei bereits bilinear gefilterte taps zu erzeugen.

Der Rechenaufwand wird gegenüber dem bilinearen Filter also gut verdoppelt. Das ist für 3D-Hardware allerdings kein allzu großes Problem, da sich die Logik für den bilinearen Filter auch relativ einfach doppelt auslegen lässt. Problematisch ist, dass nun schon 8 Texel pro Pixel gelesen werden müssen. Bei 32 Bit Farbe macht das 256 Bit an Textur-Bandbreite. Viele Beschleuniger können pro Takt aber nur 128 Bit Daten übertragen. Da pro Übertragung nur Daten infrage kommen, die im Speicher genau nebeneinander stehen, wären ungefähr 4 Takte alleine für die Beschaffung der Texel erforderlich. Zum Glück gibt es Textur-Caches. Das ist ein direkt im Chip integrierter Speicher, der die letzten gelesenen Texel noch vorrätig hält. Die müssen dann nicht mehr aus dem Grafikkarten-Speicher gelesen werden.

Doch lohnt der Aufwand? Lassen wir ein Bild zur Sprache kommen:

Quake III Arena, CTF4: Bilinear (links) und trilinear (rechts) gefiltert.

Links sieht man die Texturen streifenweise in Stufen unscharf werden. Das ist rechts nicht mehr Fall. Am Anfang einer MIP-Stufe erzeugt der trilineare Filter schärfere Ergebnisse, am Ende unschärfere als der bilineare. Die Gesamtschärfe bleibt damit gleich.

MIP-Stufen eingefärbt.

Hier sieht man deutlicher, warum das so ist. Im Bild rechts gibt es nur einen sehr dünnen Streifen, der die gleiche Farbe wie links hat. Ansonsten fließen mehrere MIP-Stufen, und damit auch mehrere Texel in das Pixel mit ein. Das erzeugt teils eine zusätzliche Glattheit, teils eine zusätzliche Schärfe, je nach Lage im MIP-Level.

Auf Screenshots nicht zu sehen ist ein Effekt, welcher sich in Bewegung einstellt: Mit bilinearen Filtering schieben sich die MIP-Bänder, hier eingefärbt, in immer gleicher Entfernung vor einem her. Die Unterschiede in den gewählten Texturauflösungen sind gut sichtbar. Dank trilinearem Filter wird dieser Effekt stark abgeschwächt.

Doch trilineare Filterung bleibt gegenüber der bilinearen deutlich aufwändiger, und deshalb kommt bei einigen Grafikkarten eine Low-Cost-Variante zum Einsatz: Das trilineare Dithering. Der Hintergrund: Trilineare Filterung trägt ja gleich zwei Texturen pro Pixel auf, da jede MIP-Stufe intern einfach eine Textur ist. Der Voodoo3-Chip enthält nur eine Pixel-Pipeline, kann mit dieser aber zwei Texturen pro Takt auf ein Pixel auftragen. Damit ist pro Takt entweder ein Pixel im Multitexturing-Modus oder ein trilinear gefiltertes Pixel möglich. Der TNT enthält gleich zwei Pixel-Pipelines, kann mit diesen aber nur je eine Textur pro Takt auftragen. Für Multitexturing, heute von den meisten Spielen genutzt, werden dann beide Pipelines hintereinander geschaltet.

Vereinfachtes Blockschaltbild der Voodoo3-Pipeline bzw. TNT-Pipeline im Multitexturing-Modus.

Wie im Bild zu sehen enthält diese Pipeline zwei Texture Mapping Units, also können im Durchlauf zwei Texturen auf das Pixel geklebt werden. Das 3dfx-Patent "MIP Map Dithering" funktioniert im Groben so: Sollen beide TMUs je unterschiedliche Texturen auftragen und nicht nur verschiedene MIP-Level, kann pro TMU ja nur aus einem MIP-Level gewählt werden. Durch eine Rasterung, die mal die eine, mal die andere MIP-Stufe berücksichtigt, kann bei hoher Auflösung der Eindruck einer beinahe trilinearen Filterung erreicht werden.

Counter-Strike, Italy: Die Grafik sieht fast trilinear gefiltert aus, doch eine Vergrößerungen bringt Klarheit. Das MIP-Banding bleibt sichtbar (Pfeile), ist aber reduziert.

Echte trilineare Filterung kostet auf moderneren Chips zwar keine Füllrate mehr, stellt jedoch weiterhin hohe Bandbreiten-Anforderungen. Allerdings finden sich noch heute Lösungen, die der Performance wegen keine echte trilineare Filterung bieten. So berechnet der Radeon 8500 mit einigen offiziellen Treibern keinen fließenden Übergang, sondern filtert den Großteil nach wie vor einfach bilinear. Das MIP-Banding wird hier reduziert, in dem beim Übergang zweier MIP-Stufen beide mit je 50% einfließen. Wenn man nicht genau darauf achtet, ist der optische Qualitätsverlust erstaunlich gering. Immerhin werden die auffälligen MIP-Bänder durch je zwei recht unauffällige Bänder ersetzt. Dennoch handelt es sich um einen Trick, der auf Kosten der Qualität ein klein wenig Performance bringt. nVidia ging diesen Handel bei der Implementation des DXTC1-Texturkompression-Verfahrens ein.

Für etwas Performance ein wenig Qualität zu opfern sollte nach Meinung des Autors durch eine Treiber-Option angeboten werden, die standardweise deaktiviert ist. Im Wettlauf um den Highscore in beliebten Benchmark-Programmen zählt Geschwindigkeit mehr als Qualität. Andererseits sind die Unterschiede oft nur in Standbildern auszumachen.

Die MIP-Stufe wird nicht einfach nur nach der Entfernung bestimmt. Sondern es wird eine Textur-Auflösung gewählt, dass nach Möglichkeit auf jedes Pixel ein Texel kommt. Bei schrägen Ansichten repräsentiert ein Pixel aber kein Quadrat mehr auf der Textur, sondern ein ziemlich langes rechteckähnliches Gebilde. Damit ist diese Rechnung nicht mehr stimmig.

An der Wand links werden die Texturen schnell verwaschen, weil zur Texturflimmern-Vermeidung hohe MIP-Level genutzt werden. Die Texturen im Hintergrund sind allerdings scharf.

Vorteile: MIP-Mapping brachte abrupte Wechsel der Detailstufen in die Grafik, die mit der trilinearen Filterung nicht mehr zu sehen sind.

Probleme: Bei sehr schrägen Flächen fällt auf, dass die Textur je nach Lage entweder in X- oder in Y-Richtung überfiltert ist.






Kommentare, Meinungen, Kritiken können ins Forum geschrieben werden - Registrierung ist nicht notwendig Zurück / Back Weiter / Next

Shortcuts
nach oben