2013-10-20 121 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的光照几何图形。

感谢您的回复。