10

ピクセル シェーダーでのアルファ コンポーネントの処理方法に異常はありますか? アーティストが背景として使用するグレースケール画像を提供している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 のピクセルが白く見えるように見えるからです。

アルファについて私が理解していないことを誰か知っていますか?

4

3 に答える 3

24

さらにWeb検索を行った後、不足している部分を発見しました。

MSDNの記事によると、 「WPFは、パフォーマンス上の理由から、内部で事前に乗算されたアルファを使用しているため、カスタムピクセルシェーダーでカラー値を解釈する方法でもあります。」

したがって、修正はアルファによる乗算をスローすることであることが判明しました。

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

そして今、私の出力は私が期待するように見えます。

于 2010-02-10T22:41:48.127 に答える
-1

0<アルファ<1が白くなります

ここでどのような範囲を期待していますか?

すべての値は0.0から1.0の範囲になります...ピクセルシェーダーは個別の256色の範囲では機能せず、1.0が最大強度である浮動小数点です。

計算でr/g /b値が>1.0に設定された場合、白になります...

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

于 2010-02-05T08:34:14.030 に答える
-1

私は XNA ゲームに取り組んでいますが、グレースケール ピクセル シェーダーを使用する必要があり、あなたが直面しているのと同じ問題が発生しました。XNA 環境に精通しているかどうかはわかりませんが、SpriteBatch描画SpriteBlendModeをSpriteBlendMode.NoneからSpriteBlendMode.AlphaBlendに変更することで問題を解決しました。これが理由を知るのに役立つことを願っています。

よろしく、

于 2010-02-09T17:07:50.913 に答える