Jetzt mit Plus alles auf einer Seite lesen

Jahres-AboUNSER TIPP

12 Monate

 Bester Preis
 Heftarchiv jederzeit buchbar
2,99€

pro Monat

Auf geht's
Quartals-Abo
3,99€

pro Monat

3 Monate

 20% günstiger als Flexi-Abo
 Heftarchiv jederzeit buchbar
3,99€

pro Monat

Auf geht's
Flexi-Abo
4,99€

pro Monat

1 Monat

 Monatlich kündbar
 Heftarchiv jederzeit buchbar
4,99€

pro Monat

Auf geht's

Screenspace Antialiasing - Die etwas andere Kantenglättung

Arne Schober von Yager hat einen effizienten Algorithmus entwickelt, der nachträglich Antialiasing-Artefakte entfernen kann. Für unser Entwicklermagazin Making Games verrät er, wie das funktioniert.

von MakingGames.de ,
20.07.2011 10:26 Uhr

Antialiasing-Verfahren lassen sich grob in zwei Kategorien einteilen: Zum einen in Verfahren, die Antialiasing-Artefakte verhindern, und zum anderen in jene, die Antialiasing- Artefakte nachträglich entfernen. Auf letztere Gruppe werde ich im Folgenden näher eingehen. Zum jetzigen Zeitpunkt können Screenspace-Techniken wie »Morphological Antialiasing« (Reshetov, 2009) klassisches Antialiasing nicht ersetzen. Vielleicht können sie dieses aber ergänzen, um auch unter schwierigen Bedingungen Antialiasing anbieten zu können. So verbraucht unsere Implementierung von Screenspace Antialiasing nur etwa 2 bis 4 Bytes zusätzlich für jeden Pixel. Der Algorithmus besteht aus drei Teilen, die auf der Xbox 360 und der Playstation 3 teilweise auch auf der CPU berechnet werden können. Alle Teile können natürlich auch individuell an die Anforderungen des Entwicklers angepasst werden. Ich möchte hiermit eine Teilmenge von Implementierungsvarianten vorstellen und hoffe, dass der Leser eventuell seine eigenen Ideen einfließen lässt.

Achtung: Dieser Artikel wurde ursprünglich für Entwickler verfasst und geht stellenweise entsprechend tief in die technischen Details.

Die grundlegende Idee hinter Screenspace Antialiasing ist, lange Kantenartefakte im Vordergrund nachträglich zu entfernen, um das bewegte Bild zu beruhigen. Im Hintergrund wird es mangels nötiger Informationen durch die Unterabtastung immer schwieriger, sinnvolle Kanten zur Glättung zu erkennen. Darüber hinaus neigt der Algorithmus dazu, diese Bildteile zu verwischen und vernichtet dabei sogar noch mehr Information. Generell sollte eine Unterabtastung in der Entfernung durch einen geeigneten »Level of Detail« vermieden werden, soweit es technisch möglich ist und konzeptionell auch Sinn ergibt. Der wahrnehmungspsychologisch bedingte Verlust von Bildschärfe kann auch durch einen leichten Filmgrain- Effekt wieder angehoben werden.

Screenspace Antialiasing An Der direkt Vergleich: So sieht die Szene mit Screenspace Antialiasing aus.

Aus Ohne Kantenglättung verpixelt die Szene stark.

Meine Lösung im Detail

Um die Kanten glätten zu können, müssen diese im ersten Schritt zunächst einmal erkannt werden. Dabei kann ein beliebiger Kantendetektionsfilter verwendet werden. Ich habe mich für einen »1D Laplace Filter« entschieden, weil ich die waagerechten und senkrechten Kanten getrennt voneinander behandeln möchte. Ein solcher Filter ist außerdem bestens dazu geeignet, nichtlineare Eingabedaten wie beispielsweise Tiefeninformationen zu verarbeiten. Ich habe diesen Teil des Algorithmus auf der GPU belassen, um auf eine große Auswahl an Eingabedaten zurückgreifen zu können – das Ganze, ohne alle Daten in den CPU-Adressraum kopieren zu müssen. Insbesondere hat ein zusätzlicher Screenspace-Buffer mit Texturkoordinaten die Kantenerkennung merklich verbessert. Das Ergebnis der Kantenerkennung ist ein Screenspace-Buffer, in den alle erkannten Kanten eingetragen werden. Ich habe einen 8-Bit- Buffer benutzt und jeweils 4 Bit für die Horizontalen sowie Vertikalen reserviert. Dabei wurde in den ersten 3 Bits enkodiert, mit welchen Eingabepuffern (Tiefe, Texturkoordinaten und Nor-die Kanten erkannt wurden. Das ist aber nur für eventuelle Erweiterungen im darauffolgenden Schritt interessant. In einem Test ließ sich bereits die Kantenerkennung verbessern, indem eine Kante nur dann als solche erkannt wurde, wenn mindestens zwei Stufen in den Texturkoordinaten, der Tiefe oder den Normalen gefunden wurden. Der zweite Schritt des Algorithmus lässt sich dann auf den Konsolen-CPUs berechnen. Es war nämlich eine Methode vonnöten, um die Länge der Kantenabschnitte zu messen und dann unser Antialiasing zu realisieren. Mit der CPU ist das relativ einfach, indem man von Norden, Süden, Westen und Osten über das Bild fährt und einen Zähler für jeden Bildpunkt mitlaufen lässt. Wenn eine Kante erkannt wird, setzt man diesen Zähler einfach wieder auf null.

Kantendaten lesen

Um die Kantendaten effizient auf der CPU lesen zu können, empfiehlt sich ein lineares Texturformat. Um dann in Nord- und Südrichtung beim Zählen nicht unnötig große Sprünge im Speicher machen zu müssen und einen effizienten Einsatz von SIMD-Befehlen zu ermöglichen, sollten die in vertikaler Richtung erkannten Kanten vorher transponiert werden. Das kann bereits bei der Berechnung auf der GPU erledigt werden oder auch in einem Extraschritt auf der CPU. Mit der Technik der rekursiven Dopplung wäre auch eine gänzliche Implementierung auf der GPU möglich (Biri, Herubel, & Deverly, 2010), solange dafür noch ausreichend Ressourcen zur Verfügung stehen. Um den Speicherverbrauch für den Distanzpuffer zu halbieren, kam ein Kollege auf die Idee, dass doch nur die minimale Entfernung für jeden Pixel zum nächsten Kantenabschnitt von Interesse sei. Verfolgt man diese Idee, so kann man den horizontalen West- und Ostschritt wie auch den vertikalen Nord- und Südschritt zusammenfassen. Bei der CPU-Implementierung muss man zwar immer noch alle vier Durchgänge berechnen, man spart aber den Speicher für zwei Entfernungen. Bei einer Implementierung auf der GPU ließ sich nicht nur der Speicher, sondern auch die Anzahl der Zählschritte halbieren. Um auf der GPU eine Entfernung der Länge »n« messen zu können, benötigt man den Logarithmus zur Basis 2 von n Durchgängen, wobei hier gleichzeitig die Entfernung in beide Richtungen gemessen werden kann. Man muss an dieser Stelle abwägen, ob die Kosten für die Synchronisierung mit der CPU die Kosten der Berechnung auf der GPU aufwiegen. Das ist stark von den zur Verfügung stehenden Ressourcen abhängig, weshalb hierfür keine generellen Tipps gegeben werden können.

1 von 2

nächste Seite



Kommentare(25)

Nur angemeldete Benutzer können kommentieren und bewerten.