Zum 3DCenter Forum
Inhalt




Anti-Aliasing Masken: Probleme und Lösungen

3. Januar 2004 / von aths / Seite 5 von 7


   Zwischenbilanz

Ohne Anti-Aliasing wird jedes Pixel genau einmal abgetastet. Bei einer Auflösung von angenommen 1024x768 wird das aktuell sichtbare Bild auf der X-Achse in 1024, auf der Y-Achse in 768 unterschiedliche Koordinaten unterteilt. Die Angabe "EER von 4x4" heißt, dass jede Achse 4x so fein aufgelöst wird, die Kanten und Ecken also so gut werden, als würde man mit 4096x3072 arbeiten.

Dazu wären eigentlich für jedes Pixel 4x4 = 16 Subpixel erforderlich. Durch ein "sparsed" Raster erhält man jedoch beinahe genauso gute Glättung bei sehr viel weniger Subpixeln. Das Kriterium "sparsed" stellt bei 4x Anti-Aliasing nämlich sicher, dass tatsächlich jede Achse wieder in viermal so feine Schritte unterteilt wird, als das ohne Anti-Aliasing geschehen würde.

Da das 4x Anti-Aliasing auf GeForce-Karten nur eine EER von 2x2 bietet, im Gegensatz zu 4x auf Radeon-Karten ab der 9500 (welches mit einer EER von 4x4 arbeitet), können diese Radeon-Karten bei vergleichbarem Rechenaufwand sehr viel glattere Kanten berechnen. Dass das Triangle Setup der Grafikkarte komplizierter wird, je besseres Anti-Aliasing geboten wird, liegt auf der Hand, soll uns an dieser Stelle aber nicht interessieren. Wir betrachten die Bild-Qualität: Und hier zeigt sich klar, dass die höhere EER wichtiger ist, als die höhere Anzahl von Subpixeln.


   Ein Blick in die Zukunft

Multisampling wird aktuell nur bis 6x geboten. Matrox hat der Parhelia ein Multisampling-ähnliches Verfahren spendiert, welches allerdings nur Polygon-Außenkanten glättet und nur bis zu einer gewissen Anzahl an geglätteten Pixeln funktioniert. Mit erstaunlichen 16 Subpixeln zwar, die leider aber nur in einem 4x4-Raster angeordnet sind. EER-technisch wird eine Überabtastung von lediglich 4x4 geboten.

ATIs 6x bringt bei den Kanten, die Glättung besonders nötig haben, sogar bessere Qualität als Matrox' 16x FAA. Allerdings bringt ATIs 6x MSAA gegenüber 4x MSAA aus gleichem Hause keinen sehr großen Qualitäts-Sprung. Je besser die Grundqualität, desto stärker steigt der Aufwand, um noch eine weitere deutliche Verbesserung zu erreichen. Es wäre schon 8x notwendig, um gegenüber dem bereits gutem 4x RG-Modus von ATI eine merkliche Steigerung zu bieten.

Dem stehen einige ernsthafte Probleme gegenüber: Einerseits braucht man gewaltig viel Speicher für die Multisample-Buffer. Zwar findet eine Art "Komprimierung" statt, das heißt, nur für tatsächlich geglättete Pixel werden alle Subpixel gespeichert. Doch für den Fall der Fälle muss immer soviel Speicher allokiert werden, dass jedes einzelne Bildschirm-Pixel geglättet werden kann. Aus Gründen der Cache-Effizienz und der Organisation des Speichers werden immer ganze Kacheln über den Bus geschoben. Die erforderliche Speicherbandbreite steigt neben dem Speicherverbrauch mit höheren MSAA-Modi natürlich auch.

Das andere Problem ist die Organisation der Framebuffer-Speicherzugriffe. Am Ende der Pipeline steht eine Unit für "Raster Operations" ("ROP") bereit. Diese entscheidet unter anderem, ob das Subpixel überhaupt gespeichert werden darf: Beim Multisampling werden ja alle Subpixel eines Quads berechnet, auch wenn nur ein einziges Subpixel tatsächlich sichtbar ist.

Um die Anti-Aliasing-Füllrate nicht krass zu limitieren, hat jede Pipeline mehrere ROPs. GeForce3 und höher verfügen über 4 ROPs je Pipeline (mit Ausnahme der GeForce4 MX, welche vermutlich nur eine ROP pro Pipeline hat). Radeon 9500 und höher verfügen über 2 ROPs je Pipeline. Sobald besser als bilinear gefiltert wird, stellt das beim 4x Multisampling allerdings keinen Flaschenhals mehr dar: Das Erzeugen eines Texturwerts dauert dann ohnehin mindestens 2 Takte, so dass in dieser Zeit mindestens 4 Raster-Operationen ausgeführt werden können. Für 8x Multisampling wäre es allerdings empfehlenswert, über 4 ROPs pro Pipe zu verfügen.

