从深度缓冲区重建位置 - 缺少Z?

时间:2014-03-09 08:20:16

标签: c++ opengl matrix glsl deferred-shading

我正在我的OpenGL应用程序中实现延迟着色,而不是浪费太多内存存储位置信息,我想使用来自深度缓冲区的信息重建片段着色器中的视图空间位置。它似乎好像我有正确的x / y,虽然我不完全确定,但我知道我的z信息在窗外。这是负责重建位置的片段着色器的一部分:

vec3 reconstructPositionWithMat(void)
{
    float depth = texture2D(depthBuffer, texCoord).x;
    depth = (depth * 2.0) - 1.0;
    vec2 ndc = (texCoord * 2.0) - 1.0;
    vec4 pos = vec4(ndc, depth, 1.0);
    pos = matInvProj * pos;
    return vec3(pos.xyz / pos.w);
}

matInvProj是我的投影矩阵的反转(在CPU上计算并上传为统一mat4)。当我尝试渲染我的位置信息(fragColor = vec4(position, 1.0);)时,屏幕左下角为黑色,右下角为红色,左上角为绿色,右上角为黄色角。如果我的深度在整个场景中均匀为0.0,那么这大概就是我期望看到的,显然不应该这样。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我发现了问题,我只是简单地解释了数据。通过将其渲染为(fragColor = vec4(position.xy, -(position.z + 1.0), 1.0)),结果就像我预期的那样。另外,当我将它与缓冲区的位置(0.5 + (reconstructedPos - bufferPos))进行比较时,我的场景大部分都是灰色的,除了深度精度是一个问题的远处区域,这是我对正确重建结果的期望。