Premultiply with Alpha

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Premultiply with Alpha

Beitrag von starcow »

Hallo alle zusammen :-)

In einem Buch zum Thema Lighting & Rendering ("Lighting & Rendering: 3D-Grafiken meisterhaft beleuchten - Realistische Texturen entwickeln"), wurde das Thema "Premultiply with Alpha" erklärt.
Ich dachte eigentlich das Thema gut verstanden zu haben. Allerdings wiederholt sich der Autor in einem Aspekt hartnäckig - was mich jetzt ins Zweifeln gebracht hat, ob ich das Thema auch wirklich richtig verstanden habe.

Der Autor schreibt immer wieder von "vor-multiplizierten Alpha-Kanälen".
Meinem Verständnis nach, sind es aber gerade die Alpha-Kanäle, die unabhängig der Rendering-Methode (premultiplyed / unpremultiplyed) unverändert bleiben.
Vielmehr wird bei "Premultiply with Alpha" der RGB-Kanal mit dem Alpha-Kanal multipliziert.

Der einzige Grund, den ich für "Premultiply with Alpha" erkennen kann, ist der, dass das Ergebnis bereits ein Anti-Aliasing aufzeigt, obschon es eigentlich "Hintergrundlos" dargestellt werden müsste. Oder anders formuliert: Es ist als freistehendes Grafik-Element bereits hübsch anzuschauen. Später, in einem Compositing, müsste man das "Premultiply with Alpha" auf jeden Fall wieder rückgängig machen, da die schwarzen "Abdunkelungen" an den Objekt-Kanten (Anit-Alaising) eigentlich "falsch" sind. Den das Objekt steht ja nicht vor Schwarz, sondern vor dem "Nichts".

Ich habe das ganze jetzt auch nochmal genau ausgetestet. Die Alpha-Kanäle kommen bei mir immer gleich raus.
Hier das Ergebnis (Den Hintergrund habe ich zur besserer Veranschaulichung in Grau gehalten)

Bild

Genau genommen ist es doch von der Sprachlogik falsch, von vor-multiplizierten Alpha-Kanälen zu sprechen.
Macht der Autor hier einen Fehler, ist vielleicht die deutsche Uebersetzung fehlerhaft oder hab ich etwas falsch verstanden?

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Schrompf »

Knifflig. Wenn man's genau nimmt, ist "vormultiplizierter Alpha-Kanal" falsch, weil der Alphakanal ja gar nicht angefasst wird, wie Du ja schon selbst gesagt hast. "Pre-Multiplied Alpha" ist ein Konzept, bei dem die Grafikkarte so tut, als ob die RGB-Kanäle bereits mit Alpha vormultipliziert wurden. Das sorgt dafür, dass eine Grafik, die wie die obere der beiden Beispiel im Bild aussieht, also gegen einen schwarzen Hintergrund geblendet wurde, nachher auf beliebigen Hintergründen sauber teiltransparent aussieht.

Das ist aber eher ein Workflow-Trick, denn viele Tools (insbesondere Photoshop, was Du wahrscheinlich benutzt hast) sind notorisch schlecht im Umgang mit Alphakanal-besetzten Grafiken. Auch Blender rendert gern gegen schwarze Hintergründe aus. Und wenn man die Grafik als vor-multipliziert behandelt, sieht das ok aus. Es ist aber nur ein mathematischer Trick, um Scheiß-Tools zu behandeln, mehr nicht.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von xq »

Du hast bei "premultiplied" ja immer additives blending, soweit ich das verstanden habe.
also "dst = src + (1 - alpha) * dst" anstelle von "dst = alpha * src + (1 - alpha) * dst"
Damit verschwinden diese "schwarzen rahmen" automatisch, da sie ja nie im finalen bild landen (addition mit 0 → nix passiert)

soweit hab ich das jedenfalls verstanden
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Krishty »

Ja; Alpha bleibt bei Premultiplication unangetastet. Ich würde meinen, dass bei der Übersetzung das „Kanal“ zu viel reingerutscht ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Zudomon »

Irgendwie hatte ich in Erinnerung, dazu mal einen Thread aufgemacht zu haben, weil ich das auch nicht so wirklich verstanden hatte. Jedenfalls bin ich bei der Suche auf einen anderen Thread gestoßen, da wurde auch schon damals viel zu geschrieben... vielleicht hilft dir das weiter: https://zfx.info/viewtopic.php?f=5&t=3169

