Zum 3DCenter Forum
Inhalt




Grafik-Filter: Bilinear bis Anisotrop im Detail

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



  Die Wichtigkeit der Nachkomma-Stellen
  (Der bilineare Filter)

Angenommen, fünf nebeneinander liegende Pixel liefern als Texel-Koordinate den jeweils gleichen Y-Wert zurück. Der X-Wert wandert von 112.5 bis 113. Damit würde immer auf 113 aufgerundet. Alle fünf Pixel bekommen dann die genau gleiche Farbe.

Das wird beim bilinearen Filter nun geändert. Die bilineare Interpolation ist der linearen ähnlich. Da in zwei Richtungen (X und Y) gleichzeitig interpoliert wird, nennt man diesen Filter bi-linear.

Bei der bilinearen Filterung spielen die Kommastellen eine wichtige Rolle.

Alle vier Farben werden irgendwie in das Pixel einfließen. Aber mit welcher Stärke? Führen wir einmal eine Beispiel-Rechnung durch:

Orange: Das Gewicht beträgt für die X-Achse 3.0 - 2.7 = 0.3. Für die Y-Achse ist zu rechnen: 12 - 11.1 = 0.9. Weil es sich um Flächen handelt, muss man beide Gewichte multiplizieren. Das ergibt hier ein Gesamtgewicht von 0.3 x 0.9 = 0.27. Im Prinzip wurde einfach der Flächeninhalt des orangen Rechtecks berechnet.

Rot: Auf der X-Achse ist das Gewicht 2.7 - 2 = 0.7, und auf der Y-Achse ebenfalls 0.9, so dass ein Gesamtgewicht von 0.7 x 0.9 = 0.63 erreicht wird. Das heißt nichts anderes, als dass das rote Rechteck 63% der Gesamtfläche beansprucht. Und demzufolge mit diesem Gewicht in den neuen Farbwert mit eingeht.

Blau: 0.3 x 0.1 = 0.03

Grün: 0.7 x 0.1 = 0.07

Alle Gewichte zusammen addiert ergibt genau 1, was nicht verwunderlich ist, sondern natürlich immer so sein muss. Die einzelnen Gewichte werden nun mit den einzelnen Farben multipliziert. Dieses Beispiel ist mit Absicht so gewählt, dass Rot, Grün und Blau gleich zwei mal vorkommen: Einmal als Texelfarbe und einmal als Farbkomponente. Zwischen diesen Bedeutungen ist natürlich zu unterscheiden! Die Texelfarben sind herkömmliche Vektoren und wurden nebeneinander in die linke Matrix geschrieben:

Die Farbmatrix (links) wird mit dem Gewichts-Vektor (oben) multipliziert. Die Werte im Ergebnis-Vektor liefern den bilinear interpolierten Farbwert.

Wer die Matrizen-Multiplikation nicht kennt, rechnet für den neuen Rot-Wert folgendes: Rot-Wert von Farbe 1 mit dem Gewicht für Farbe 1 multiplizieren, das Ergebnis merken. Dann Rot von Farbe 2 ebenfalls seinem Gewicht multiplizieren und merken. So bis zum vierten Pixel fortfahren. Alle gemerkten Ergebnisse addiert ergeben den neuen Rot-Wert. Das gleiche muss dann noch mit Grün und Blau gemacht werden.

Der gefilterte Wert erzeugt Übergangsfarben.

Wir erhalten gerundet den Farbvektor (214 54 8). Jede Zahl gibt je eine Farbkomponente an, hier natürlich wieder in der Reihenfolge Rot, Grün, Blau. Die tatsächliche Umsetzung des Filters kann optimierter als im Beispiel ablaufen. So ist der Abstand vom Mittelpunkt pro Achse (von denen es zwei gibt: X und Y) nur einmal zu bestimmen, anstatt pro Pixel (von jeden ja gleich vier vorhanden sind.) Doch der Artikel behandelt Prinzipien und keine optimierten Berechnungs-Abläufe.

Eine TNT2 kann pro Sekunde bis zu 250 Millionen bilineare Interpolationen ausführen. Das sind nur für die anfallenden Matrizenmultiplikationen schon 4 Milliarden Multiplikationen und 3 Milliarden Additionen. Damit alleine ist sie von der reinen Rechenleistung her ähnlich stark wie ein aktueller Prozessor. Die aufwändige perspektivische Korrektur, die pixelweise durchgeführt wird, und die Operationen zum Kombinieren von Texeln mit berücksichtigt, so rechnet der Chip mit nur 125 MHz mehr, als heutige CPUs.

Für 3D-Hardware stellt dieser Filter kein Problem dar. Für Software-Engines ist er in der Regel zu aufwändig.

Daher gibt es in einigen Software-Engines eine LowCost-Variante: Das bilineare Dithering. Es wird auf das Vermischen von den vier Texeln verzichtet, die dazu ja alle erst mal aus der Textur gelesen werden müssten. Deshalb kann auch die aufwändige Matrizen-Multiplikation wegfallen. Stattdessen wird ein Raster-Verfahren angewendet, um einen Texel pro Pixel auszuwählen. Das Prinzip: Je näher am tatsächlichen Pixel-Mittelpunkt, desto häufiger kommt der entsprechende Texel zum Zug. Man spart damit viel Rechenaufwand (nur noch Gewichte bestimmen, keine Matrizen-Multiplikation ausführen) und auch Bandbreite (nur einen statt vier Texel pro Pixel lesen).

Beispiel aus Unreal Tournament: Point Sampling vs. bilinear Dithering.

Noch einmal zurück zum eingänglichen Beispiel. Wenn die zurück gelieferte Texel-X-Koordinate von 112.5 bis 113 wandert, so wird dank diesem Filter anstelle des Kästchens ein Farbverlauf erzeugt. Das sieht zum Beispiel so aus:

Der Filter erhöht zwar nicht den Detailgrad, aber die optische Qualität. Der reine bilineare Filter kämpft weiterhin mit flimmernden Texturen, daher wird er in der Praxis kombiniert mit MIP-Mapping eingesetzt.

Vorteile: Bilineare Filterung erlöst den Betrachter von Pixel-Blöcken bei Vergrößerung, da pro Pixel gleich vier Texel einfließen. Bilinear gefilterte Grafik war ein Meilenstein, der mit einem Schlag die optische Qualität entscheidend erhöhte.

Wird MIP-Mapping mit dem (üblichen) 2x2 Filter angewendet, so findet nichts weiter als eine vorberechnete bilineare Filterung statt. Wird auf genau 50% pro Achse verkleinert, kann man mit der bilinearen Methode auch downsampeln. Ansonsten eignet sich dieser Filter nur zum Vergrößern. Die vorberechneten MIP-Texturen ersparen eine sehr aufwändige bikubische Filterung - dank einer speziellen Verwendungsmöglichkeit des bilinearen Filters.

Probleme: Allem Aufwand zum Trotz: Der abrupte Wechsel der MIP-Stufen bleibt bestehen. Nach dem Ah! und Oh! angesichts des bilinearen Filters galt es nun, diesen Missstand zu beseitigen.






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

Shortcuts
nach oben