Premultiply with Alpha
- starcow
- Establishment
- Beiträge: 526
- Registriert: 23.04.2003, 17:42
- Echter Name: Mischa Schaub
- Kontaktdaten:
Premultiply with Alpha
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)
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
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)
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
- Schrompf
- Moderator
- Beiträge: 4855
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: Premultiply with Alpha
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.
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.
- 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
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
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.
Programmiert viel in Zig und nervt Leute damit.
- Krishty
- Establishment
- Beiträge: 8241
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Premultiply with Alpha
Ja; Alpha bleibt bei Premultiplication unangetastet. Ich würde meinen, dass bei der Übersetzung das „Kanal“ zu viel reingerutscht ist.
Re: Premultiply with Alpha
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.
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.
- Krishty
- Establishment
- Beiträge: 8241
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Premultiply with Alpha
Der OP hat keine Probleme mit Premultiplied Alpha, sondern mit dem Begriff im Buch.
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?
Nein nein nein. Du benutzt das falsch.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
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?
Re: Premultiply with Alpha
Mein Fehler... dumm gelaufen, da ist natürlich blöd von mir dass ich den Link gepostet habe.Krishty hat geschrieben:Der OP hat keine Probleme mit Premultiplied Alpha, sondern mit dem Begriff im Buch.
OkKrishty 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.
JaKrishty hat geschrieben: Nutzt du nicht Alphatesting?
- Krishty
- Establishment
- Beiträge: 8241
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Premultiply with Alpha
Ja; Premultiplied Alpha hat mit Transparenz zu tun. Da du mit Alpha Testing nur voll transparent/garnicht transparent kennst, bringt es da nichts.
Re: Premultiply with Alpha
Mit Alpha habe ich ja schon rumprobiert. Aber momentan ist es nur noch Alphatesting.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.
- starcow
- Establishment
- Beiträge: 526
- Registriert: 23.04.2003, 17:42
- Echter Name: Mischa Schaub
- Kontaktdaten:
Re: Premultiply with Alpha
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
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