Multisampling Anti-Aliasing unter der Lupe
22. Mai 2003 / von aths / Seite 7 von 8
Qualität vs. Supersampling: Ist Qualität das beste Rezept?
Multisampling berechnet pro Pixel einen Texturwert, und nicht pro Subpixel. Supersampling hingegen hat sozusagen ein Textur-Oversampling integriert, was letztlich in einem anisotropen Filter-Effekt resultiert. So zumindest die Theorie. In der Praxis gilt das für GeForce-Karten, aber nicht für Radeon-Karten die Supersampling verwenden. Dort wird, um ein klein wenig Performance zu gewinnen, bei den meisten Treibern das Textur-Detail via MIP-Map-LOD "zurück-korrigiert". GeForce-Karten hingegen nehmen den Qualitätsvorteil bei Texturen voll mit, ohne dass man was dafür tun muss. Bei Voodoo-Karten war es notwendig, für erhöhtes Texturdetail von Hand am LOD-Regler zu spielen.
Der "echte" anisotrope Filter (abgekürzt "AF") kann jedenfalls vergleichbare Qualität mit deutlich weniger Berechnungsaufwand erzeugen, weshalb die Kombination von MSAA + AF vorzuziehen ist. Allerdings hat Multisampling bei Texturen gegenüber Supersampling einen Nachteil wenn so genanntes Alpha Testing ins Spiel kommt.
Der Alpha Test kann Textur-Werte, die als unsichtbar markiert sind, durchsichtig machen, indem das komplette Pixel nach dem Alpha Test verworfen wird und nicht in den Framebuffer gelangt. Gerade ältere Spiele setzen auf diese Technik. Es entstehen Kanten innerhalb einer Textur, Supersampling glättet das, Multisampling natürlich nicht. Die Textur wird nicht schlechter, sondern bleibt so, wie sie ohne Anti-Aliasing auch aussehen würde.
Wenn man über Texturen redet, muss auch das Wort "Nyquist-Grenze" erwähnt werden. Jene Grenze erlaubt zu berechnen, welche Texturauflösung gewählt werden muss, damit das Bild noch so scharf wie möglich ist, ohne jedoch zu flimmern. Einfach gesagt, ist ein Verhältnis von "1 gefiltertes Texel pro Pixel" optimal. Für AF braucht man mehrere gefilterte Texel pro Pixel, die dann aber aus höher aufgelösten MIP-Texturen gesampelt werden müssen.
AF sorgt dank adaptivem Oversampling aus höher aufgelösten Texturen dafür, dass verzerrte Texturen weniger unscharf sind, als sie ohne AF wären. Verzerrte Texturen sind logischerweise immer dann anzutreffen, wenn man mit flachem Winkel auf ein Polygon sieht. Die Alpha-Texel werden ebenso aus den höher aufgelösten MIP-Texturen gesampelt. Hierbei bleiben aber immer ganze Pixel unsichtbar, und nicht nur einige AF-Textur-Samples. Es tritt somit eine Verletzung des Nyquist-Kriteriums auf, die Folge ist unsägliches Flimmern. Das Flimmern würde weniger stark ohne AF, dafür sind dann alle verzerrten Texturen vergleichsweise matschig.
Supersampling Anti-Aliasing löst dieses Problem nicht, das Bild wird trotzdem deutlich besser: Einerseits bekommen normale Texturen einen AF-Effekt, und falls AF zusätzlich aktiv ist, werden die Texturen trotzdem noch ein wenig besser. Wichtiger: Die Flimmereien bei den Alpha-Texturen werden natürlich reduziert, da die ganze Alpha-Textur intern mit feineren Schritten gesampelt wird. Statt nur transparente ganze Pixel gibt es mit Supersampling transparente Subpixel. Dieser Vorteil wird zum Teil wieder zunichte gemacht, da wegen dem intern feineren Textur-Sampling auch aus einer höher aufgelösten MIP-Stufe gesampelt wird (sofern eine höher aufgelöste MIP-Textur noch verfügbar ist), in der Praxis ist so ein Bild mit Supersampling trotzdem angenehmer als mit Multisampling. Gerade fein verzweigte Baumkronen flimmern mit Multisampling kräftig.
Beim Alpha Blending (statt Alpha Testing) ist das Flimmer-Problem sehr viel geringer. Alpha Blending ermöglicht, zwischen "sichtbar" und "transparent" noch abzustufen. Ein Texel kann z.B. als "20% sichtbar" markiert werden. Dann wird sowohl die Farbe aus der Textur gesampelt als auch die entsprechende Stelle aus dem Framebuffer gelesen, und der entsprechend gemischte Farbwert dann in den Framebuffer zurück geschrieben. Hier gibt es allerdings ein Problem, Alpha Blending funktioniert nämlich nur dann korrekt, wenn von hinten nach vorne gerendert wird. Denn natürlich müssen die hinteren Objekte durchscheinen, und nicht die vorderen. Den Bildaufbau von hinten zu gestalten ist nachteilig, was die Effizienz angeht (man versucht in der Regel, von vorne nach hinten zu rendern.) Mit statischer Renderreihenfolge sind zudem bei einigen Betrachtungswinkeln falsche Ergebnisse zu sehen, wie zum Beispiel bei Max Payne: Von unten sieht die Gitter-Treppe korrekt aus, von oben aus betrachtet scheint der Schnee durch, wo man Gitterstäbe sehen müsste.
Sofern die Renderreihenfolge darauf Rücksicht nimmt, welche Texturen mit Alpha Blending behandelt werden, ist dieses Verfahren qualitätsmäßig dem Alpha Test überlegen. Allerdings steigt sowohl die Anforderung an die Grafikkarte, als auch die CPU-Last.
Offenbar wäre unter dem Qualitäts-Aspekt die beste Lösung, Alpha Testing mit Supersampling zu kombinieren. Leider bieten alle heutigen modernen Karten Supersampling (wenn überhaupt noch) nur als den schlechten Oversampling-Modus an. Hier wird mehr Leistung verbraten als Qualität erzeugt. Die Multisampling/Oversampling-Kombinationen, die nVidia ab GeForce3 anbieten, sind also nicht empfehlenswert. Es sei denn, man hat überschüssige Leistung die man nicht mehr in höheren Auflösungen anlegen kann. Dass der 4xS-Modus trotzdem Beliebtheit erlangte erklärt sich nicht zuletzt aus der allgemein schlechten 4x MSAA-Leistung bei GeForce3 und 4.
Rechts 4xS: 4 Subpixel, 2 Subtexel. Der Modus ist 4x MS überlegen, aber noch lange nicht optimal.
Der Vollständigkeit halber noch 4xS für GeForce3:
4xS war mit Tweakern schon verfügbar, bevor er offiziell für GeForce4 angekündigt wurde.
Am Rande sei noch bemerkt, dass die GeForce4 MX kein 4x MSAA beherrscht, sondern nur 2x. Im 4x-Modus wird einfach 2x2 Oversampling realisiert. 4xS ist, als Kombination von 2x MSAA mit 1x2 Oversampling, natürlich trotzdem verfügbar.
Nun wird es Zeit, ein Resumee zu ziehen.