从深度重建位置 - 如何处理精度问题?

时间:2014-03-10 01:36:13

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

在我的延迟渲染器中,我成功地从深度缓冲区成功重建了我的片段位置....通过将我的结果与存储在额外缓冲区中的位置进行比较,我注意到我在屏幕上远离弹跳。这是我所看到的截图:

enter image description here

顶部的绿色和黄色部分只是天空盒,位置缓冲区包含(0,0,0),但重建算法将其解释为深度= 0.0(或1.0?)的正常片段。

使用fragColor = vec4(0.5 + (reconstPos - bufferPos.xyz), 1.0);渲染场景,因此生成的片段正好(0.5,0.5,0.5)的任何位置都是重建和缓冲区具有完全相同值的位置。可以预期深度缓冲区背面的不精确度,但品红色和蓝色看起来有点奇怪。

这是我从深度缓冲区重建位置的方法:

vec3 reconstructPositionWithMat(vec2 texCoord)
{
    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);
}

其中texCoord = gl_FragCoord.xy / textureSize(colorBuffer, 0);matInvProj是用于渲染gbuffer的投影矩阵的反转。

现在我的位置缓冲区是GL_RGBA32F(因为它仅用于测试准确性,我不关心带宽和内存浪费),而我的深度缓冲区是GL_DEPTH24_STENCIL8(我得到了类似的来自GL_DEPTH_COMPONENT32的结果,是的,我确实需要模板缓冲区。

我的znear是0.01f,zfar是1000.0f。我正在渲染一个四边形作为我的地面,它是2000.0f x 2000.0f大(我希望它足够大以至于它会用远平面剪辑)。

这种不精确程度是否可以接受?人们有什么方法可以解决这个问题?我如何重建视野/眼睛空间位置有什么问题吗?

0 个答案:

没有答案