繁体   English   中英

读取和写入HLSL 5.0中的纹理(延迟阴影)

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


我正在尝试在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缓冲区来渲染光的几何形状。

感谢您的答复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM