PDA

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


aths
2002-09-10, 14:03:49
Hier lege ich mal meine letzten Gedanken zum Anti-Aliasing dar:

Gute Anti-Aliasing Subpixelmasken sollten folgende Bedingungen erfüllen:

- Mit jeder beliebigen Subpixelzahl bestmögliche Ergebnisse liefern, auch mit "krummen" (unüblichen) Zahlen wie 3 oder 5
- Pseudozufällig sein

Wie erzeugt man "gute" Zufallsmasken?

Bevor man beginnt, muss festgelegt werden, wofür die Maske gut sein soll. Meines Erachtens ist es wichtig, die EER (edge equivalent resolution) maximal zu steigern. Das bedeutet, auf beiden Achsen (X und Y) eine größtmögliche Zahl an Subpixelpostitionen zu haben, die für eine schön gleichmäßige Glättung am besten auch noch gleichmäßige Abstände zueinander aufweisen.

Ein Beispiel mit 5 Subpixeln. Zunächst wird das Pixel in 5^2 Subpixel zerlegt:

http://www.aths.de/files/aa/Bild1.gif

Nun nimmt man sich die erste Zeile vor. Irgendein Subpixel wird zufällig ausgewählt:

http://www.aths.de/files/aa/Bild2.gif

Diese Position wird außerdem vermerkt. In Zweile Nummer Zwei wird wieder ein Subpixel zufällig ausgewählt. Es darf jedoch nicht die Position des ersten einnehmen:

http://www.aths.de/files/aa/Bild3.gif

Um lästige Kontrollen und Wiederholtes "Würfeln" einer Zufallszahl zu meiden, könnte man hier mit Indizes arbeiten. Wir haben also eine Liste: (1 2 3 4 5). Es wird mit einem fünfseitigem Würfel gewürfelt (= eine Zufallszahl von 1..5 bestimmt). Dieses Subpixel wird genommen, in unserem Falle die 4. Diese Position wird aus der Liste entfernt, so dass sie nun auf (1 2 3 5) verkürzt ist. Es wird dann mit einem vierseitigem Würfel gewürfelt. Mit diesem System wird ausgeschlossen, dass bereits genutzte Positionen erneut zum Tragen kommen. Unser fertiges Muster könnte letztlich so aussehen:

http://www.aths.de/files/aa/Bild4.gif


Multisampling

Nun zur Frage, wie man mit so einer Maske Multisampling durchführen möchte. Das ist gar nicht mal so schwer. Zunächst ist das Triangle Setup natürlich mit 5 Zeilen pro sichtbarer Bildschirmzeile zu machen. Pro Pixel und Zeile kann es nur 4 Möglichkeiten geben:

(1) Das Dreieck ist nicht im Pixel. In diesem Falle wird es beim Triangle Setup gar nicht erst behandelt. Diese Möglichkeit braucht also nicht beachtet werden.

(2) und (3) - Das Dreieck beginnt oder endet in diesem Pixel.

(4) Das Dreieck liegt komplett im Pixel.

In Situation 4 muss einfach der übliche Z-Test gemacht werden. In Situation 2 und 3 muss die Start- bzw. End-Position des Dreiecks mit der Subpixelposition verglichen werden. Danach folgt dann u.U. der Z-Test.

Nun ergibt sich aber auch eine Problematik. Und zwar muss für jedes Frame für jede bestimmte Pixelposition die gleiche Subpixelmaske verwendet werden, da sich ansonsten Fehler bei der Berechnung der Überdeckung ergeben. Die Zufallszahl muss also anhand der Pixelposition bestimmt werden. Nach jedem Frame darf (und sollte) sich die Maske ändern.

Um deutlicher zu werden: Zwei nebeneinanderliegende Pixel sollten selbstverständlich unterschiedliche Subpixelmasken aufweisen, sonst wäre der pseudozufällige Effekt dahin. Bis das Frame fertig gerendet ist, muss aber sicher gestellt werden, dass die gleiche Pixelposition immer die gleiche Maske verwendet.


Auswahl der Zufallszahlen

Ein weiteres Problem ergibt sich bei der Erzeugung der Masken. Für jede Pixelposition eine Maske zu erstellen dauert nicht nur recht lange, sondern wäre auch ziemlich Speicherintensiv. Einfach ein paar vorgefertigte Masken zu nehmen, senkt den pseudozufälligen Effekt. Bei diesem 5-er Muster gibt es immerhin 120 unterschiedliche Möglichkeiten. Bei 8 Subpixeln wären es gar über 40000!

Recht zufällige Bitfolgen, die sich als Zufallszahlen verwenden lassen, sind z.B. mit dem RC4-Algorithmus möglich. Dieser ist recht einfach zu implementieren und liefert ausgehend von einem Startmuster (z.B. Datum und Uhrzeit) ein richtig gutes weißes Bitrauschen. Man könnte dort einfach bestimmte Bitmuster heraus schneiden. Nun folgende Idee:

