Zum 3DCenter Forum
Inhalt




ATIs Filtertricks

21. November 2003 / von aths / Seite 2 von 3


   Vereinfachungen bei den "Grundfiltern"

Trilineare Filterung heißt, zwei bilineare Samples nochmals linear zu interpolieren. Dafür ist ein Faktor im Bereich von 0,0 - 1,0 notwendig. ATI verwendet hierfür fünf Bits Präzision. Damit wird in Direct3D exakt die Qualität des Reference Rasterizers erzeugt (wobei damit nicht gesagt ist, dass man keine höhere Präzision verwenden darf). In OpenGL nutzt SGI, welche diese Schnittstelle ja maßgeblich mitprägten, dagegen jedoch acht Bit Präzision. Daran halten sich beispielsweise auch die GeForce-Karten von Nvidia, welche unseres Wissens nach generell unter OpenGL wie auch unter Direct3D mit einer 8 Bit Präzision diese lineare Interpolation durchführen.

Die zusätzlichen drei Bits sorgen dabei für eine achtfach feinere Unterteilung. "Braucht" man diese? Unserer Meinung wäre es schön, mindestens 6 Bit dieser sogenannten "LOD-Fraction" zu haben, um sicherzustellen, dass Banding-Artefakte nicht auftreten. 5 Bit reichen für die meisten Fälle, 4 Bit wäre auf jeden Fall schon klar zuwenig. 8 Bit mag etwas übertrieben sein, aber präzise Texturfilter sind ja nicht von Nachteil. Als Lehrbuch-Qualität kann man hier 8 Bit auf jeden Fall ansehen, da mit dieser Präzision Banding-Artefakte sicher vermieden werden und dies eben auch die Empfehlung von SGI unter OpenGL darstellt.

Es ist schwierig, die Problematik von "5 Bit LOD-Fraction" mit Screenshots zu belegen, jedenfalls lassen sich die Nachteile von Nvidias "brilinearer" Filterung einfacher zeigen. Nichts desto trotz fragen wir uns, ob man wirklich bei einer Hardware hier sparen muss, wo auf der anderen Seite Pixel Shader mit 96 Bit (4x 24 Bit Floating Point) Präzision arbeiten, oder auch 6x sparsed, gamma-gegenkorrigiertes Multisampling Anti-Aliasing geboten wird. ATI entdeckte offenbar bei der Texturfilterung Sparpotenzial und reizte das bis an die Grenze aus. Leider schreckte man dabei nicht einmal davor zurück, bilineare Filterung zu "optimieren" (MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots):


MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots

Wir wissen nicht genau, woher diese Block-Artefakte kommen. Was wir jedoch wissen, ist, wie bilineare Filterung auszusehen hat und dass die Konkurrenz gemäß obigen Screenshot eine Lehrbuchqualität liefert - was man von einer aktuellen Grafikkarte auch wirklich erwarten kann. Übrigens hat schon mindestens die R200 diese "Optimierung".

Um ein bilineares Sample zu filtern, benötigt man die genaue Sample-Position für den Filterkernel. So wie bereits die LOD-Fraction eine recht grenzwertige Präzision hat, scheint bei ATI auch bei den bilinearen Sample-Koordinaten gespart worden zu sein. Um die Gewichtungs-Matrix für die Texel zu berechnen, die im Filterkernel liegen, werden die Nachkomma-Stellen der Sample-Koordinaten genutzt. Vielleicht wurde bei der Berechnung der Gewichtungs-Matrix gespart, wo sich unter bestimmten Umständen dank einer Lookup Table einige arithmetische Berechnungen wegrationalisieren ließen.

Diese Artefakte treten bei sehr, sehr kleinen Texturen nicht auf, über Hintergründe können wir im Moment nur mutmaßen. Wir wissen nicht, wo gespart wurde, sondern nur, dass gespart wurde. Kurz und knapp: Auch aktuelle Radeon-Karten können unter bestimmten Umständen nicht lehrbuchmäßig bilinear filtern. GeForce-Karten zeigen hier jedoch keinerlei Schwächen.

Das betrifft übrigens auch die Quantisierung der Gewichts-Matrix. Während GeForce-Karten hier mit 8 Bit rechnen, müssen bei ATI 6 Bit reichen. Mehr als 8 Bit Auflösung würde insofern wenig Sinn machen, als das die Farbkanäle in Texturen und im Framebuffer ebenfalls nur 8-bittig vorliegen. Nutzt man aber auch nur ein Bit weniger für die Gewichts-Matrix, also 7 Bit, wird der Farbumfang des Framebuffers bei starker Vergrößerung nicht mehr voll ausgeschöpft. Zwar kommen insgesamt noch mehr als 2^7= 128 Abstufungen vor, aber das gilt z.B. nicht mehr für die Pixel-Linie, welche genau zwischen zwei Texeln ist. Lange Rede, kurzer Sinn: Bei sehr starkem Zoom gibt es mit geringerer Auflösung als 8 Bit entsprechende Blockbildung (MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots):


MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots

Es fällt auch hier schwer, das per "realistischem" Screenshot (also aus einem Spiel) nachzuweisen. Solange trilineare Filterung genutzt wird, wird intern maximal um den Faktor 2 bilinear gezoomt. Dann fallen diese blockigen Artefakte noch nicht auf. Diese werden erst dann sichtbar, wenn hochkontrastige Texturen mit hochfrequentem Inhalt stark hochvergrößert werden.

Ist dann alles in Ordnung, wenn die Nachteile nur selten sichtbar sind? Wir meinen, es ist nicht in Ordnung, bei bilinearer Filterung keine Lehrbuchqualität zu bieten. Immerhin wird dieser Filter zum Beispiel beim Pixelshading bei Lookup-Texturen für mathematische Funktionen genommen. Je besser bilinear gefiltert wird, desto besser ist das Ergebnis - eine Sache die eigentlich keiner Erwähnung bedarf. Bilineare Filterung ist texturfiltermäßig das einfachste von der Welt. Wir erwarten da eigentlich eine kompromisslose Qualität.

Leider setzt ATI andere Prioritäten, wie man auch an der Berechnung des MIP-Map-LODs sehen kann (MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots):


MouseOver-Effekt per Javascript, Alternativ-Variante: Klick öffnet beide Screenshots

Bei diesem Beispiel treten mit der GeForce-Karte Ungenauigkeiten von der Größe eines Quads auf (ein Quad besteht aus 2x2 Pixeln, die LOD-Berechnungen werden pro Polygon nicht pixel-, sondern quadweise vorgenommen). Die Radeon-Karte hingegen zeigt ein wirres Muster, wo das LOD hin- und herspringt. Offenbar wurde die LOD-Berechnung so optimiert, dass möglichst wenig Transistoren gebraucht werden, und zwar unter Vernachlässigung der Rechengenauigkeit. GeForce-Karten bieten auch nicht durchgehend Perfektion, es lassen sich auch bei diesen Situationen erzeugen, wo ebenfalls ein "Dither-Übergang" entsteht. Jedoch sind die Radeon-Karten diesbezüglich deutlich anfälliger.






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

Shortcuts
nach oben