Antialiasing und Farben

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Tobias1983
Beiträge: 7
Registriert: 14.10.2009, 12:53

Antialiasing und Farben

Beitrag von Tobias1983 »

Hallo zusammen,

ich beschäftige mich gerade mit Antialiasing.
und habe in meinem eigenen kleinen Programm Schriften gezeichnet
die verschiedene Graustufen besitzen.

-> Bei Schwarz auf Weiß ist das gar kein Problem.

-> Jedoch sobald ich z.B. Rot auf Grün mache, funktioniert das nicht

Jetzt also zu meiner Frage wie Vereine ich Vorder und Hintergrundfarbe miteinander.

Ich hoffe jemand kann mir dabei helfen.

Gruß Tobias
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 583
Registriert: 05.07.2003, 11:17

Re: Antialiasing und Farben

Beitrag von Lord Delvin »

Die Schrift speicherst du in einem channel oder als RGBA(i, i, i, i), wobei i die Intensität im jeweiligen Punkt ist. Beim zeichnen legst du ein Quadrat mit hintergrundfarbei drunter und malst das dann in der vordergrundfarbe. Alternativ kannst du auch die ersten 3 i durch 255 ersetzen, ich glaub aber dass das so besser aussieht.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Schrompf
Moderator
Beiträge: 4886
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Antialiasing und Farben

Beitrag von Schrompf »

Für das Zeichnen mit der Grafikkarte ist RGBA(255, 255, 255, i) sogar Bedingung. Dann benutzt man noch Vertexfarben als Modulation und fertig ist das AA-Rendering.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Tobias1983
Beiträge: 7
Registriert: 14.10.2009, 12:53

Re: Antialiasing und Farben

Beitrag von Tobias1983 »

hmmmm.....

ich glaube vielleicht habe ich das auch ein wenig falsch beschrieben.
Hier meine Ergänzung

ich zeichne z.B. eine Linie ( 0 - 255 Graustufen ).

Linie 3 x 3 Pixel: (RGB) C0 - Dunkler

0x00C00000,0x00900000,0x00000000
0x00900000,0x00C00000,0x00900000
0x00000000,0x00900000,0x00C00000

jetzt möchte ich die Vordergrund und Hintergrund-Farbe setzen

z.B. Vordergrund(ROT) = 0x00 0xFF 0x00 0x00
Hintergrund(BLAU)= 0x00 0x00 0x00 0xFF

So und jetzt muss ich ja irgendwie Rot Blau und die Graustufen vermischen damit ich einen guten Antialiasing Wert bekomme. ( zum darstellen )

Also irgendwie
Pixel 0:
Farbe = (Vordergrund * Pixel[0]) | ( Hintergrund * Pixel[0])...

oder so irgendwie...

Gruß Tobias
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 583
Registriert: 05.07.2003, 11:17

Re: Antialiasing und Farben

Beitrag von Lord Delvin »

Achso.

Dann ist P = P' * v + (0xFF - P')*h

mit P neue farbe, P' Intensität, v Vordergrund- und h Hintergrundfarbe.

Edit: dann möchtest du aber glaub ich auch das Bild vorher in einem uint_8 speichern. (also unsigned char)
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Tobias1983
Beiträge: 7
Registriert: 14.10.2009, 12:53

Re: Antialiasing und Farben

Beitrag von Tobias1983 »

Hey super vielen Dank,

das funktioniert =)

Gruß Tobias
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Antialiasing und Farben

Beitrag von Zudomon »

Also was du wolltest ist Alphablending, das Überblenden zweier Farben und nicht Antialiasing, das Mehrfachsampeln eines Pixels um eine höhere Genauigkeit zu erreichen.

Im Endeffekt ist es ein Lerp Befehl: x + s(y-x), so wie es der Lord schon geschrieben hat.
x und y sind Hintergrund und Vordergrundfarbe.
s die Skaliering von 0 - 1, wobei ein Wert von 0 dann x und der Wert 1 dann y entspricht.

Ich meine, dass hier im Forum schonmal ein Thread war, wo es darum ging, sehr schnelles Alphablending zu erreichen, oder irre ich mich?

Wenn du stattdessen echtes Multisampling machen möchtest, dann wäre die einfachste Methode, die mir da einfällt, die Linie mehrmals zu zeichnen. Jedes mal wird diese dann etwas versetzt, wobei dieses je nachdem, wie stark das weichzeichnen sein soll, maximal unter einem Pixel vom Startwert erfolgen sollte.
Dabei würdest du z.B. bei vier Sampels jede Linie auch nur mit einem viertel der Intensität zeichnen, so das an dem Pixel, wo alle vier Sampels auf die Linie fallen, die Linie auch die maximalste Intensität hat. Also um das korrekt zu machen musst du folgendermaßen vorgehen:
Du sammelst bei der Linie erstmal, wie viele Sampels die Linie treffen an einem bestimmten Pixel. Entweder verfehlen alle, dann haste 0% Trefferquote, oder alle treffen, dann entsprechend 100%. Das ist die Intensität der Linie Anhand des Antialiasing. Nun kann es sein, dass die Linie halb Transparent ist. Dafür müsstest dann die Trefferquote mit der Transparenz multiplizieren. Diese Endintensität lässt du nun in die oben genannte Formel einfließen.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 583
Registriert: 05.07.2003, 11:17

Re: Antialiasing und Farben

Beitrag von Lord Delvin »

Zudomon hat geschrieben:Also was du wolltest ist Alphablending, das Überblenden zweier Farben und nicht Antialiasing, das Mehrfachsampeln eines Pixels um eine höhere Genauigkeit zu erreichen.
Das ist so nicht ganz richtig. Antialiasing bedeutet, dass du Aliasingeffekte reduzierst. Das kannst du auch machen, indem du die Linie mit dem Pixel faltest; das Ergebnis sollte sogar wesentlich besser aussehen als Multisampling;)
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Antworten