Kantenglättung (AA) in PB

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Wenn Du wirklich nur die Kanten glätten möchtest (in einem Bild), dann musst Du zuerst mal die Kanten erkennen. das funktioniert praktisch wie ein Relieffilter, der krasse Wechel in der FArbe/Helligkeit erkennt. An dieser Stelle wird dann ein Filter angewendet, der die Umgebungsfarben anpasst.
0 0 0
0 X 0
0 0 0

oder 4x4 oder noch grösser, je nachdem, wie stark du die Kanten geglättet haben möchtest. Du kannst auch den einzelen Pixeln Wichtungen verpassen, das verändert uach den Effekt.

Gute Artikel über Bildfilter findest Du hier und entsprechend daneben:
http://www.codeproject.com/cs/media/dis ... ect=845609

Der Autor ist Christian Graus, der hat noch andere gute Artikel über Imagefiltering geschrieben. Echt lohnenswert...
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Weis jemand ne andere Lösung?
Jup. Wenn du eine GeForce-Grafikkarte hast, kannst du unter Desktop->Rechte Maustaste->Eigenschaften->Einstellungen->Erweitert->Tab mit deiner Grafikkarte->Leistungs- & Qualitätseinstellungen->Anti-Aliasing-Einstellung einstellen was du magst. AA wird dann vom Treiber eingeschaltet und läßt sich durch das Programm glaubig nicht ändern.

Geht dann aber nur auf deinem Rechner wie gewünscht.


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

eine sehr billige lösung währe, das sprite aufzuteilen in den kern und einen 1-2 pixel breiten rand, als 2 getrennte sprites, und das randsprite dann mit ein wenig transparenz zu zeichnen. danach das innere spriteohne transparenz drüber und schon hast du einen sehr ähnlichen effekt.
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag von orange-blue »

Zaphod hat geschrieben:eine sehr billige lösung währe, das sprite aufzuteilen in den kern und einen 1-2 pixel breiten rand, als 2 getrennte sprites, und das randsprite dann mit ein wenig transparenz zu zeichnen. danach das innere spriteohne transparenz drüber und schon hast du einen sehr ähnlichen effekt.
Sowas ähnliches hab ich schon probiert :D. schaut leider nicht so toll aus :(
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

Ein Sprite könnte man auch folgendermaßen glätten:

Man benutzt DrawingBuffer() und geht Pixel für Pixel so vor: Zuerst ermittelt man die Farbe des aktuellen Pixels, danach die Farben der benachbarten Pixel. Aus diesen ermittelten Farben bildet man nun den Mittelwert. Die erhaltene Farbe wird in einem anderen Buffer mit den gleichen Dimensionen wie der Original-Buffer des Sprites gespeichert, und zwar an den gleichen Koordinaten. Um einzustellen, wie stark das Bild weichgezeichnet werden soll, kann man z.B festlegen, wie sehr sich die Farben der Nachbarpixel auf die Gesamtfarbe auswirken (z.B. die Farbe des Aktuellen Pixels 70% und die Farben der Nachbarpixel 30%). Zum Schluss überschreibt man den Buffer des Original-Sprites mit dem anderen Buffer, in dem die Mittelwerte gespeichert wurden.

Fertig! :allright:
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Das zwingt einen aber, es in Assembler zu schreiben, sonst geht hier jeder Rechner in die Knie.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@BlueSpirit
so funktioniert das im grunde auch.
in der Help zu POVRay [ www.povray.org ] ist der Algorythmus für AntiAliasing sehr präzise beschrieben.
in unserem fall geht es dann halt um die farbwerte des ursprungssprites,
nicht um die per ray ermittelten szenenfarbwerte.


ein problem dabei:
die pixel am rand der grafik haben weniger nachbarn, das kann zu krassen verfälschungen führen.

@Hellhound
das performance-problem ist eigentlich vernachlässigbar:

du mußt den vorgang nur ein einziges mal durchführen.

- am anfang des spielstarts fällt es nicht soo ins gewicht.
- vorab erledigen, und die veränderten grafiken ins paket packen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Ach so, ich dachte dass das Echtzeit AA werden sollte...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Hellhound66 hat geschrieben:Ach so, ich dachte dass das Echtzeit AA werden sollte...
hm... in dem fall hättest du natürlich völlig recht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

Kaeru Gaman hat geschrieben: ein problem dabei:
die pixel am rand der grafik haben weniger nachbarn, das kann zu krassen verfälschungen führen.
Das stimmt schon. Aber man könnte das Problem beheben, indem man z.B. den Algorythmus so programmiert, dass er die Pixel am Rand auslässt, sodass sichergestellt ist, dass jedes Pixel einen Nachbarn hat. Die Rand-Pixel behalten dann ihre ursprüngliche Farbe. Das ist aber zu verkraften, da die Pixel am Rand sowieso meistens transparent sind.
Antworten