Was genau den Herren in Kanada oder Santa Clara für die nächste Generation der 3D-Beschleuniger einfällt, wissen wir nicht. Aus unserer Sicht wäre es ein logischer Schritt, 8x "sparsed" Multisampling zu implementieren. Denn Verfahren mit noch mehr Subpixeln benötigen neuartige Ansätze, um die Problematik des ausufernden Speicherbedarfs in den Griff zu bekommen. Andererseits zeigen die 4x und 6x "sparsed"-Muster, dass schon eine tolle Glättung stattfindet. 8x böte dann allerdings das Sahnehäubchen.

Betrachten wir nun einige 8x-Subpixelmasken:

Links haben wir ein 7x RG erweitert, rechts befindet sich das gleiche Muster, lediglich etwas verschoben. Das Muster rechts ist immerhin von zwei Seiten betrachtet symetrisch. Gut wäre natürlich noch eine stärkere Symetrie, um eine "Gleichbehandlung" zu fördern. Anderseits sehen wir hier ungünstige Winkel, die nur mit wenigen Stufen geglättet werden. Wie bekommt man unerwünschte Regelmäßigkeiten aus dem Muster raus? Probieren wir eine zufällige Verteilung:

So richtig zufällig ist das natürlich nicht, wir wahren die Forderung nach bestmöglicher EER-Ausschöpfung, also setzen auf zufällige, aber "sparsed" Masken. Es ist evident, dass tatsächlich stochastische Raster sehr ineffizient sind. Doch auch unsere "EER-optimierten" Raster leiden unter Nachteilen, hin und wieder kleben nämlich zwei Subpixel diagonal zusammen. Damit werden die Abtastungspunkte schlecht verteilt. Es geht also auf jeden Fall besser, wenn man dieses "Zusammenkleben" vermeidet, zum Beispiel so:

Führt dieser Ansatz zu brauchbaren Ergebnissen? Unseren bisherigen Recherchen zufolge ist die Frage der bestmöglichen Abtastung bei hochstufigen Anti-Aliasing-Modi noch Gegenstand der Diskussion, einen Königsweg gibt es nicht. Wenn zufällige Masken ins Spiel kommen, stellt sich die Frage, ob etwa pro Pixel oder wenigstens pro Frame eine andere Zufallsmaske eingesetzt werden sollte.

Die Maske nach jedem gerenderten Pixel zu wechseln, halten wir für problematisch, aber auch bei einem Wechsel pro Frame bleibt ein Effekt der "Unruhe": Die Dreieckskanten "schwimmen" leicht, sie zittern vor sich hin. Bei sehr hoher Framerate mag das zwar kaum noch auffallen. Doch es gibt auch handfeste Gründe gegen zufällige Masken: Die generelle Problematik des Rauschens.

Zufällige Masken führen ein Rauschen ein. Das ist eine Art Fehlersignal, welches den gerenderten Kanten überlagert ist. Es kann nicht der Sinn einer Qualitäts-Maßnahme sein, zusätzliche Fehler einzuführen. Nun ist Rauschen per se nicht immer unerwünscht, in bestimmten Situationen könnte der Realismus-Grad durch leichte Verrauschung noch gesteigert werden. Aus unserer Sicht sollte das aber explizit vom Programmierer vorgesehen sein, der dann auch über Pixelshader-Techniken ein Fernseh-realistisches Rauschen als Effekt anbieten könnte. Ansonsten muss das Ziel generell sein, Berechnungsfehler zu minimieren. Dazu gehört ja das Anti-Aliasing selbst dazu, diese Maßnahme sollte nicht am anderen Ende wieder kontraproduktiv sein.

Dem kann man zwar Herr werden, und zwar mit der Ausnutzung eines Gesetzes, welches einfach formuliert lautet: Um das Rauschen zu halbieren, benötigt man die vierfache Menge an Werten. Für eine Drittelung demnach die neunfache Menge, für eine Viertelung die 16fache Menge. Oder anders gesagt, das Rauschen sinkt mit der Quadratwurzel der Messwerte. Um den zusätzlichen Fehler durch das Rauschen unter die Wahrnehmungsgrenze zu drücken, würde man sehr viele Samples benötigen, wofür weder Speicherplatz und Bandbreite, noch die ROP-Units da sind.

Beim 4x-Modus war es noch leicht: Da brachte die "sparsed"-Methode eine sehr effiziente Maske. Ein Ansatz könne sein, sich einen guten 8x-Modus als zwei ineinander verschachtelte 4x-RG-Muster vorzustellen. Abzüglich gleichwertiger Masken, die sich nur durch die Ausrichtung unterscheiden, verbleiben sechs unterschiedliche Möglichkeiten. Diese wollen wir nachfolgend im einzelnen betrachten.






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

Shortcuts
nach oben