WPFピクセルシェーダ効果の取り扱いアルファチャンネル
-
18-09-2019 - |
質問
アルファ成分は、ピクセルシェーダでどのように扱われるかについて何か異常はありますか?私は私のアーティストが背景として使用するために私にグレースケール画像を与えているWPFアプリケーションがあり、アプリケーションは、現在の状態に応じて、それらの画像を色付け。だから私は、Image要素に及ぼす影響として使用する(WPFピクセルシェーダエフェクトライブラリインフラストラクチャを使用して)ピクセルシェーダを書きました。シェーダは、明るさを操作できるように、それはHSLへ変換パラメータとして色を取ります。各グレー画素について、その輝度がソースピクセルの輝度に比例して色パラメータと白の間で補間された色を計算する。
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;
}
これはピクセルアルファ= 1しかし、上だけで正常に動作し、α= 0、結果として得られるピクセルはかなり通じウィンドウの背景ショーを持つよりも、白い出てきます。だから私は小さな変更を加えます:
float4 main(float2 uv : TEXCOORD) : COLOR
{
float4 src = tex2D(implicitInputSampler, uv);
if (src.a == 0)
return src;
...
となりまし透明パーツは本当に透明です。どうして?なぜ最初のバージョンでdst.a = src.a
文は、それを達成しませんでしたか?残念ながら、それはアルファ<1 <0のピクセルのように私には見えるのででも、これは、部分的にしか修正で白出てきている。
誰が私はアルファについては理解していないよ何を知っていますか?
解決
いくつかのより多くのWeb検索した後、私は私が行方不明になった作品を発見します。
記事によると、 MSDN の上:「それはまた、我々はカスタムのピクセルシェーダでのカラー値を解釈する方法ですので、WPFは、パフォーマンス上の理由の数のためにどこでも、内部でプリマルチアルファを使用しています。」
だから、この修正は、アルファによる乗算でスローすることが判明します:
float4 main(float2 uv : TEXCOORD) : COLOR
{
...
dst.rgb *= src.a;
return dst;
}
そして今、私の出力は、私はそれを期待するように見えます。
他のヒント
0 <アルファ<1
ホワイト出てきています
どのような範囲、あなたはここに期待している?
ピクセルシェーダは、離散256色の範囲で動作しないすべての値は、範囲0.0から1.0であることを行っている...、彼らは1.0は最大強度である点を浮遊している。
あなたの計算は、R / G / B値を設定終わる場合> 1.0あなたが白得ようとしているに...
デュード私は、XNAゲームに取り組んでいます、と私は、グレースケールのピクセルシェーダを使用していたと私はあなたが直面している同じ問題を抱えて。 私donnoあなたはXNA環境かどうかに精通しているが、私はの のSpriteBatch のの描画の のSpriteBlendMode の強いを変更することで問題を解決した場合>からの のSpriteBlendMode.None ののへの のSpriteBlendMode.AlphaBlend のを、私はこれが理由を知っているあなたを助けることができると思います。
について、