2011-04-03 23 views
4

我有像素着色器中的採樣器這個奇怪的問題。當我從採樣器採樣到一個空的float4變量時,我總是會得到黑色/透明色。所以,如果我用這個,我得到一個黑色的屏幕:HLSL:有問題的pixelshader代碼(採樣時爲零)?

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 GPU 4850。當我嘗試一些nVidias或AMD5850時,它在任何情況下都有效...

這是什麼原因? 我錯過了一些設備初始化?

乾杯!

+0

在第一種情況下,您正在讀取紋理中的輸出alpha並將其返回。 你的紋理是否包含alpha值? – jcoder 2011-04-04 09:19:29

+0

紋理被聲明爲A8R8G8B8,我從VMR9發送到圖像合成器的表面使用stretchrectangle。這可能是VMR中的A一直是0?奇怪的是,這與不同的圖形卡和操作系統有所不同:/ – 2011-04-06 16:06:50

回答

2

看來,在像素着色器源紋理的確是A爲0 ...

紋理被聲明爲A8R8G8B8和device.StretchRectangle用於填充紋理。

此方法效果不同,這取決於硬件:/

0

我很想知道,如果紋理是32位。主要是因爲我提出了AMD與Nvidia的問題。事實上,在一個例子中,一個非功能着色器在另一個例子中是完全可用的(AMD公司的工作,NVIDIA公司沒有),只是因爲我的頂點緩衝區聲明偏移了1個字節......但是我離題了,如果未聲明或不是真正的32位紋理,每個驅動程序可能會對alpha組件的解釋採取自由。如果使用不同的紋理,會發生同樣的事情嗎?你的Alpha通道設置爲不透明(1.0f)嗎?

有興趣的看到我以前有舊的AMD/NVIDIA驅動程序的行爲差異。其中一個驅動程序實際上可能是另一個驅動程序中的錯誤。