Damals dachte ich auch, das Premultiply mein Problem mit den Blatt-Texturen lösen könnte. Aber soweit ich mich erinnere, bringt das nichts, verschlimmert es sogar:
Was man haben möchte ist ja, dass das Blatt zum Rand hin ausgeblendet wird und nicht die Farbe ändert bzw. seine Helligkeit. Wenn man nun die Textur vorher mit dem Alphakanal multipliziert ist es wie du schon sagst so, dass es um das Blatt herum schwarz wird, weil eben da der Alphakanal transparent ist. Das Problem bei der Sache sind nun 2 Dinge.
1. das bilineare Filtering lässt den schwarzen Rand mit rein fließen
2. durch Mipmapping breitet sich dieses Schwarz auch noch aus. Es wird zwar dabei auch abgeschwächt, weil ja der Mittelwert mit der Umgebung gebildet wird, aber dennnoch unschön
Beim Softwarerendering könnte es allerdings sehr viel schneller sein, weil man eine Multiplikation auf Texelebene verlagert, die man zudem auch nur ein einziges mal durchführen muss. Man spart dann auf Pixelebene diese Multiplikation pro Frame.
Bei Hardwarerendering sind die Blendingoperation wahrscheinlich aber fest in Hardware verbaut, da wird das wohl garnichts bringen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Krishty »

Der OP hat keine Probleme mit Premultiplied Alpha, sondern mit dem Begriff im Buch.
Zudomon hat geschrieben:Damals dachte ich auch, das Premultiply mein Problem mit den Blatt-Texturen lösen könnte. Aber soweit ich mich erinnere, bringt das nichts, verschlimmert es sogar:
Was man haben möchte ist ja, dass das Blatt zum Rand hin ausgeblendet wird und nicht die Farbe ändert bzw. seine Helligkeit. Wenn man nun die Textur vorher mit dem Alphakanal multipliziert ist es wie du schon sagst so, dass es um das Blatt herum schwarz wird, weil eben da der Alphakanal transparent ist. Das Problem bei der Sache sind nun 2 Dinge.
1. das bilineare Filtering lässt den schwarzen Rand mit rein fließen
2. durch Mipmapping breitet sich dieses Schwarz auch noch aus. Es wird zwar dabei auch abgeschwächt, weil ja der Mittelwert mit der Umgebung gebildet wird, aber dennnoch unschön
Nein nein nein. Du benutzt das falsch.

1. Da wird nichts schwarz. Sonst hast du den Blending Mode falsch eingestellt.
2. Das Schwarz breitet sich nicht aus. Die Mip-Maps werden genau da dunkler, wo die Deckkraft der Textur geringer wird. Das hält sich perfekt in Waage.

Wo benutzt du eigentlich Alpha Blending in SQ? Nutzt du nicht Alphatesting?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Zudomon »

Krishty hat geschrieben:Der OP hat keine Probleme mit Premultiplied Alpha, sondern mit dem Begriff im Buch.
Mein Fehler... dumm gelaufen, da ist natürlich blöd von mir dass ich den Link gepostet habe.
Krishty hat geschrieben:Nein nein nein. Du benutzt das falsch.

1. Da wird nichts schwarz. Sonst hast du den Blending Mode falsch eingestellt.
2. Das Schwarz breitet sich nicht aus. Die Mip-Maps werden genau da dunkler, wo die Deckkraft der Textur geringer wird. Das hält sich perfekt in Waage.
Ok
Krishty hat geschrieben: Nutzt du nicht Alphatesting?
Ja
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Krishty »

Ja; Premultiplied Alpha hat mit Transparenz zu tun. Da du mit Alpha Testing nur voll transparent/garnicht transparent kennst, bringt es da nichts.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von Zudomon »

Krishty hat geschrieben:Ja; Premultiplied Alpha hat mit Transparenz zu tun. Da du mit Alpha Testing nur voll transparent/garnicht transparent kennst, bringt es da nichts.
Mit Alpha habe ich ja schon rumprobiert. Aber momentan ist es nur noch Alphatesting.
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Premultiply with Alpha

Beitrag von starcow »

Erstmal vielen Dank für die guten Informationen! :-)

Vielleicht noch kurz eine Erläuterung zur Grafik:
Das Quadrat ist ein um 45 Grad rotiertes Grid, welches ich dann mittels Mental Ray gerendert hatte.
Einmal MIT "Premultiply with Alpha", einmal OHNE.
Mit Photoshop habe ich lediglich den Alpha-Kanal aus der Grafik kopiert und diesen als einfache Ebene dargestellt. Photoshop hatte demnach keinen Einfluss das Blending.
Mit Photoshop lässt sich ein integrierter Alpha-Kanal nicht direkt fürs Compositing nutzen. Stattdessen muss man den Alpha-Kanal kopieren, und ihn als EBENEN-MASKE für die entsprechende Ebene verwenden. Photoshop kennt aber kein Premultiply with Alpha und blendet die Pixel wie sie halt vorliegen, mit der im Masken-Kanal definierten jeweiligen Transparenz.

Das Thema scheint ja in der Vergangenheit rechte Emotionen ausgelöst zu haben. :)

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Antworten