ピクセル シェーダーでのアルファ コンポーネントの処理方法に異常はありますか? アーティストが背景として使用するグレースケール画像を提供しているWPFアプリケーションがあり、アプリケーションは現在の状態に従ってそれらの画像に色を付けます。そこで、Image 要素の効果として使用するピクセル シェーダー (WPF Pixel Shader Effects Library インフラストラクチャを使用) を作成しました。シェーダーはパラメーターとして色を取り、明るさを操作できるように 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
最初のバージョンのステートメントがそれを達成しなかったのはなぜですか? 残念ながら、これでも部分的な修正にすぎません。0 < alpha < 1 のピクセルが白く見えるように見えるからです。
アルファについて私が理解していないことを誰か知っていますか?