Gibt es etwas Ungewöhnliches daran, wie die Alpha-Komponente in einem Pixelshader gehandhabt wird? Ich habe eine WPF-Anwendung, für die mein Künstler mir Graustufenbilder gibt, die als Hintergrund verwendet werden können, und die Anwendung koloriert diese Bilder entsprechend dem aktuellen Zustand. Also schrieb ich einen Pixelshader (unter Verwendung der WPF Pixel Shader Effects Library-Infrastruktur), um ihn als Effekt auf ein Image-Element zu verwenden. Der Shader nimmt eine Farbe als Parameter, die er in HSL umwandelt, damit er die Helligkeit manipulieren kann. Dann berechnet er für jedes Graupixel eine Farbe, deren Helligkeit zwischen dem Farbparameter und Weiß proportional zur Helligkeit des Quellenpixels interpoliert wird.
%Vor%Das funktioniert gut bei den Pixeln, bei denen Alpha = 1 ist. Aber wo Alpha = 0 ist, werden die resultierenden Pixel weiß, anstatt dass der Hintergrund des Fensters durchscheinen würde. Also habe ich eine kleine Änderung vorgenommen:
%Vor% und jetzt sind die transparenten Teile wirklich transparent. Warum? Warum hat die dst.a = src.a
-Anweisung in der ersten Version das nicht erreicht? Leider ist dies auch nur eine teilweise Lösung, weil es mir wie die Pixel mit 0 & lt; Alpha & lt; 1 kommen weiß heraus.
Weiß jemand, was ich über Alpha nicht verstehe?
Nach etwas mehr Web-Suche entdeckte ich das Stück, das ich vermisste.
Nach einem Artikel auf MSDN : "WPF verwendet intern mehrfach vorvervielfachtes Alpha für eine Reihe von Leistungsgründen, also interpretieren wir auch die Farbwerte im benutzerdefinierten Pixelshader."
Der Fix ist also eine Multiplikation mit Alpha:
%Vor%Und jetzt sieht meine Ausgabe so aus, wie ich es erwarte.
0 & lt; Alpha & lt; 1 kommen weiß heraus
Welche Bereiche erwarten Sie hier?
Alle Werte liegen im Bereich von 0.0 und 1.0 ... Pixel-Shader funktionieren nicht in diskreten 256-Farben-Bereichen, sie sind Fließkommazahlen, wobei 1.0 die maximale Intensität ist.
Wenn Ihre Berechnungen die r / g / b Werte auf & gt; 1.0 setzen, erhalten Sie Weiß ...
Dude Ich arbeite an einem XNA-Spiel, und ich musste einen Graustufenpixel-Shader verwenden und ich habe das gleiche Problem, das du hast. Ich weiß nicht, ob Sie mit der XNA-Umgebung vertraut sind oder nicht, aber ich habe das Problem gelöst, indem ich die SpriteBatch Zeichnung SpriteBlendMode Von SpriteBlendMode.None bis SpriteBlendMode.AlphaBlend hoffe ich, dass Ihnen das den Grund dafür erklärt.
Grüße,
Tags und Links wpf pixel alphablending pixel-shader