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



我做了很多关于如何手动填充深度缓冲区没有成功的研究。在此之前,我所知道的是一个深度纹理(GL_DEPTH_COMPONENT)附加到FBO是由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纹理格式)来手动存储深度值吗?

提前感谢您的帮助!

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

附加说明:

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

最新更新