2011-01-14 11 views
3

Ich spiele mit manueller Bildbearbeitung (walk-the-pixels) und erstelle die Standard-Overlay-Mischung. Ich freue mich auf die "Photoshop math" Makros hier:Wie behandelt man Alpha in einem manuellen Overlay-Mischvorgang?

http://www.nathanm.com/photoshop-blending-math/ (See also here für besser lesbare Version Overlay)

Beide Quellbilder sind in ziemlich Standard RGBA (je 8 Bit) Format, wie das ist Ziel. Wenn beide Bilder vollständig undurchsichtig sind (Alpha ist 1.0), wird das Ergebnis korrekt wie erwartet gemischt:

Aber wenn meine "Blend" -Layer (das obere Bild) Transparenz darin hat, bin ich ein wenig flummoxed wie wie man dieses Alpha korrekt in die Mischgleichung einrechnet. Ich erwarte, dass es so funktioniert, dass transparente Pixel in der Blend-Ebene keine Auswirkungen auf das Ergebnis haben, opake Pixel in der Blend-Ebene die Overlay-Blend wie normal und halbtransparente Blend-Layer-Pixel eine skalierte Wirkung auf das Ergebnis haben.

Kann mir jemand die Mischungsgleichungen oder das Konzept dahinter erklären?

Bonuspunkte, wenn Sie mir so helfen können, dass das resultierende Bild hat richtig premultiplied alpha (die nur für Pixel ins Spiel kommt, die in beiden Schichten nicht undurchsichtig sind, glaube ich.)

Dank!

// factor in blendLayerA, (1-blendLayerA) somehow? 
resultR = ChannelBlend_Overlay(baseLayerR, blendLayerR); 
resultG = ChannelBlend_Overlay(baseLayerG, blendLayerG); 
resultB = ChannelBlend_Overlay(baseLayerB, blendLayerB); 
resultA = 1.0; // also, what should this be?? 

Antwort

0

Nur eine Vermutung, aber ich würde versuchen

resultA = 1 - (1-baseAlpha) * (1-blendAlpha) 
+0

OK, was ist der Grund dafür? Vielen Dank. –

+0

@quixoto Nun, ich möchte die beiden multiplizieren, um sie beide in der Gleichung zu haben, ohne die Transparenz zu früh zu erreichen, wenn transparente Schichten kombiniert werden (was passieren würde, wenn sie hinzugefügt werden). Aber wenn man einfach multipliziert, wird es nahe Null gesetzt, einer von ihnen ist nahe Null. Damit invertiere ich das Ganze und es fühlt sich für Testwerte "ok" an (wie 0, 0,5, 1) – Timbo

0

ich genau mit diesem Thema experimentiert wurde, bis ich, dass die beste herausgefunden, die Basis und die Mischungsschicht hat, ist sowohl mit geraden alpha , dann nur das Ergebnis mit dem Basis-Alpha.

2

nachdem die Basisfarbenmischung und die Füllfarbe, mischte, um die ursprüngliche Grundfarbe und die Farbe aus der Mischung resultierende Farbe unter Verwendung des alpha der Mischung:

vec4 baseColor = ...; 
vec4 blendColor = ...; 
vec4 blendedColor = blend(baseColor, blendColor); 
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor; 

Ich benutze dies für „overlay“ Mischen einer opake Grundfarbe und eine Mischtextur, die viele (halb) transparente Pixel aufweist.