对数深度缓冲

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

在顶点着色器中:

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值是否是正确的深度吗?

1个回答

7

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

不修改矩阵的情况下,你可以使用包含正向深度的w分量:

gl_FragDepth = (log(C * gl_TexCoord[6].w + offset) / log(C * far + offset));

从深度缓冲值计算 z 值似乎是正确的,只是不要忘记你得到的是场景中的正深度,而不是 OpenGL 中标准的负深度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接