了解 GL_ARB_conservative_depth 扩展

Understanding GL_ARB_conservative_depth extension

OpenGL 表示如果深度函数为 GL_LESS 且布局限定符为 depth_less,则 OpenGL 将执行早期深度测试。

现在,如果缓冲区中的原始值为 0.5,并且特定像素的深度为 0.8,则早期深度测试将失败。但是如果我们将值修改为 0.4 那么它应该不会失败。在这种情况下这是如何工作的?

我认为您问题中的值组合没有意义。使用(默认)GL_LESS深度比较功能,需要使用:

layout (depth_greater) out float gl_FragDepth;

仍然允许进行早期深度测试。通过此声明,您可以保证,如果您在着色器中更改深度值,只会使其变大。

使用GL_LESS比较功能,未通过深度测试的片段的深度值将大于深度缓冲区中的当前值。这意味着可以使用早期深度测试而不影响 depth_greater:

的结果
  • 如果应用早期深度测试,它会在片段着色器之前消除深度大于当前值的片段。
  • 如果不应用早期深度测试,片段将由片段着色器处理。既然保证片段着色器只会让这个值变大,那么它还是会比当前的深度值大,在片段着色器之后会被深度测试淘汰。

将任何布局限定符与任何深度函数一起使用是完全合法的。但是如果你使用:

layout (depth_less) out float gl_FragDepth;

GL_LESS,实在是无济于事,前期深度测试也不会用到