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