- Pro Frame werden z.B. 16 unterschiedliche Masken "vorgerendert" und gespeichert.
- Es werden aus dem RC4-Bitstream ein paar Werte ermittelt, die für dieses Frame als Konstanten gespeichert werden (sich aber von Frame zu Frame ändern.)
- (Pixelposition MOD 16) XOR "Konstante" liefert einen Zeiger auf ein vorgerendertes Subpixelmuster.

Das kann auch etwas ausgefeilter geschehen, indem z.B. solche Zufalls-Konstanten pro Zeile erzeugt werden.

Jedenfalls bleibt unterm Strich imo ein sehr brauchbares Anti-Aliasing. Durch die Zufälligkeit wird ein leichtes Bildrauschen erzeugt, was den Realitätsgrad allerdings eher erhöhen als verringern sollte.

Demirug
2002-09-10, 14:34:55
aths,

sehr schöne Ausfertigung. Das erzeugen der Subpixelmaske scheint mir aber nicht unbedingt die Ideale Lösung zu sein.

IMHO sollte man nicht nur Sicherstellen das auf den Horizontalen und Vertikalen Linien nicht mehr als ein Sample benutzt wird sonder auch noch die Diagonalen mit einbeziehen. Allerding gäbe es dann bei 2 und 3 Samples keine gültige Maske mehr. Bei 5 Samples wären es nur noch 10 und bei 8 92 mögliche Masken.

Exxtreme
2002-09-10, 14:43:08
@ Demirug
Ack. Man sollte es auch anstreben, daß die Samples möglichst weit auseinander liegen. Das ergibt nämlich eine gleichmässigere Glättung der Kanten. Bei wenigen Samples dürfte aber das Pseudo-zufällige Abtastraster nicht so viele Vorteile bringen. Erst ab 16 Samples und mehr, dürfte es seine Vorteile eher ausspielen.

Gruß
Alex

aths
2002-09-10, 15:17:41
Originally posted by Exxtreme
@ Demirug
Ack. Man sollte es auch anstreben, daß die Samples möglichst weit auseinander liegen. Das ergibt nämlich eine gleichmässigere Glättung der Kanten. Bei wenigen Samples dürfte aber das Pseudo-zufällige Abtastraster nicht so viele Vorteile bringen. Erst ab 16 Samples und mehr, dürfte es seine Vorteile eher ausspielen.Um eine gleichmäßige Glättung zu erreichen, müssen die "Achsen-Abtast-Positionen" gleichmäßig weit voneinander entfernt sein. Das wird mit "meinem" Verfahren sichergestellt.

Originally posted by Demirug
IMHO sollte man nicht nur Sicherstellen das auf den Horizontalen und Vertikalen Linien nicht mehr als ein Sample benutzt wird sonder auch noch die Diagonalen mit einbeziehen. Allerding gäbe es dann bei 2 und 3 Samples keine gültige Maske mehr. Bei 5 Samples wären es nur noch 10 und bei 8 92 mögliche Masken. Je länger ich darüber nachdenke, desto weniger stimme ich zu.

Subpixel in einer Diagonale mindern gute Kantenglättung bei ca. 45° Winkeln. Hier bedarf es aber sowieso kaum einer Glättung, bzw. sie ist durch andere Subpixel noch hinreichend genug. Sind zufällig alle Subpixel in einer Diagonale, so kann es halt mal vorkommen, dass ein einziges Pixel für ein einziges Frame schlechte 45° Kantenglättung aufweist.

Wenn du diagonale Subpixel ausschließt, verringerst du erheblich die Zahl der Muster, was den Zufallseffekt senken dürfte. Dieser wird aber gerade gewünscht, z.B. um effektiv Moirè-Effekte zu vermeiden.

edit: Bei noch längerem Nachdenken muss ich dir doch wieder mehr Recht geben :) "Diagonale" Subpixel sind ineffektiv.

aths
2002-09-11, 14:04:38
http://www.aths.de/files/aa/Bild8.gif
Das (bzw das Spiegelbild dieses Musters) müsste die perfekte 5-er Subpixelmaske für ein Einzelraster sein.

SenTnL
2002-09-15, 14:20:39
Es ist jetz vielleicht etwas ignorant, aber könntest du vielleicht ma eine Software-Umsetzung für ein "Pseudo-AA" erstellen ? - so'ne Art Techdemo. Falls es sowas nicht schon gibt ...
Sicher wäre es hilfreich, wenn man das Muster auch noch selbst einstellen könnte. [a) Pseudo Muster b) eigenes Muster - in Einstellungen]

Wie kommst du überhaupt auf so ein Thema ? Denkst du den ganzen Tag darüber nach, was man an der virtuellen Welt verbessern kann ? Ist das vielleicht sogar dein Job ?

aths
2002-09-15, 15:30:33
Originally posted by SenTnL
Es ist jetz vielleicht etwas ignorant, aber könntest du vielleicht ma eine Software-Umsetzung für ein "Pseudo-AA" erstellen ? - so'ne Art Techdemo. Falls es sowas nicht schon gibt ...Sowas gibt es teilweise schon.
Originally posted by SenTnL
Wie kommst du überhaupt auf so ein Thema ? Denkst du den ganzen Tag darüber nach, was man an der virtuellen Welt verbessern kann ? Ist das vielleicht sogar dein Job ? Mein Job ist das nicht. Aliasing stört mich schon lange, und seit zum Voodoo5-FSAA dieses White Paper gibt, interessiert mich die Technik dahinter.

