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

wsewodh2  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(91)

我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区的数量/大小,我想稍后使用深度纹理来重建世界位置。

我通过将像素的坐标乘以投影矩阵的逆矩阵和相机矩阵的逆矩阵来实现这一点。这种方式很管用,但这个位置有点不对劲。以下是采样世界位置纹理的绝对差异:

作为参考,以下是我在第二个过程片段着色器中使用的代码:

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.1Near,100.0 Far,我的几何图形是大约15的距离。我知道可能会有精度误差,但这似乎是一个太大的误差,太接近相机了。我错过了什么吗?

eaf3rand

eaf3rand1#

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

pixelDepth = pixelDepth * 2.0 - 1.0;

相关问题