HLSL:有问题的像素码代码(采样时alpha为零)?

时间:2011-04-03 11:21:18

标签: c# directx hlsl pixel-shader

我在像素着色器中对采样器有这个奇怪的问题。当我从采样器采样到一个空的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;
    }

我使用它而不是它可以正常工作:

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;
    }

这只发生在AMD 4850 GPU上我家的开发环境中。当我在某些nVidias或AMD5850上试用它时,无论如何都可以......

这是什么原因? 我错过了一些设备初始化吗?

干杯!

2 个答案:

答案 0 :(得分:2)

似乎像素着色器源纹理中的A确实是0 ...

纹理声明为A8R8G8B8,而device.StretchRectangle用于填充纹理。

此方法根据硬件的不同而有所不同:/

答案 1 :(得分:0)

我很想知道纹理是否是32位。主要是因为我遇到了AMD与Nvidia的问题。事实上,在一个案例中,一个非功能性着色器在另一个案例中完全正常运行(AMD工作,NVIDIA没有),因为我的顶点缓冲区声明偏移了1个字节...但我离题了,我的问题是如果未声明或不是真正的32位纹理,每个驱动程序可能会对alpha分量的解释采取自由。如果你使用不同的纹理会发生同样的事情吗?您的Alpha通道是否设置为不透明(1.0f)?

有兴趣看到我之前有过旧的AMD / NVIDIA Driver行为差异。在一个中有效的可能实际上是另一个驱动程序中的错误。