阅读与阅读在HLSL 5.0中写入纹理(延迟着色)

时间:2013-10-20 16:41:40

标签: c++ hlsl directx-11 deferred-shading


我试图在DirectX 11,c ++中实现延迟着色。我已设法创建G-Buffer并将其渲染到它(使用“GPU PerfStudio”检查)。我在最终照明阶段遇到困难。我无法使用SV_Position返回的坐标读取纹理(漫反射,正常,高光)。

这是用于将灯光渲染为形状的像素着色器。

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像素位置渲染值。

由于

2 个答案:

答案 0 :(得分:0)

您是否在设备创建时尝试使用调试标志D3D11_CREATE_DEVICE_DEBUG并查看输出日志。您可能会遇到Vertex和Pixel阶段之间的签名不匹配。这可以解释为什么sv_position语义行为不正确。

答案 1 :(得分:0)

我解决了这个问题。我正在使用相同的z缓冲区来渲染我之前用于G缓冲区的光几何。

感谢您的回复。