4

ピクセルシェーダーのサンプラーにこの奇妙な問題があります。サンプラーから空のfloat4変数にサンプリングすると、常に黒/透明色が返されます。したがって、これを使用すると、黒い画面が表示されます。

float4 PixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0
    {
        float2 uv = TextureCoordinate;          
        float4 pixelColor = tex2D(implicitInputSampler, uv);

        //contrast
        pixelColor.rgb = ((pixelColor.rgb - 0.5f) * max(Contrast, 0)) + 0.5f;

        //brightness
        pixelColor.rgb = pixelColor.rgb + (Brightness - 1);

        // return final pixel color
        return pixelColor;
    }

II代わりにこれを使用して問題なく動作します:

float4 PixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0
    {
        float2 uv = TextureCoordinate;          
        float4 pixelColor = {0,0,0,1};
        pixelColor += tex2D(implicitInputSampler, uv);

        //contrast
        pixelColor.rgb = ((pixelColor.rgb - 0.5f) * max(Contrast, 0)) + 0.5f;

        //brightness
        pixelColor.rgb = pixelColor.rgb + (Brightness - 1);

        // return final pixel color
        return pixelColor;
    }

これは、AMD4850GPUを使用する自宅の開発環境でのみ発生します。いくつかのnVidiasまたはAMD5850で試してみると、どのような場合でも機能します...

これの理由は何ですか?デバイスの初期化を見逃しましたか?

乾杯!

4

2 に答える 2

2

ピクセルシェーダーのソーステクスチャのAは確かに0のようです...

テクスチャはA8R8G8B8として宣言され、device.StretchRectangleはテクスチャを塗りつぶすために使用されます。

この方法は、ハードウェアによって動作が異なります:/

于 2011-04-07T00:36:16.547 に答える
0

テクスチャが32ビットかどうか知りたいです。主な理由は、AMDとNvidiaの問題に直面したからです。実際、ある場合には機能しないシェーダーになるものが、別の場合には完全に機能していました(AMDは機能しましたが、NVIDIAは機能しませんでした)。宣言されていないか、真の32ビットテクスチャでない場合、各ドライバはアルファコンポーネントの解釈に自由を持っている可能性があります。別のテクスチャを使用しても同じことが起こりますか?アルファチャンネルは不透明(1.0f)に設定されていますか?

以前にAMD/NVIDIAドライバーの動作に古い違いがあったのを見て興味があります。一方で機能するのは、実際にはもう一方のドライバーのエラーである可能性があります。

于 2017-05-30T02:39:25.893 に答える