Zum 3DCenter Forum
Inhalt




Multisampling Anti-Aliasing unter der Lupe

22. Mai 2003 / von aths / Seite 3 von 8


   GeForce Multisampling: Auf die schnelle Art

Multisampling bedeutet zunächst nur, für jedes Pixel nur noch einen Textur-Wert zu sampeln, obwohl mehrere Subpixel erzeugt werden. Anders gesagt: Während Supersampling das gesamte Bild in höherer Auflösung rendert, werden mit Multisampling nur noch die Kanten mit höherer Auflösung berechnet, nicht aber die Texturen. Weil das Sampling den größten Teil der Texel-Pipeline ausmacht, ist es möglich, durch eine Erweiterung der Pipeline gleich mehrere Multisampling-Anti-Aliasing-Samples mit einer einzigen Pipeline zu berechnen. Genau so wird es auch gemacht. Wie gehen die nVidia-Chips nun vor? Unser Beispiel gilt der höheren Verbreitung wegen konkret für GeForce4 Ti und FX, worin die Unterschiede zur GeForce3 liegen, wird noch geklärt.

Das Triangle Setup ist dazu da, um die Pixel-Pipelines mit Arbeit zu versorgen. Beim Beispiel GeForce wird für das Multisampling-Anti-Aliasing (MSAA) dieses Triangle Setup mit doppelt feiner Auflösung vorgenommen. Pro Bildschirm-Zeile werden zwei Dreiecks-Zeilen erzeugt. Die intern höhere Auflösung gilt natürlich nicht nur für Zeilen, sondern auch für Spalten. Ein Beispiel:

Aus Effizienzgründen arbeitet das Triangle Setup bei modernen Karten aber nicht mehr mit Zeilen, sondern mit Blöcken. Bei der GeForce hat so ein Block die Größe von 2x2 Pixeln, das Dreieck wird also nicht zeilenweise gerendert, wie auf Seite 1 dargestellt, sondern blockweise. Übrigens wird auch der Early Z-Test immer für solche 2x2-Blöcke vorgenommen. Unser Block umfasst 4 Pixel, da ist klar, dass jede der vier GeForce-Pipelines für jeweils ein Pixel im Block zuständig ist.


Im aktuellen Block ist das Pixel rechts unten zu einem Viertel vom Dreieck bedeckt.

Die Pipelines bekommt nun je ein Pixel vorgesetzt. In diesem Beispiel bleibt drei der Pipelines arbeitslos, da nur einer der vier Pixel innerhalb des Polygons liegt. Ein Verschnitt dieser Art ist bei Kanten unvermeidlich, bei einer zeilenbasierten Architektur, die sozusagen 4x1-Blöcke verarbeitet, wäre der Verschnitt in der Summe noch größer. Generell steigt dieser Verschnitt und die daraus folgende Ineffizienz, je kleinere Dreiecke gerendert werden. Aufwändige Geometrie mit vielen Rundungen erzeugt viele kleine Dreiecke, weshalb es sinnvoll ist, das Triangle Setup speziell dafür zu optimieren.

An dieser Stelle noch die Bemerkung, dass die Blockbildung stufenweise erfolgt. Das Dreieck wird zunächst mal in grobe Blöcke unterteilt, um beispielsweise Daten zu ermitteln, aus denen später die Z-Werte berechnet werden, und dann noch mal in feinere Blöcke aufgeteilt, die in die Early Z-Prüfung kommen und anschließen bei zumindest partieller Sichtbarkeit gerendert werden. Die LOD-Berechnung für's MIP-Mapping findet übrigens pro 2x2-Block und nicht pro Pixel statt. Das ist noch genau genug, und man spart etwas Rechenaufwand.

Die Gründe für Blockbildung sind vor allem darin zu suchen, dass die Render-Effizienz gegenüber einer zeilweisen Verarbeitung erheblich steigt. Es wird ja immer auf volle Burstlines optimiert, um das Speicherinterface auszunutzen, und bei blockweisem Rendering gelingt es, den Verschnitt gegenüber zeilenbasiertem Rendering erheblich zu reduzieren. Außerdem sind die Cache Hits beim Rendering in Blöcken deutlich besser, wodurch wiederum Speicherbandbreite gespart wird.

Beenden wir den Ausflug in die Optimierung-Strategien und verfolgen nun den Weg der Subpixel durch eine einzelne Pipeline.

Sie erzeugt letztlich ein Textur-Sample, das für alle Subpixel gilt. Beim Multisampling gibt´s für jedes Subpixel einen eigenen Framebuffer. Da in unserem Beispiel lediglich ein Subpixel im Polygon liegt, wird unser Textur-Sample auch nur in den Framebuffer geschrieben, der zum passenden Subpixel "oben rechts" gehört. Es gibt zwei Möglichkeiten, warum es "leere" Subpixel im Pixel geben kann: Entweder gehören sie nicht zum Polygon, oder der Z-Test ergab, dass hier eine Bedeckung vorliegt.


Jedes Subpixel hat "seinen" Framebuffer, die auch Multisample Buffer genannt werden.

Beim Downfiltering werden alle vier Framebuffer gelesen und die Farbwerte gemittelt, um die finale Pixelfarbe zu bekommen. Hier ensteht dann auch die Glättung der Kanten.

Mit Multisample-Buffern lassen sich außer Anti-Aliasing noch andere Effekte darstellen, wofür dann aber deutlich mehr als nur 4 solcher Buffer notwendig sind. Hierfür mangelt es weniger am RAM, sondern vor allem an der Leistung. Übrigens ist es wirklich irrelevant für die Funktion, ob die Buffer "nebeneinander" oder "ineinander" stehen. Ob also in mehrere Buffer, oder speziell adressiert in einen vergrößerten Buffer gerendert wird, ist eine Frage, welche die Funktion in keiner Weise beeinflusst.






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

Shortcuts
nach oben