OpenGL GL_DEPTH_TEST vs glDepthFunc和glDepthMask?

时间:2018-02-07 07:38:54

标签: opengl graphics depth-buffer zbuffer

我一直在使用glDisable(GL_DEPTH_TEST)来禁用深度测试,认为它只会禁用深度"测试"。我之所以感到困惑是因为我创造了两个功能,一个用于禁用深度"测试",另一个用于禁用深度"写入"与glDepthMask(GL_FALSE);

如果禁用GL_DEPTH_TEST,则禁用"测试"和#34;写作"那么它是否相当于:

glDepthFunc(GL_ALWAYS​); // DISABLE TESTS (OR ACTUALLY ALWAYS LET THE TEST SUCCEED)
glDepthMask(GL_FALSE); // DISABLE WRITES

我认为禁用GL_DEPTH_TEST几乎没用,除非我想禁用测试和写入,并且我想知道哪一个更好。措辞似乎令人困惑,但也许它只是我。我想用glDepthFun(GL_ALWAYS)进行禁用深度测试仍会进行比较,我想在仍然允许写入的情况下,没有办法完全禁用深度测试?

1 个答案:

答案 0 :(得分:5)

glDisable(GL_DEPTH_TEST)

关闭管道的深度测试。如果您使用:

glDepthFunc(GL_ALWAYS​);
glDepthMask(GL_FALSE);

相反它只是在条件之后隐藏它(但仍然存在于管道中),这可能意味着某些平台上的性能差异......

如果您想再次打开原始DepthFunc,也需要使用等效设置(因为有许多渲染技术需要打开/关闭几个DeptTest次。

最后,两个 GL 函数调用的开销大于一个。因此,从性能的角度来看,使用glDisable(GL_DEPTH_TEST)会更好。 glDepthFunc,glDepthMask用于不同目的,例如多次传递呈现,order independent transparencyholes等等。