Frage

Gibt es etwas Ungewöhnliches daran, wie die Alpha -Komponente in einem Pixel -Shader behandelt wird? Ich habe eine WPF -Anwendung, für die mein Künstler mir Graustufenbilder als Hintergründe gibt, und die Anwendung stellt diese Bilder gemäß dem aktuellen Zustand. Also habe ich einen Pixel -Shader (unter Verwendung der WPF -Pixel -Shader -Effekt -Bibliotheksinfrastruktur) geschrieben, um als Effekt auf ein Bildelement zu verwenden. Der Shader nimmt eine Farbe als Parameter an, den er in HSL umwandelt, damit sie die Helligkeit manipulieren kann. Dann berechnet es für jedes graue Pixel eine Farbe, deren Helligkeit zwischen dem Farbparameter und dem weißen Verhältnis zur Helligkeit des Quellpixels interpoliert ist.

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);

    // ...Do messy computation involving src brightness and color parameter...

    float4 dst;
    dst.r = ...
    dst.g = ...
    dst.b = ...
    dst.a = src.a;
    return dst;
}

Dies funktioniert gut auf den Pixeln, bei denen Alpha = 1. aber Alpha = 0, die resultierenden Pixel weiß herauskommen, anstatt dass der Hintergrund des Fensters durchläuft. Also habe ich eine winzige Änderung vorgenommen:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 src = tex2D(implicitInputSampler, uv);
    if (src.a == 0) 
        return src;
    ...

Und jetzt sind die transparenten Teile wirklich transparent. Wieso den? Warum nicht das? dst.a = src.a Aussage in der ersten Version erreichen das? Leider ist dies nur eine teilweise Lösung, weil es für mich so aussieht, als würden die Pixel mit 0 <alpha <1 weiß herauskommen.

Weiß jemand, was ich über Alpha nicht verstehe?

War es hilfreich?

Lösung

Nach weiteren Websuche entdeckte ich das Stück, das mir fehlte.

Entsprechend Ein Artikel über MSDN: "WPF verwendet aus einer Reihe von Leistungsgründen überall überall vormultiplimiertes Alpha. So interpretieren wir auch die Farbwerte im benutzerdefinierten Pixel-Shader."

Die Fixe stellt sich also als Multiplikation mit Alpha heraus:

float4 main(float2 uv : TEXCOORD) : COLOR
{
    ...
    dst.rgb *= src.a;
    return dst;
}

Und jetzt sieht meine Ausgabe so aus, wie ich es erwarte.

Andere Tipps

0 <Alpha <1 kommen weiß heraus

Welche Bereiche erwarten Sie hier?

Alle Werte werden im Bereich von 0,0 und 1,0 liegen ... Pixel -Shader funktionieren nicht in diskreten 256 Farbbereichen, sondern sind schwimmender Punkt, an dem 1,0 die maximale Intensität ist.

Wenn Ihre Berechnungen R/G/B -Werte auf> 1.0 festlegen, werden Sie weiß ...

http://www.facewound.com/tutorials/shader1/

Alter, ich arbeite an einem XNA -Spiel, und ich musste einen Graustufen -Pixel -Shader verwenden und ich bekam das gleiche Problem, mit dem Sie konfrontiert sind. Ich done done, wenn Sie mit der XNA -Umgebung vertraut sind oder nicht, aber ich habe das Problem gelöst, indem ich das geändert habe SpriteBatch Zeichnung SPRITEBLENDMODE aus SpriteBlendMode.none zu SpriteBlendMode.Alphablend, Ich hoffe, das kann Ihnen helfen, den Grund zu kennen.

Grüße,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top