Opengl 对数深度缓冲器

Opengl 对数深度缓冲器,opengl,3d,glsl,Opengl,3d,Glsl,我使用对数深度缓冲区:在我的着色器中,我编写了代码描述 在顶点着色器中: void main() { vec4 vertexPosClip = gl_ModelViewProjectionMatrix * gl_Vertex; gl_Position = vertexPosClip; gl_TexCoord[6] = vertexPosClip; } 在片段着色器中: void main() { gl_FragColor = ... const float C = 1.0;

我使用对数深度缓冲区:在我的着色器中,我编写了代码描述

在顶点着色器中:

void main()
{
  vec4 vertexPosClip = gl_ModelViewProjectionMatrix * gl_Vertex;
  gl_Position = vertexPosClip;
  gl_TexCoord[6] = vertexPosClip;
}
在片段着色器中:

void main()
{
  gl_FragColor = ...
  const float C = 1.0;
  const float far = 1000000000.0;
  const float offset = 1.0;
  gl_FragDepth = (log(C * gl_TexCoord[6].z + offset) / log(C * far + offset));
}
现在,在我的一个算法中(SSAO与经典深度缓冲区配合得很好),我想恢复片段的深度。以下是我使用的公式:

    const float C = 1.0;
    const float far = 1000000000.0;
    const float offset = 1.0;
//depth
    z=(pow(C*far+offset,depth_in_depth_buffer)-offset)/C;

但是它不起作用了,算法也不起作用了。您知道我计算的z深度是否正确吗?

您是如何准备gl_ModelViewProjectionMatrix的?如果使用标准的,vertexPosClip.z将包含已投影的深度,因此是错误的

在不修改矩阵的情况下,可以使用在场景中包含正深度的w组件:

gl_FragDepth = (log(C * gl_TexCoord[6].w + offset) / log(C * far + offset));
从深度缓冲区值计算z似乎是正确的,但不要忘记,您在场景中获得的是正深度,而不是OpenGL中标准的负深度