我做了很多关于如何手动填充深度缓冲区没有成功的研究。在此之前,我所知道的是一个深度纹理(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测试,因此通常会降低性能。所以只有在必要的时候才使用