Unregistered
2002-09-30, 23:36:55
Originally posted by aths
Sowas gibt es teilweise schon.

W O ?

aths
2002-10-01, 07:46:07
Originally posted by Unregistered
W O ? Auf einer russischen Seite, die was zu Anti-Aliasing schrieb. Die URL weiß ich jetzt auch nicht mehr :/

Nach der Vorlesung heute such ich aber mal.

Kennung Eins
2002-10-01, 10:15:24
Ihr meint bestimmt das hier:
http://www.fcenter.ru/Software/Graphics/FSAADemo/fsaademo.rar

aths
2002-10-01, 11:12:10
Das meinte ich, ja :)

The ReaL PenetratoR
2002-10-01, 22:30:41
Jetz brauchen wir noch den Quellcode und jemanden, der genug Zeit & Lust & Wissen besitzt, um an diesem Tool die notwendigen Veränderungen durchzuführen (-> eigene & pseudozufällige AA-Muster).
Wer erklärt sich bereit ? :D

PS: Me is SenTnL & the Unreg =)

Kennung Eins
2002-10-01, 22:37:56
Habe ich schon erwähnt, daß ich sowas ähnliches grad zufällig für die uni schreibe? (in Java! *zitter*)

[edit]
Als gimmick wird da drin eine Linie dreidimensional dargestellt (stell dir vor, du nagelst die untere Hälfte deines Bildschirms fest und klappst die obere dann nach hinten/unten weg) um gewichtetes und ungewichtetes AA zu verdeutlichen ... :D

The ReaL PenetratoR
2002-10-01, 22:43:57
Entschuldige, aba wieso in JAVA ?
Ich glaube, dass ich genug Erfahrung habe, um sagen zu könn, dass man damit sowas nicht schreiben sollte. Mir fällt jetz natürlich keine Alternative ein, aba ... zumindest verstehe ich das "*zitter*", denn das durchfuhr mich auch eben ;)
Wieso tust du das ? Ist das ein selbstgewähltes Projekt ?
Oder ist das sogar in Vorbereitung für etwas anderes ?

Kennung Eins
2002-10-01, 22:49:23
Es ist die Forderung unseres Auftraggebers, daß es in Java geschrieben wird... und was soll man da machen ... :(

Ach so, und JA, es ist ein selbstgewähltes Projekt. Hab kein Bock auf Datenbanken oder was es da noch so alles zu tun gab fürs Softwarepraktikum...

The ReaL PenetratoR
2002-10-01, 23:00:08
Originally posted by Kennung Eins
Es ist die Forderung unseres Auftraggebers, daß es in Java geschrieben wird... und was soll man da machen ... :(

Ach so, und JA, es ist ein selbstgewähltes Projekt. Hab kein Bock auf Datenbanken oder was es da noch so alles zu tun gab fürs Softwarepraktikum...

Ha, kann ich verstehn :) Hätt mich auch so entschieden. Kannst du es posten, wenn's fertig ist ? Ist dein Auftraggeber aths ? *g* und btw wieso ist es bei dir 1h später als bei mir ;)

@aths:
Du hast doch für die pseudo-AA-Muster sicher schon 'n Algorithmus ?

Kennung Eins
2002-10-01, 23:09:27
Originally posted by The ReaL PenetratoR
Ha, kann ich verstehn :) Hätt mich auch so entschieden. Kannst du es posten, wenn's fertig ist ? Ist dein Auftraggeber aths ? *g* und btw wieso ist es bei dir 1h später als bei mir ;) LOL!!

Klar kann ich das posten! :)
Nein, aths hat nix damit zu tun. Es geht hierbei tatsächlich um perfekte subpixelmasken und nicht um die Hardwareimplementation der verschiedenen GraKa-Chip Hersteller, was es etwas einfacher macht.

Wir haben allerdings ein ganzes Semester Zeit dafür :) Wobei ich aber nicht denke, daß es so lange dauern wird, das Teil fertigzustellen.
Aber mal den Tag nicht vor dem Abend loben ... oder so.

hö? bei dir ist es doch eine stunde früher als bei mir, und nicht bei mir eine stunde später als bei dir! ;D

aths
2002-10-02, 18:06:03
Originally posted by The ReaL PenetratoR
@aths:
Du hast doch für die pseudo-AA-Muster sicher schon 'n Algorithmus ? Jopp, der wurde ja oben beschrieben. Obwohl es noch besser wäre, nebeneinander liegende Pixel (in der Diagonale) zu unterbinden. Das zu realisieren würde aber etwas aufwändiger.

The ReaL PenetratoR
2002-10-04, 11:38:40
Ja, sorry, ich meinte mit'm Algo eigentlich was Fertiges :D Sprich "sofort verwendbar in einer Programmiersprache".
Natürlich ist das mit dem Ausschließen von diagonal nebeneinander liegenden sehr schwierig, aber du wolltest doch ein gutes AA - wieso nicht gleich nahezu perfekt ? ;)
Ma grübeln ...