【问题标题】:reconstructed world position from depth is wrong从深度重建的世界位置是错误的
【发布时间】:2013-04-21 04:58:03
【问题描述】:

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

我通过将像素坐标与投影矩阵的逆矩阵和相机矩阵的逆矩阵相乘来做到这一点。这种工作,但位置有点偏离。这是采样世界位置纹理的绝对差异:

作为参考,这是我在第二遍片段着色器中使用的代码:

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

【问题讨论】:

标签: opengl depth-buffer deferred-rendering


【解决方案1】:

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

pixelDepth=pixelDepth*2.0-1.0;

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2017-07-02
    • 1970-01-01
    • 2017-03-15
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多