Premultiplied alpha

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von dot »

Was du übersiehst ist, dass die Programme, mit denen du deine Bilder anschaust, im Gegensatz zu dir, kein Filtering betreiben werden und die Probleme an den Rändern kommen genau erst durch das Filtering zustande... ;)
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Mein Ubuntu-Image-Viewer filtert:
Bildschirmfoto.png
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Ich hab jetzt mal testweise beim Filtering von GL_LINEAR auf GL_NEAREST umgestellt... Dunkle Rahmen sind weg.
Scheint also zweifelsfrei am Filtering zu liegen :(
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von dot »

Jo, dein Viewer machts offenbar richtig. Die Lösung wurde ja schon genannt: Premultiplied Alpha...
Benutzeravatar
Krishty
Establishment
Beiträge: 8261
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von Krishty »

Ganz so einfach würde ich es nicht einschätzen: Er hat dunkle Ränder obwohl eigentlich weißer Rahmen in die Transparenz bluten sollte. Ich vermute (wie TGGC), dass beim Laden der Bilder irgendwas verändert wird. Erst, wenn die Pixel zweifelsfrei mit den zugewiesenen Werten in der Textur landen, wird Premultiplied Alpha helfen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von dot »

Dass dazu natürlich die Daten richtig geladen werden müssen, wurde ja bereits erwähnt, ich ging davon aus, dass man das nicht zweimal sagen muss...
Benutzeravatar
Krishty
Establishment
Beiträge: 8261
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von Krishty »

Ich hatte es selber schon fast vergessen; entschuldige :D
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von dot »

Ist ja nicht so wichtig. Zusammenfassung: Der OP hat Artefakte an den Rändern, die auf das Filtering zurückzuführen sind. Der mathematische Hintergrund ist, dass normales lineares Blending kein assoziativer Operator ist und daher mit bilinear interpolierten Werten nicht das gewünschte Ergebnis liefert. Eine einfache und effektive Lösung für das Problem ist premultiplied Alpha.
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Damit hats tatsächlich geklappt! Und das Beste: ich hab sogar noch kapiert, warum :lol:
Ich bin ja froh, dass die Diskussion über premultiplied alpha jetzt nicht umsonst war!

Kommt Ihr auf die Devmania? Dann geb ich Euch ein Bier aus :D
Bildschirmfoto.png
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von TGGC »

dot hat geschrieben:Der mathematische Hintergrund ist, dass normales lineares Blending kein assoziativer Operator ist und daher mit bilinear interpolierten Werten nicht das gewünschte Ergebnis liefert. Eine einfache und effektive Lösung für das Problem ist premultiplied Alpha.
Jetzt hoer doch bitte mit dem Scheiss auf. Unsinn verbreiten weil man keine Ahnung hat ist uncool.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: Premultiplied alpha

Beitrag von BeRsErKeR »

Ich habe hier was gelernt. Danke dafür.

Dieses e-Penis-Gehabe find ich hier allerdings einfach nur nervig und ziemlich daneben. Wer sich mit Intelligenz brüsten muss um vorzugeben scheinbar was Besseres zu sein ist in meinen Augen ein armes Würstchen.
Ohne Input kein Output.
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Hey Leute, sorry dass ich Euch noch einmal mit damit behelligen muss...
Noch eine Frage in dem Umfeld "premultiplied alpha" ist nämlich aufgetaucht:

Ich habe mein ursprüngliches Problem mit den schwarzen Rändern ja so gelöst, indem ich sichergestellt habe, dass premultiplied alpha Werte in der Textur liegen. Diese blende ich dann entsprechend richtig mit GL_ONE, weil sie eben schon premultiplied sind.
Ich muss jetzt dazu sagen, dass ich in diesem Projekt die fixed functions pipeline von OpenGL benutze. Wie es mit fragment shadern aussieht, kann ich leider nicht sagen. Jedenfalls verwende ich Aufrufe dieser Art:

GL11.glColor4f(red, green, blue, alpha);

.. um vertex-Farben einzustellen. Bisher haben hier auch immer Alpha-Werte von weniger als 1.0, also zB 0.5 für halbtransparent funktioniert. Jetzt funktioniert das allerdings nicht mehr, das Blending sieht anders aus, eigentlich transparente Bereiche sind plötzlich sichtbar. Ich kann es auf die Änderung nach premultiplied alpha zurückführen. Gehe ich zurück zur alten Implementierung ohne premultiplied alpha, funktioniert auch wieder der glColor4f-Aufruf richtig.

Könnt Ihr mir noch einen Tipp geben?
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von TGGC »

Nimm einfach wieder Texturwerte ohne Premultiplied Alpha.
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Ok, klingt einleuchtend :)
Dann hab ich jedoch mein ursprüngliches Problem wieder... Beides geht wohl nicht?
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von CodingCat »

Naja, wenn du beim Blending Pre-Multiplied Alpha voraussetzt, musst du deine Vertex-Farben natürlich auch entsprechend setzen, also r,g,b jeweils mit a multipliziert.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von TGGC »

shadow hat geschrieben:Ok, klingt einleuchtend :)
Dann hab ich jedoch mein ursprüngliches Problem wieder... Beides geht wohl nicht?
Doch, einfach kein Schwarz sondern die passenden Farbe in die Textur setzen.
shadow
Establishment
Beiträge: 147
Registriert: 26.02.2009, 14:04
Alter Benutzername: floyd
Wohnort: Nürnberg
Kontaktdaten:

Re: Premultiplied alpha

Beitrag von shadow »

Vielen Dank für die Hinweise!

So ging es dann:
glColor4f(r*a, g*a, b*a, a);
Antworten