【问题标题】:Reading & Writing to textures in HLSL 5.0 (deferred shading)在 HLSL 5.0 中读取和写入纹理(延迟着色)
【发布时间】:2013-10-20 16:41:39
【问题描述】:


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

谢谢

【问题讨论】:

  • 在这种情况下,您的顶点着色器在做什么?对于光照阶段,您将什么几何体绑定到它?

标签: c++ hlsl directx-11 deferred-shading


【解决方案1】:

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

【讨论】:

  • 我已经在使用D3D11_CREATE_DEVICE_DEBUG 没有显示不匹配错误。
  • 如果在像素着色器中添加这一行:return float4( Input.Pos.xy / 512.f, 0.f, 1.f );,结果如何?您是否有全黑图像或 512 像素后饱和为黄色的渐变?
【解决方案2】:

我解决了这个问题。我使用相同的 z-buffer 来渲染我之前用于 G-buffer 的光几何图形。

感谢您的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多