Anti-Aliasing im Detail
24. Februar 2002 / von aths / Seite 9 von 18
Multisampling | |
(Die reine Kantenglättung) |
Die Sampleposition ist nur ein unendlich kleiner Punkt. Ein Pixel hingegen nimmt eine Fläche ein. Ohne weitere Maßnahmen würden Texturen sehr unschön aussehen. Aus diesem Grunde werden sie gefiltert, indem beim Auslesen aus der Textur auch Umgebungs-Texel Beachtung finden. Vereinfacht gesagt findet automatisch Textur-Anti-Aliasing statt.
Nun werden bei den bislang vorgestellten Methoden die Texturen nochmals einem Anti-Aliasing unterzogen. Idee Nr. 1: Das könnte man sich ja eigentlich sparen. Man müsste einen Weg finden, dass nur bei Polygon-Kanten mehrere Subpixel gefiltert werden, und die Texturen dabei unberührt bleiben.
Ebenso fiel auf, dass ein rotiertes Abtast-Raster bessere Ergebnisse bringt. Idee Nr. 2: Man könnte das Raster drehen, und mit weniger Subpixel eine noch anständige Qualität schaffen. Werden beide Ideen gleichzeitig umgesetzt, sollte Anti-Aliasing auch noch bei hohen Auflösungen sehr schnell sein. Damit würde der optischen Verlust, den die 2x-Variante trotz rotated grid gegenüber der 4x-Variante hat, mehr als ausgeglichen.
Das dachte sich auch nVidia. Die technische Realisierung dessen ist dabei relativ aufwändig, da schon beim Triangle Setup Änderungen vorgenommen werden müssen. Bei diesem wird das aktuelle Dreieck in Zeilen zerlegt sowie berechnet, an welcher Position auf der Zeile das Dreieck beginnt und an welcher Stelle es endet.
Bei einem rotiertem Raster braucht jedes Subpixel seine eigene Zeile! Deshalb muss das Triangle Setup im Anti-Aliasing-Modus die Zeilen doppelt so fein auflösen. nVidia ging nun allerdings einen etwas ungewöhnlichen Weg: Ein Subpixel ist auf der herkömmlichen Sampleposition, nämlich in der Pixel-Mitte. Der zweite Subpixel wird genau in die linke obere Ecke gesetzt. Das sieht dann so aus:
Es wird einmal in der Mitte und einmal links oben gesampelt. Die Subpixel, die für das Pixel in der Mitte genutzt werden, sind hellgrün, die anderen dunkel. |
Die gepunkteten Linien veranschaulichen die zusätzlichen Zeilen, die das Triangle Setup berechnet. Die Subpixel liegen nun in einem um 45° rotierten Raster. Somit wäre schon einmal Idee Nr. 2 realisiert. Für nur 2 Subpixeln ist 45° ein sehr brauchbarer Winkel.
Um das zusätzliche Textur-Anti-Aliasing zu umgehen, liest man pro Pixel nur einen gefilterten Wert, der dann für beide Subpixel genutzt wird.
Es wird weiterhin pro Pixel mehrfach gesampelt. Aber man berechnet nicht mehr für jedes Sample einen eigenen Textur-Wert. Dieses Verfahren heisst Multisampling. Die Kantenglättung findet allerdings trotzdem statt, denn wenn beide Subpixel im Dreieck liegen, gibt es nichts zu glätten. Es wird der eine gefilterte Texturwert in beide Backbuffer geschrieben.
Bei 2 Subpixeln ist ein 45° Raster gar nicht einmal schlecht. |
Gehört nur einer der Subpixel zum aktuellen Dreieck, so wird der Texturwert natürlich nur in den Backbuffer geschrieben, der auch zu diesem Subpixel gehört. Überall dort, wo keine Kanten sind, enthalten beide Multisample-Buffer die gleichen Daten. An den anderen Stellen unterscheiden sie sich aber. Werden die Buffer zusammen gemischt, erhält man ein Bild mit geglätteten Kanten.
Jenes Hardware-Anti-Aliasing-Verfahren, welches nur Kantenglättung liefert, nennt man Multisampling.
Beim Triangle Setup, also der Zerlegung des Dreiecks in die Bildschirm-Zeilen, wird nun etwas trickreich vorgegangen. Normalerweise wird festgestellt, ab welcher Position das Dreieck beginnt und wo es endet. Beim Multisampling sind zusätzliche Daten notwendig, nämlich auf welchen der beiden Zeilen (oder ob auf allen beiden gleichzeitig) das Dreieck beginnt, und wo mögliche Übergänge von ein- oder zweizeiliger Belegung sind.
Bislang wird Multisampling für den Endkunden von der GeForce-Serie ab der GeForce3 unterstützt. Ein Grund, genauer auf diese Technik einzugehen.