对数深度缓冲区

use*_*030 5 opengl 3d glsl

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

在顶点着色器中:

void main()
{
  vec4 vertexPosClip = gl_ModelViewProjectionMatrix * gl_Vertex;
  gl_Position = vertexPosClip;
  gl_TexCoord[6] = vertexPosClip;
}
Run Code Online (Sandbox Code Playgroud)

在片段着色器中:

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));
}
Run Code Online (Sandbox Code Playgroud)

现在我的一个算法(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;
Run Code Online (Sandbox Code Playgroud)

但是它不起作用,算法不再起作用.你知道我计算的z是否是正确的深度?

cam*_*ake 7

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

在不修改矩阵的情况下,您可以将包含正深度的w分量用于场景:

gl_FragDepth = (log(C * gl_TexCoord[6].w + offset) / log(C * far + offset));
Run Code Online (Sandbox Code Playgroud)

从深度缓冲区值计算z似乎是正确的,只是不要忘记你正在进入场景的正深度,而不是像OpenGL中标准的负面深度.