Multisampling Anti-Aliasing unter der Lupe
22. Mai 2003 / von aths / Seite 2 von 8
Oversampling: Die einfachste Methode
Das Triangle Setup kennt für jedes Pixel nur zwei Zustände: Entweder wird es vom Dreieck bedeckt oder nicht. Damit kommt ein Digitalisierungs-Fehler ins Spiel. Denn die Pixel an der Dreiecks-Kante sind ja "in Wahrheit" teilweise bedeckt, was aber nicht berücksichtigt wird. Sobald die Pixelmitte bedeckt ist, gilt das gesamte Pixel als dem Dreieck zugehörig.
Dieser Digitalisierungs-Fehler äußert sich in Treppen-Stufen, wo eigentlich eine glatte Kante sein sollte. Treppen-Stufen sind nun prinzipiell nicht vermeidbar, da auf ein Pixel-Raster gerendert wird (welches übrigens, verglichen mit der Genauigkeit der Geometrie-Daten, äußerst grobmaschig ist.) Die Sichtbarkeit der Stufen ließe sich mildern, wenn z.B. bei 50% Bedeckung der Farbwert des dieses Dreiecks-Pixels dann auch nur zu 50% in den finalen Bildschirm-Pixel eingeht. Exakt je nach Bedeckung im Pixel die Farb-Anteile zu mischen stellt aber einen so großen Aufwand dar, dass man in der Praxis lediglich versucht, die tatsächlichen Bedeckungs-Anteile annähernd zu berechnen. Jede heutige Implementierung eines 3D-Anti-Aliasing-Verfahrens stellt also nur eine Approximation dar.
Eine Möglichkeit um bessere Kanten zu erreichen ist Oversampling: Man skaliert X- und Y-Achse um einen ganzzahligen Faktor, rendert dieses vergrößerte Bild, und filtert es wieder auf die ursprüngliche Auflösung herunter. Beim Downfiltering fließen dann mehrere Framebuffer-Pixel in ein Bildschirm-Pixel mit ein. So lässt sich erreichen, dass es "sanfte" Kanten mit Farbübergängen gibt.
2x2-Oversampling: Intern wird höher aufgelöst.
Nach dem Downfiltering sind die Kanten etwas glatter.
Der Filter-Kernel sollte in jedem Fall immer ganze Pixel komplett überstreichen, und keine Pixel-Bruchteile mit einbeziehen. Eine Skalierung von 1,5 x 1,5 beispielsweise ergibt natürlich auch geglättete Kanten, die aber nicht so toll aussehen:
Skalierung um nicht ganzzahlige Faktoren sind ungünstiger.
Ebenso ist solche "krumme" Skalierung ungünstig für Texturen.
Supersampling: Ist eine bessere Glättung bei gleichem Aufwand möglich?
Oversampling ist eine Supersampling-Methode, wobei nicht jedes Supersampling-Verfahren gleichzeitig Oversampling darstellt. Denn Supersampling lässt sich durch Umordnung der Subpixel effizienter gestalten. Hier spielen Begriffe wie "Edge Equivalent Resolution" eine Rolle. Warum durch ein anderes Abtastmuster die Kantenglättung besser sein kann, ist z.B. hier dargestellt, im Laufe dieses Artikels schneiden wir die Frage der Qualität auch noch mal an.
Solch "ausgefuchstes" Supersampling ist jedenfalls auf speziellen Hardware-Support angewiesen, Oversampling hingegen ist auch rein treiberseitig realisierbar. Dabei übernimmt der Treiber nicht etwa die Anti-Aliasing-Berechnungen (es handelt sich also nicht um "Software Anti-Aliasing"!!) sondern der Treiber weist die Karte an bestimmte Schritte zu unternehmen, die zur Erzeugung von diesem primitiven Supersampling-Verfahren notwendig sind.
"Oversampling" extra vom "Supersampling" abzusetzen, ist nicht unbedingt eine gängige Methode. Man könnte hier auch einfach zwischen Ordered Grid Supersampling (OGSS) und Rotated Grid Supersampling (RGSS) unterscheiden. Uns erscheint der Extra-Begriff vom Oversampling aber sinnvoll, weil damit eine ganz andere Realisierungsmöglichkeit gemeint ist, nämlich einfach die Achsen zu skalieren, während das Supersampling-Verfahren auch Methoden kennt, welche bei gleichem Render-Aufwand bessere Glättung bieten.
Das hochwertigere, so genannte "Rotated Grid Supersampling" (der Name beschreibt die Form der Subpixel-Maske) wäre mit etwas Aufwand auch rein treiberseitig realisierbar, sofern die Karte Multisample-Buffering unterstützt. Allerdings vervielfacht sich hierbei auch der Geometrie-Aufwand. Karten mit Multisample-Buffer-Support verfügen in der Praxis zudem auch immer über die angesprochenen speziellen Anti-Aliasing-Hardware-Schaltkreise.
Supersampling hat den Nachteil, pro Subpixel eine Pipeline zu benötigen. Das ist bei Multisampling nicht zwingend so.