PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verbesserungsmöglichkeit für Quincunx?


aths
2002-10-15, 16:37:53
Lässt sich Quincunx verbessern? Der große Quincunx-Nachteil ist ja, dass Texturen mitgeblurrt werden. Dass die Kanten unschärfer werden, ist der eigentlich gewollte Effekt.

Unschärfe ist zwar kein Anti-Aliasing, aber Quincunx wäre sicherlich brauchbarer, wenn es nur Kanten anfassen würde. Meine erste Idee war, die Quincunx-Filterung folgendermaßen zu verbessern:

http://www.aths.de/files/q1.png

Sofern die beiden "echten" Subpixel gleich sind (also FarbeA XOR FarbeB = 0) wird auf das Blurring einfach verzichtet. Denn innerhalb einer Textur wird beim Multisampling ja für alle Subpixel die gleiche Farbe geschrieben. Sind die beiden Subpixel unterschiedlich, liegt auf jeden Fall ein Kantenpixel vor, was geblurrt werden kann. Xmas meinte nun, dass sich das bei folgenden Fällen aber ungünstig auswirken würde:

http://www.aths.de/files/q2.png

Hier hat man ein Kantenpixel, was aber durch meine Methode nicht als solches erkannt wird.

Mit einigen Zutaten ließe sich das vermeiden. Man nehme:

- Einen zweiten Zeilen-Cache
- 5 XOR-Glieder
- 1 Tester auf Null

http://www.aths.de/files/q3.png

Sind die beiden Subpixel im Pixel 1, 2, 3 und 4 jeweils gleich, wird im Pixel 1 nicht geblurrt. Leider erkennt dieses Verfahren folgende Kanten nicht:

http://www.aths.de/files/q4.png

Man kann über die Farbwerte nicht entscheiden, ob Kanten- oder Innenflächen-Pixel vorliegen. Also müsste man mit einem extra Stencil-Buffer arbeiten. Dieser arbeitet folgendermaßen: Schreibt die Pipeline weniger AA-Sampels als maximal möglich (bei Quincunx also nur 1 Sample statt 2) so wird für das gesamte Pixel ein Bit auf 1 gesetzt, was da heißt: "Kantenpixel". Dann müsste zusätzlich der 2x2-Pixel-Filter zum Einsatz kommen. Sind sowohl Pixel 1, 2, 3 als auch 4 keine Kantenpixel, wird Pixel 1 nicht geblurrt. Ansonsten findet normales Quincunx statt.

Damit würde zwar um die Kanten noch etwas in die Textur hereingeblurrt, größere Textur-Flächen blieben vom Blurring aber verschont. Der Aufwand hierfür wäre aber gewaltig. Fazit: Quincunx lässt sich nicht sinnvoll verbessern.

MeLLe
2002-10-15, 19:31:19
Originally posted by aths
Fazit: Quincunx lässt sich nicht sinnvoll verbessern.
Oder im Umkehrschluss: wer will schon Quincunx? :D
Aber guter Post, aths, und sogar für mich logisch erklärt. Danke. Weiter so! Man lernt nie aus ;)

Pussycat
2002-10-15, 21:04:53
Stimmt's, dass mit 'deinem' Verfahren nicht-kanten-pixel nie geglättet, und Kanten-pixel meistens geglättet würden?

aths
2002-10-15, 22:22:23
Geglättet werden bei Multisampling nur Polygonkanten. "Mein" Verfahren blurrt jedenfalls keine Texturen mehr, dafür kann es vorkommen, dass Kantenpixel beim Blurring übersehen werden. Geglättet wird ohnehin nur dann, wenn dieses 2x RG Verfahren eine Kante im Pixel feststellen kann. (Die Kante kann aufgrund der dürftigen Pixel-Abdeckung ja auch übersehen werden.)

Pussycat
2002-10-16, 13:08:50
Gut. Jedenfalls wieder ein interessantes Stück was du da geschrieben hast.

GloomY
2002-10-16, 17:00:13
Ich nehme an, daß das Problem darin besteht, daß man feststellen muß, welches Pixel ein Kantenpixel ist und welches nicht, um den Blur-Filter anzuwenden oder eben nicht.

Zum einen liefert der Rasterizer ja für jede Zeile das jeweils erste und letzte Pixel des aktuellen Dreiecks. Und diese Pixel sind logischerweise Kantenpixel (sonst wären es ja nicht das erste/letzte Pixel).
Somit müßte man diese Informationen irgendwo in einem Buffer speichern und gegebenenfalls erneuern (beim Überschreiben durch davorliegende Pixel). Wenn man dann alle Dreiecke durch hat, muß man nur noch an den markierten Stellen den Blurr-Filter anwenden und fertig. =)

Zum anderen fällt mir da wieder ein Vorteil eines Tilers ein. Dieser weiß ja für sein aktuelles Tile, was für Dreiecke zu jedem Pixel gehören (und den zugehörigen Z-Wert). Damit könnte er nach dem Rendern des Tiles nochmals alle Pixel durchgehen und bei denen, wo ein benachbartes Pixel zu einem anderen Dreieck gehört den Blur-Filter anwenden. Alle anderen Pixel bleiben natürlich so wie sie sind.
Damit würde zwar immer noch einige Flächen geblurrt (Schnitt von Orange und Grün oder Orange und Braun), aber immerhin werden größere Flächen so komplett in Ruhe gelassen.

Demirug
2002-10-16, 17:19:23
GloomY, das ganze funktioniert dann aber zum Beispiel bei Kanten die durch überschneidung entstehen leider nicht mehr.

Beim DR braucht man wegen dem AA keine besonderen Verrengungen zu machen. Bandbreite läst sich dort sowieso nicht sparen.

GloomY
2002-10-16, 17:31:55
Originally posted by Demirug
GloomY, das ganze funktioniert dann aber zum Beispiel bei Kanten die durch überschneidung entstehen leider nicht mehr.Wieso nicht? Klär' mich mal auf.
Im obigen Bild hab' ich doch auch Kanten, die durch Überschneidung von zwei Dreiecken zusammen kommen.
Oder hab' ich da was falsch verstanden? ???
Originally posted by Demirug
Beim DR braucht man wegen dem AA keine besonderen Verrengungen zu machen. Bandbreite läst sich dort sowieso nicht sparen. Hehe, aber eine Art Quincunx nur für Kanten kann bei niedriger AA-Stufe (2-fach) sicherlich mithelfen, das Gesamtbild zu verbessern. Das ist ja von der Rendering-Methode unabhängig.

Demirug
2002-10-16, 17:46:31
Originally posted by GloomY
Wieso nicht? Klär' mich mal auf.
Im obigen Bild hab' ich doch auch Kanten, die durch Überschneidung von zwei Dreiecken zusammen kommen.
Oder hab' ich da was falsch verstanden? ???


habe mich unglücklich ausgedrückt. Ich meinte Kanten die durch Überschneidungen der Z-Werte entstehen. Das was das FAA von Matrox auch nicht glätten kann.


Hehe, aber eine Art Quincunx nur für Kanten kann bei niedriger AA-Stufe (2-fach) sicherlich mithelfen, das Gesamtbild zu verbessern. Das ist ja von der Rendering-Methode unabhängig.

der Aufwand dafür wäre aber wesentlich höher als beim reinen "Quincunx". Als dann doch lieber gleich ein gutes FAA oder Z3-AA

und bei einem DR baue ich aber einfacher ein MS in den Chip.