Zum 3DCenter Forum
Inhalt




Hat der "brilineare" Filter eine Zukunft?

26. Oktober 2003 / von aths / Seite 1 von 2


   Einleitung

Für Nvidias in Richtung bilineare Filterung verschobene pseudo-trilineare Filterung hat sich inzwischen die Verballhornung "brilinear" etabliert. Obwohl dieser Begriff semantisch Unsinn ist, wollen wir ihn in dieser Kolumne verwenden.

Seit einiger Zeit gibt es eine beunruhigende Entwicklung: Neuere Karten bzw. neuere Treiber senken ungefragt die Bildqualität. Auf einer GeForce4Ti 4200 kann man mit aktuellen Treibern bessere Textur-Bildqualität (via Anisotropic Filtering) erzeugen, als mit einer GeForceFX 5900 Ultra. Nun könnte man sagen, auf der anderen Seite stimme ja auch folgendes: Die 4x-FSAA-Qualität der GeForce256 ist standardmäßig besser als bei GeForce3 (und auch als bei GeForce 5900 Ultra). Denn es steht hier 4x ordered grid Supersampling vs. 4x ordered grid Multisampling. Doch von einem Rückschritt wird dabei allgemeinhin nicht gesprochen ...

Bevor wir uns in Vergleiche stürzen, soll zunächst eine saubere Definition des bilinearen und des trilinearen Filters erfolgen.

Die gleichen Texturen können in unterschiedlichen Auflösungen bereit gestellt werden, und zwar jeweils um Faktor 2 verkleinert (pro Achse). Diese "Unter-Texturen" heißen MIP-Maps. Beispiel: Eine 512x512-Basis-Textur hat vorberechnete MIP-Maps in den Größen 256x256, 128x128, 64x64, 32x32 usw. Da die Datenmenge für jede neue MIP-Map (man könnte auch "MIP-Textur" sagen) schnell sinkt, ist der zusätzliche Speicherverbrauch im Grafikkarten-RAM erträglich: Etwa ein Drittel des Speichers, welcher von der Basistextur belegt wird.

Bei unkomprimierten 32-Bit-Texturen braucht man für die Größe von 512x512 immerhin 1 MB RAM, alle ihre MIP-Maps zusammen noch mal etwa 0,33 MB RAM. Größere Texturen als 512-er sind noch recht selten anzutreffen, da man höhere Textur-Auflösungen auch erst mit sehr hohen Bildschirm-Auflösungen braucht. Und schon sind wir mitten im Thema: Denn wenn ein weit entferntes Objekt texturiert wird, besteht es ja aus weniger Pixeln, also wird dafür (dynamisch ausgewählt und von der 3D-Hardware berechnet) automatisch eine kleinere Texturauflösung genommen. GeForce-Karten berechnen die MIP-Stufe in jedem Dreieck für jeden 2x2-Pixelblock neu, das ist genau genug.

Bilineares Filtering heißt, aus der "am meisten passenden" MIP-Map vier Texel zu einem Farbwert zusammenzufiltern. Und zwar so, dass jeder der vier Werte ein passendes "Gewicht" bekommt, was hier ausführlich beschrieben ist. Nun darf beim Texturieren, also wenn die Textur über das Polygon gelegt wird, letztlich kein Textur-Wert "übersehen" werden, dementsprechend wird die Größe der MIP-Textur gewählt.

Würde man die nächstgrößere MIP-Textur nehmen, käme es bereits zu Textur-Flimmern (sprich zu Aliasing), da man bei vier Samples pro Farbwert die Textur dann bereits zu grobmaschig abtasten würde. Hier offenbart sich der erste Nachteil, wenn nur aus einer einzigen MIP-Map gefiltert wird: Das "Level of Detail" muss ja so bestimmt werden, dass auf jeden Fall Aliasing vermieden wird, flimmrige Texturen würde (zu recht) keiner akzeptieren. Über das Polygon verteilt, bekommen die Pixel je nach dem mehr oder weniger Texturdetails.

