Zum 3DCenter Forum
Inhalt




Grafik-Filter: Bilinear bis Anisotrop im Detail

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



  Wie tapeziert man Dreiecke?
  (Texturen)

Texturen spielen natürlich eine wichtige Rolle, immerhin sind sie die Objekte, die gefiltert werden. Um den roten Faden zu behalten, wird der eigentliche Texturier-Vorgang hier aber nur in einer schematischen Übersicht dargestellt.

Für 3D-Grafik werden intern Dreiecke verarbeitet, die dann Pixel für Pixel einen Farbwert bekommen. Von jedem Dreieck sind die jeweiligen Eckpunkte bekannt. Man beschreibt jeden Eckpunkt durch einen Vektor, der drei Komponenten enthält. Das sind X, Y und Z. Auf dem Bildschirm sind lediglich X und Y verfügbar.

Wegen der Beschränkung auf nur noch zwei Koordinaten wird zunächst jeder Punkt auf eine gedachte Fläche projiziert, die dann weiter verarbeitet wird. Bei dieser Fläche handelt es sich natürlich um den Bildschirm.

Für jedes projizierte Dreieck wird nun der Punkt mit dem Y-Wert bestimmt, der am weitesten oben liegt, dann der am weitesten unten liegt. Es wird abschließend ermittelt, welcher der drei Punkte übrig bleibt. So dass das Dreieck jetzt zeilenweise von oben nach unten gerendert werden kann. Der nur vereinfacht dargestellte Vorgang wird auch als Triangle Setup bezeichnet.

Ein Dreieck wird in Pixel zerlegt (rot). Die zugehörigen Eckpunkte sind gesondert gekennzeichnet (blau). Die Punkte in den Kästchen veranschaulichen das Dilemma: In der Geometrie ist ein Pixel ein unendlich kleiner Punkt. In Wahrheit umfasst ein Pixel jedoch eine kleine Fläche. Der (Mittel-)Punkt in der Pixel-Fläche ist die Sampleposition.

Nun muss aus der Pixel-Position ein zweidimensionaler Koordinatenwert berechnen werden, damit man weiß, welcher Texel aus der Textur auszulesen ist. Wie im Bild zu sehen hat das digitalisierte Dreieck allerdings etwas andere Eckpunkte als die eigentliche Geometrie. Deshalb muss zunächst eine Subpixel-Korrektur durchgeführt werden, damit die Berechnungen für die sichtbaren Eckpunkte korrekt durchgeführt werden können.

Für die Textur reicht es leider nicht, einfach die (nun korrigierten) Eckpunkt-Daten je für X und Y linear zu interpolieren. Diese Berechnung muss noch um die perspektivische Verzerrung korrigiert werden. Denn nahe Objekte erscheinen größer als ferne. Wenn man von schräg oben auf eine quadratische Platte sieht, nimmt die erste Hälfte mehr im Sichtfeld ein, als die zweite. Der Mittelpunkt ist also etwas nach hinten verschoben.

Bei einer linearen Interpolation fällt das unter den Tisch. Ein so berechneter Mittelpunkt wäre von der Vorder- und Hinterkante gleich weit entfernt. Bei Software-Engines reicht die CPU-Power nicht, um für jeden Pixel die genaue Texel-Position zu berechnen. Es sind höchstens zusätzliche Stützstellen drin, zwischen denen weiterhin linear interpoliert wird.

Hardware-3D-Beschleunigung führt diese Korrektur aber pixelweise durch.

Man erhält also einen Vektor mit einer Koordinate, der auf das zu verwendende Texel zeigt. Die beiden Zahlen im Vektor enthalten natürlich Nachkomma-Stellen. Hier kommt nun Point Sampling ins Spiel. Angenommen, es wird der Vektor (2.7 11.1) zurück gegeben. Point Sampling rundet die Komponenten auf ganze Zahlen und liefert (3 11) zurück.

Jeder Pixel muss eine Farbe bekommen.

In diesem Beispiel wird die Farbe Rot auf den Pixel aufgetragen.

Vorteile: Man kann auf Polygone Texturen auftragen.

Probleme: Point Sampling ist kein richtiger Filter und erzeugt eine recht hässliche Grafik. Es gibt gleich zwei prinzipielle Mängel: Einerseits wird beim Vergrößern einer Textur durch das Runden immer wieder derselbe Farbwert ausgelesen. So dass im Bild grobe Blöcke zu erwarten sind. (Man erinnere sich an Spiele wie Duke Nukem 3D: Steht man vor einer Wand, sind quadratische Pixelblöcke zu bewundern.) Noch schlimmer sieht es bei verkleinerten Texturen aus. Jeder Pixel bekommt zwar die korrekt gewählte Farbe. Auf dem Bildschirm repräsentiert ein Pixel eine (sehr kleine) Fläche, beim Point Sampling fließen aber keine Informationen der Umgebung mit ein. Das macht es bei Verkleinerung unmöglich, noch vernünftig Strukturen auf den Texturen zu erkennen. Von dünnen Linien werden zum Beispiel höchstens einige Punkte erwischt. In der Bewegung ist es noch schlimmer: Die verkleinerten Texturen flimmern schrecklich.

Hier muss zunächst Abhilfe geschaffen werden.






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

Shortcuts
nach oben