0


我正在尝试在 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 像素位置用适当的光线形状渲染该值。

谢谢

4

2 回答 2

0

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

于 2013-10-20T19:05:07.590 回答
0

I solved the problem.I was using the same z-buffer for rendering light geometries that I had used previously for G-buffer.

Thank you for your response.

于 2013-10-22T12:59:15.293 回答