读取和写入 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 缓冲区来渲染光源几何体。
感谢您的回复。
相关文章:
- 如何仅为一个函数添加延迟
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- 以在Qt中的IF语句中设置时间延迟
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 使用 CUDA 和纹理进行图像减法
- 将自定义函数传递到基抽象类中以延迟执行
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 如何在 c++ 中延迟?
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 读取和写入 HLSL 5.0 中的纹理(延迟着色)