【问题标题】:Logarithmic depth buffer对数深度缓冲区
【发布时间】:2013-05-30 18:40:55
【问题描述】:

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

在顶点着色器中:

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

【问题讨论】:

    标签: opengl 3d glsl


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多