PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anti-Aliasing


Firefall
05.08.2005, 13:07
Wie sehen die Abstufungen für das Anti-Aliasing aus? Gibts da einen Standard?
Das Prinzip des ganzen ist ja das ein Übergang zwischen zwei Farbtönen (Normalerweise Vordergrund & Hintergrund) errechnet wird. Wie gross sind die Abweichungen ca, und wieviele Stufen gibts zwischen Start- und Endfarbe???


Jan Krüger
06.08.2005, 15:15
Ein bisschen schwieriger ist es dann doch. Anti-Aliasing funktioniert ungefähr so: du zeichnest/berechnest dein Bild auf einer höheren Auflösung als der, die du im Endeffekt haben willst. Dann skalierst du das Bild runter und interpolierst dabei (am einfachsten linear: du nimmst einfach den arithmetischen Mittelwert der Pixel, die sich im feiner aufgelösten Bild an der gleichen Stelle befunden haben; Interpolation höherer Ordnung gibt natürlich ein schöneres Ergebnis).
So kriegst du z.B. bei einem 640x480-Bild eine "Genauigkeit" von einem halben Pixel, wenn du das Bild in 1280x960 produzierst und dann runterskalierst.
Bei vektorbasierten Bildern spart man sich normalerweise den Zwischenschritt, das Bild zuerst auf höherer Auflösung zu rendern, sondern macht gleich Subpixel-Rendering. Davon habe ich allerdings keine Ahnung; ich benutze solche Renderer nur. ;)

Firefall
06.08.2005, 15:44
Okay, Danke für deine Antwort. Die Methode mit dem skalieren möchte ich/kann ich für mein Vorhaben nicht verwenden. Aber dieses "Subpixelrendering" ist warscheinlich das was ich suche. Weiss jemand etwas darüber?

Jan Krüger
06.08.2005, 17:11
Prinzipiell rasterst du beim Rendern von Vektorgrafik diverse Kanten. Du musst jetzt einfach, statt zu überlegen, *ob* ein Pixel auf der einen Seite der Kante liegt oder der anderen, berechnen, in welchen Anteilen das Pixel auf beiden (oder gar noch mehr, wenn sich mehrere Kanten treffen) Seiten befindet, und die Farben der Flächen entsprechend zusammenrechnen.
Beispiel: ein Pixel liegt auf einer Kante zwischen einer grünen und einer blauen Fläche, und zwar mit etwa gleicher Verteilung (50% grüne Fläche, 50% blaue Fläche). Du mischst also grün und blau zusammen: 0.5*(0r, 1g, 0b) + 0.5*(0r, 0g, 1b) und kriegst 0r, 0.5g, 0.5b. Das Ergebnis ist also ein mittelhelles Türkis.

Golden_Arms
06.08.2005, 17:32
Das Subpixelrendering (auch Adaptive Supersampling) ist dadurch entstanden, dass man den erhöhten Rechenaufwand und Speicherbedarf vermeiden wollte.

Ein Beispiel:
Für zweifaches Antialiasing brauchst du 4 mal soviel Speicher für das Bild, das es ja runterskaliert werden muss. Für vierfaches Antialiasing (die am meisten benutzte Qualitätsstufe) brauchst du 16 mal soviel Speicher für das Bild.
Bei 2-fachem Antialiasing kann man noch deutlich den Treppeneffekt wahrnehmen, bei 4x nur noch bei sehr genauem hinsehen.

16 mal soviel Speicher... bei einem 640x480 großen Bild wären das 640*480*(3 Farbkanäle)*16 = 14 MB!

Adaptive Supersampling funktioniert so: wenn die Farbdifferenz zwischen 4 Pixeln größer ist als ein bestimmter Toleranzbereich (=Kontrast), dann rendert man einen der Pixel in der erhöhten Auflösung und berechnet dann aus den erhaltenen Farbwerten das arithmetische Mittel und setzt die 4 neuen Farbwerte in den Pixel ein. Dieser Vorgang wird für jeden Pixel des Bildes angewendet.

Scheinbar dauert Subpixelrendering länger, doch das ist nicht der Fall, da nicht solch enorm große Speichermengen hin und her transportiert werden müssen. Zu dem enthält der SSE-Befehlssatz zwei Funktionen, die den Vorgang beschleunigen (PAVGB (bereichnet den Durchschnitt) und PSADBW (berechnet die Differenzen)).

Das von ATI und nVidia angewendete Antialiasing heißt OrderedGrid- oder RotatedGrid-Antialiasing. Wie das genau funktioniert, weiß ich auch nicht, aber es basiert auf Adaptive Supersampling und erzeugt deutlich höherwertiges AntiAliasing.

Jidder
06.08.2005, 20:58
Ein Artikel der mMn sehr gut auf die Theorie des Anti-Aliasing eingeht ist dieser hier: http://www.3dcenter.de/artikel/anti-aliasing/index03.php
Er erklärt auch was Ordered Grid und Rotated Grid AA ist. Der hat mir sehr bei der Implementierung von AA in meinem Raytracer geholfen.

Blue Cobold
06.08.2005, 21:13
Es gibt 2 Methoden für AA:
1) Das Bild größer zeichnen und dann aus mehreren Pixeln eins machen (Realtime-Renderer und Raytracer machen das so) Das ist Runtime-AA.
2) Post-Image-AA berechnet man durch Fourier-Transformationen und damit einhergehende Farb-Analyse. Das wird dann schon hässlich mathematisch und numerisch.

Firefall
07.08.2005, 19:19
Das ganze geht jetzt aber zu weit in den Hardware bereich hinein, scheint mir. Ich werde euch am besten mal eine leichte Abstraktion meines Vorhabens präsentieren: Stellt euch vor ihr öffnet Paint, zeichnet mit dem Lienienwerkzeug eine Dicke Linie (Eine Diagonale, um genau zu sein) und schaltet nun in die 800% Ansicht. Jetzt nehmt ihr den Stift und versucht die Linie so zu bearbeiten, das sie in der 100% Ansicht Perfekt wirkt, also keine sichtbare Treppen-form mehr aufweist. Wie geht ihr dabei vor?!?

Ps: Ich weiss schon wie man Paint öffnet, eine dicke Linie zeichnet, und in die 800% Ansicht und wieder zurück schaltet LOOOOOOOL :D :D :D

Blue Cobold
07.08.2005, 22:17
Ich würde links und rechts der schwarzen linie eine graue malen, bzw. eine semitransparente. Aber nachträgliches AA ist wirklich ein schweinemäßig mathematischer Aufwand!