读取和写入 HLSL 5.0 中的纹理(延迟着色)

Reading & Writing to textures in HLSL 5.0 (deferred shading)

本文关键字:纹理 延迟 HLSL 读取      更新时间:2023-10-16


我正在尝试在 DirectX 11 中实现延迟着色,c++。我已经设法创建了G缓冲区并将我的场景渲染到它(使用"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 像素位置渲染值。

谢谢

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

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

感谢您的回复。