Wenn dann zur nächstkleineren MIP-Map gegriffen wird, tritt "MIP-Banding" auf. Das ist ein Artefakt, welcher daraus resultiert, dass im Bild hoch- und niedrig aufgelöste Texturen zusammenstoßen. Diese virtuellen "Bänder" schiebt man in Bewegung wie eine Bugwelle vor sich her. Die LOD-Formel sorgt insgesamt für den höchstmöglichen Schärfegrad, der mit bilinearem Filter eben erreichbar ist. Das heißt aber auch, dass das erste MIP-Band relativ weit "vorne" im Bild zu finden sein wird und jene Artefakte dementsprechend stören.

Auch für Trilineare Filterung gibt es exakte Definitionen. Microsoft legt für Direct3D fest: "The texture filter to use between mipmap levels is trilinear mipmap interpolation. The rasterizer linearly interpolates pixel color, using the texels of the two nearest mipmap textures.". Sinngemäß etwa "Um zwischen den Mipmap-Stufen zu filtern, wird trilineare Mipmap-Interpolation verwendet. Dabei interpoliert der Rasterizer linear die Pixelfarbe, indem er Texel der beiden nächstliegenden Mipmap-Texturen in die Berechnung einfliessen lässt."

Die OpenGL-Definition gibt sogar noch eine mathematische Formel an, doch wir begnügen uns mit einer Umschreibung: Der trilineare Filter überblendet gleichmäßig und sanft die zwei passendesten MIP-Maps. Damit wird erreicht, dass der "Schärfegrad" bei jedem Pixel gleich ist (Ausnahme: verzerrt dargestellte Texturen, hierfür ist dann anisotropes Filtering notwendig, was jedoch heute nicht unser Thema sein soll). Die Formel für das trilineare Filtering ist natürlich ebenfalls so gewählt, dass die Texturen so scharf wie möglich sind, aber Texturflimmern noch gerade so nicht auftritt.

Man sieht, dass trilineare Filterung nur für Verkleinerungen, nicht für Vergrößerungen genommen werden kann: Höher aufgelöst als die "nullte" MIP-Textur geht es nicht, demzufolge wird dann nur noch aus dieser Textur gesampelt.

Die Nützlichkeit von trilinearem Filtering liegt nicht nur in der gleichmäßigen Verteilung der Textur-Details (der Schärfegrad ist übrigens insgesamt nicht besser, sondern "nur" besser verteilt). Der in Bewegung sofort ersichtliche Riesenvorteil liegt darin, dass das MIP-Banding verschwindet: Durch ein sanftes Überblenden der MIP-Texturen gibt es keinen plötzlichen Wechsel im Detailgrad mehr. Damit sind die "Bugwellen" praktisch beseitigt.

Betrachten wir uns nun den "brilinearen" Filter.


   "Brilinear" - eine sinnvolle Leistungssteigerung?

Statt dass es das MIP-Band-Artefakt gibt, ist beim trilinearem Filter der ganze Bereich mit einem "Tri-Band" überzogen. Damit ist der Bereich gemeint, wo tatsächlich zwei MIP-Stufen zum Einsatz kommen. Es gibt nur einen ganz schmalen Streifen, wo praktisch nur eine MIP-Textur zur Pixelfarbe beiträgt.

"Brilineare" Filterung interpoliert ebenfalls Texturen, um MIP-Banding zu unterdrücken. Allerdings wird das "Tri-Band" erheblich verkleinert. Über weite Bereiche findet nur noch bilineare Filterung statt. Zur Erinnerung, "brilinear" ist ein Kunstwort, und nirgendwo offiziell. "Pseudo-Trilinear" klingt zunächst technischer, beschreibt den Filter jedoch auch nur unzureichend. Der Effekt soll mit Bildern veranschaulicht werden, wozu wir MIP-Map-Einfärbung mit einem Malprogramm nachgestellt haben.


Bilineare Filterung erzeugt harte Bänder, wo unterschiedliche Detailauflösungen zusammen treffen.


Trilineare Filterung überblendet immer zwischen zwei Detailauflösungen.


Dieser "Überblendungs-Bereich" ("Tri-Band") ist beim "brilinarem" Filter deutlich kleiner, weite Bereiche werden nur bilinear gefiltert.

