2013-10-20 114 views
0


我試圖在DirectX 11中實現延遲着色,C++。我設法創建了G-Buffer並渲染了我的場景(選中了「GPU PerfStudio」)。我在最後的照明階段遇到困難。我無法使用SV_Position返回的座標從紋理(漫反射,正常,高光)讀取。在HLSL 5.0中讀取和寫入紋理(延遲着色)

這是用於將光渲染爲形狀的像素着色器。

Texture2D<float4> Diffuse : register(t0); 
Texture2D<float4> Normal : register(t1); 
Texture2D<float4> Position : register(t2); 

cbuffer MaterialBuffer : register(b1) 
{ 
    float4 ambient; 
    float4 diffuse; 
    float4 specular; 
} 
//-------------------------------------------------------------------------------------- 
struct VS_OUTPUT 
{ 
    float4 Pos : SV_POSITION; 
    float4 PosVS: POSITION; 
    float4 Color : COLOR0; 
    float4 normal : NORMAL; 
}; 

float4 main(VS_OUTPUT input) : SV_TARGET 
{ 

    //return Diffuse[screenPosition.xy]+Normal[screenPosition.xy]+Position[screenPosition.xy]; 
    //return float4(1.0f, 1.0f, 1.0f, 1.0f); 
//-------------------------------------------------------------------------------------- 
    //Problematic line 
    float4 b=Diffuse.Load(int3(input.Pos.xy,0)); 
//-------------------------------------------------------------------------------------- 
    return b; 
} 

我檢查了「GPU PerfStudio」輸入紋理的正確綁定。

上面的代碼返回我用來清除紋理顏色(從我調試我發現,在像素位置0,0其返回值)

如果我和更換有問題的行: - 。

float4 b=Diffuse.Load(int3(350,300,0)); 

然後將其值在350,300像素位置處呈現爲具有適當形狀的光。

感謝

+0

你在這種情況下做什麼頂點着色器?你在光相中綁定了什麼幾何? – catflier

回答

0

你試過在設備創建調試標誌D3D11_CREATE_DEVICE_DEBUG看着輸出日誌。您可能會遇到Vertex和Pixel階段之間的簽名不匹配。這將解釋爲什麼sv_position語義不正確。

+0

我已經使用'D3D11_CREATE_DEVICE_DEBUG'顯示沒有不匹配的錯誤。 –

+0

如果您在像素着色器中添加此行,結果如何:'return float4(Input.Pos.xy/512.f,0.f,1.f);'?你有一個完整的黑色圖像或梯度飽和後512像素黃色? – galop1n

0

我解決了這個問題。我使用了相同的z-buffer來渲染先前用於G-buffer的光照幾何圖形。

感謝您的回覆。