C# HLSL:有问题的像素着色器代码(采样时alpha为零)?

C# HLSL:有问题的像素着色器代码(采样时alpha为零)?,c#,directx,hlsl,pixel-shader,C#,Directx,Hlsl,Pixel Shader,像素着色器中的采样器有一个奇怪的问题。当我从采样器采样到一个空的float4变量时,我总是得到黑色/透明的颜色。所以如果我用这个,我会得到一个黑屏: float4 PixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0 { float2 uv = TextureCoordinate; float4 pixelColor = tex2D(implicitInpu

像素着色器中的采样器有一个奇怪的问题。当我从采样器采样到一个空的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;
    }
这只发生在我的开发环境在家里的AMD4850GPU上。当我在一些nVidias或AMD5850上试用时,它在任何情况下都能工作

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


干杯

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

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


此方法的工作原理因硬件而异:/

我想知道纹理是否为32位。主要是因为我遇到了AMD和Nvidia的问题。事实上,在一种情况下,非功能着色器在另一种情况下是完全功能的(AMD工作,NVIDIA没有),只是因为我的顶点缓冲区声明偏移了1字节…但我离题了,我的问题是,如果alpha组件是未声明的或不是真正的32位纹理,那么每个驱动程序可能在解释alpha组件时都有自由。如果使用不同的纹理,是否会发生相同的情况?您的alpha通道是否设置为不透明(1.0f)


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

在第一种情况下,您从纹理读取输出alpha并返回它。您的纹理是否包含alpha值?该纹理声明为A8R8G8B8,我使用VMR9发送到图像合成器的曲面的stretchrectangle。可能是VMR中的A始终为0?奇怪的是,不同的图形卡和操作系统会带来不同的效果:/