重建的世界位置从深度来看是错误的。

4
我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区数量/大小,我希望使用深度纹理稍后重构世界位置。
为此,我将像素坐标乘以投影矩阵和相机矩阵的逆矩阵。虽然这种方法有一定效果,但是位置会有一点偏差。下面是采样的世界位置纹理的绝对差异:
参考文献,这是我在第二次通过片段着色器中使用的代码:
vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT);
float pixelDepth = texture2D(depth, screenPosition_texture).x;

vec4 worldPosition = pMatInverse*vec4(VertexIn.position, pixelDepth, 1.0);
worldPosition = vec4(worldPosition.xyz/worldPosition.w, 1.0);
//worldPosition /= 1.85;
worldPosition = cMatInverse*worldPosition_byDepth;

如果我取消注释worldPosition /= 1.85,位置会得到更好的重构(在我的几何体/深度值范围内)。在将我的输出与存储在第三个纹理中的输出进行比较后,我通过调整得到了这个值。
我使用了0.1近点和100.0远点,我的几何体约为15。我知道可能存在精度误差,但这似乎是一个离相机太近的错误。我有什么遗漏吗?

可能是重复的问题:从clipspace.xyz和(inv)投影矩阵计算clipspace.w - Nicol Bolas
1
谢谢!原来我在从缓冲区获取深度后没有进行转换。以前不知道关于ndcspace的深度转换。pixelDepth=pixelDepth*2.0-1.0;解决了问题 :)编辑:现在我该如何将其标记为已回答? - Dr Bearhands
你必须自己回答自己的问题! - Felix K.
1个回答

2

正如评论中所提到的:
我没有将深度值从NDC空间转换为裁剪空间。
我应该增加这一行:

pixelDepth = pixelDepth * 2.0 - 1.0;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接