Gehen wir etwas in der Zeit zurück: Als die GeForce256 in den Ladenregalen stand, war die GeForce3 und damit das Ressourcen-schonende Multisampling-Anti-Aliasing schon in Entwicklung. Als es dann jene GeForce3 zu kaufen gab, wurde bereits für die GeForceFX entwickelt. Die spezielle Filter-Logik, die für "brilinear" erforderlich ist, muss extra in Hardware gegossen werden; das heißt, "brilinear" ist keine schnelle Notlösung, sondern von langer Hand geplant. Bevor wir über diesen Filter urteilen und über seine Zukunft spekulieren, soll ein Blick auf ein anderes Feature die Sinne schärfen.

Die Rede ist natürlich von Anti-Aliasing. Supersampling wurde durch Multisampling abgelöst. Bei gleicher Subpixel-Maske liefert Supersampling natürlich bessere Qualität. Denn hier wird für jedes Subpixel neu die Textur gesampelt (bzw. der Pixelshader durchlaufen). Multisampling berechnet pro Dreieck pro Pixel nur einen einzigen Farbwert, der für alle Subpixel gilt, die das Dreieck in diesem Pixel bedeckt. Damit findet keine Verbesserung der Textur-Qualität statt, was Supersampling noch bot. Und während Supersampling auch Alphatest-Artefakte glättet, bleiben diese durch Multisampling unbehandelt. Man könnte böse sagen, dass die Multisampling-Hardware nur entwickelt wurde, um aus Performance-Gründen bei der Anti-Aliasing-Qualität "zu cheaten".

Allerdings lohnt sich ein genaueres Hingucken: Was speziell bei der GeForce3 gewonnen wurde, war weniger die reine Geschwindigkeit. Jene GeForce3 bricht, Multisampling hin oder her, bei 2x Anti-Aliasing um bis zu 40% in der Leistung ein. Die Karte war allerdings zu ihrem Erscheinen verglichen mit den damaligen CPUs so schnell, dass diese Schwäche seinerzeit kaum auffiel. Supersampling ist für 50% Leistungseinbruch zu haben, warum also für das bisschen Geschwindigkeit die Qualität opfern?

Der große Vorteil der GeForce3 lag darin, dass für den 2x-Modus gegenüber den Vorgänger-GeForces ein deutlich effizienteres Abtast-Muster verwendet wurde. Man bekam neben dem kleinen Geschwindigkeits-Gewinn kantenglättungs-technisch einen großen Qualitäts-Gewinn. Dass die Texturen beim Multisampling nicht verbessert werden, ist auch zu verschmerzen, da GeForce3 bis zu 8° Anisotropie bei der Texturfilterung erlaubt (GeForce1 und 2 nur bis 2°).

Bleiben noch die Supersampling-Vorteile bei Alpha-Texturen. Nun, Alpha-Testing ist ohnehin eine "schlechte" Methode, die zudem auch mit dem anisotropen Filter schlecht zusammenarbeitet. Da anisotroper Filterung die Zukunft gehört, ist das Aussterben von reinem Alpha-Testing schon abzusehen. Hinzu kommt, dass die Geometrie-Kraft moderner Grafikkarten immer gewaltiger wird, das heißt, kompliziertere Formen werden in Zukunft modelliert und nicht mehr mit Alpha-Texturen dargestellt. Dann wirkt auch Multisampling in vollem Maße und jeder ist glücklich.

Ziehen wir ein Resumee: Die Ablösung von Supersampling durch Multisampling bedeutete zunächst, Qualitäts-Nachteile in Kauf zu nehmen. Mit anderen Bildqualitäts-Maßnahmen, die unabhängig vom Anti-Aliasing richtig und wichtig sind, erzielt man aber mit weniger Hardware-Power bessere Bildqualität. Voraussetzung ist eine Hardware-Unterstützung dieser Features, was einen nicht unwesentlichen Teil der Chipfläche beansprucht. Salopp formuliert könnte man sagen "Ein schlaues Köpfchen spart Körperkraft".

Wie sieht es nun beim "brilinearem" Filter aus? Heutige TMUs (= Einheiten, die das Textur-Sampling übernehmen) liefern pro Takt nur ein bilineares Sample. Für trilineare Filterung benötigt man zwei TMUs oder zwei Takte. Füllratentechnisch halbiert trilineares Filtern somit die Leistung. "Brilineare" Filterung arbeitet über größere Flächen rein bilinear, und somit wird offenbar eine Menge Arbeit gespart. In der Praxis sieht dies allerdings etwas anders aus.






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

Shortcuts
nach oben