如何使用OpenGL和GLSL手动填充深度缓冲区

时间:2015-07-30 16:56:15

标签: opengl glsl shader fragment-shader depth-buffer

我做了很多关于如何手动填充深度缓冲区而没有成功的研究。在此之前,我所知道的是附加到FBO的深度纹理(GL_DEPTH_COMPONENT)在渲染过程中由OpenGL自动填充。

例如,以下片段着色器代码可以工作:

/*
** Output pixel color value.
*/
layout (location = 0) out float FragmentDepth;

/*
** Fragment shader entry point.
*/
void main(void)
{
     //Depth filled automatically
}

因此,如果我将以下代码行写入main:

FragmentDepth = 0.0f; //the texture should be black

结果是一样的!

所以我想知道怎么可能告诉" OpenGL不会自动写入深度缓冲区并考虑我的深度方程式?

我尝试了glDepthMask(false)函数,但当然这个解决方案不起作用!

实际上,我想自定义深度缓冲区填充,而不依赖于OpenGL在后台的操作。

我该怎么做?

唯一的方法是使用颜色缓冲区(如GL_RGB纹理格式)手动存储深度值吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

自定义深度值可以使用gl_FragDepth在片段着色器中写入。见这里:https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml

一些补充说明:

  • 所有分支机构或没有分支机构必须分配gl_FragDepth否则您将获得未定义的行为
  • 使用gl_FragDepth禁用可能的早期Z测试,因此通常会降低性能。所以,只有在真的有必要时才使用它