在我的延迟渲染器中,我已经成功地从深度缓冲区重建了我的片段位置......主要是。通过将我的结果与存储在额外缓冲区中的位置进行比较,我注意到我在远离屏幕的地方弹出了很多内容。这是我所看到的屏幕截图:
顶部的绿色和黄色部分只是天空盒,其中位置缓冲区包含 (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.0fx 2000.0f 大(我希望它足够大,可以与远平面夹住)。
这种不精确程度是否可以接受?人们有哪些方法可以解决这个问题?我如何重建视图/眼睛空间位置有问题吗?