对数深度缓冲线性化

时间:2013-08-12 08:07:05

标签: opengl zbuffer

如何线性化对数深度缓冲区?

片段着色器中线性深度缓冲区的可视化

  float n = 1.0; // camera z near
  float f = 27000000.0; // camera z far
  float z = texture( DepthTex, TexCoord ).x;
  float d = (2.0 * n) / (f + n - z * (f - n));
  FragColor=vec4(d,d,d,1);

球体顶点着色器

vec4 ClipCoords(vec3 position,mat4 matrix)
{
   vec4 clip = matrix * vec4(position,1.0f);
   clip.z =((2.0f * log(1.0f * clip.z + 1.0f) / log(1.0f * 27000000.0f + 1.0f)) - 1.0f) * clip.w;
   return clip;
}
 gl_Position = ClipCoords(position,matrix);

左侧部分显示对数深度缓冲线性化或更确切地说它缺乏线性化,而右侧显示没有log的线性化仅仅gl_Position = matrix * vec4(position,1.0f); enter image description here

1 个答案:

答案 0 :(得分:6)

使用对数深度缓冲区,场景(相机空间)深度到最终在深度缓冲区(0..1)中结束的值的映射是:

depth_value = log(C*z + 1) / log(C*Far + 1)

其中z是进入场景的正深度,否则可以在投影后从剪辑空间中的w组件获得(在你的代码中你可以使用..log(clip.w + 1.0)..)。

要在片段着色器中检索相机空间深度,需要反转等式:

z = (exp(depth_value*log(C*far+1)) - 1)/C

或等效

z = (pow(C*far+1,depth_value)-1)/C

要获得从0..far到0..1的线性映射,只需将其除以far值。

相关问题