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

3

我对手动填充深度缓冲区进行了大量研究,但没有成功。目前为止,我所知道的是在渲染过程中,OpenGL会自动填充附加到FBO上的深度纹理(GL_DEPTH_COMPONENT)。

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

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

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

如果我在主函数中写入以下代码:

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

结果是相同的!
因此,我想知道如何“告诉”OpenGL不要自动写入深度缓冲区,并考虑我的深度方程式?
我尝试了glDepthMask(false)函数,但当然这种解决方案不起作用!
实际上,我想自定义我的深度缓冲填充,并且不依赖于OpenGL在后台的操作。
我该怎么做?
唯一的方法是使用颜色缓冲区(如GL_RGB纹理格式)手动存储深度值吗?
非常感谢您的帮助!

1
gl_FragDepth是您正在寻找的内容吗?https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml - dari
好的。非常感谢!我被说服了,认为我的“FragmentDepth”变量具有相同的行为。但事实并非如此!再次感谢。再见! - user1364743
1个回答

4

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

还有一些额外的注意事项:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接