我试图在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像素位置渲染值。
由于
答案 0 :(得分:0)
您是否在设备创建时尝试使用调试标志D3D11_CREATE_DEVICE_DEBUG
并查看输出日志。您可能会遇到Vertex和Pixel阶段之间的签名不匹配。这可以解释为什么sv_position语义行为不正确。
答案 1 :(得分:0)
我解决了这个问题。我正在使用相同的z缓冲区来渲染我之前用于G缓冲区的光几何。
感谢您的回复。