[英]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.