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 远。我知道可能存在精度误差,但这似乎有点太大了,离相机太近了。我在这里错过了什么吗?

4

1 回答 1

2

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

pixelDepth=pixelDepth*2.0-1.0;
于 2014-07-30T16:15:02.160 回答