了解GL_ARB_conservative_depth扩展名

时间:2015-07-25 08:16:48

标签: opengl depth-buffer

OpenGL说如果深度函数是GL_LESS并且布局限定符是depth_less,那么OpenGL将执行早期深度测试。

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

1 个答案:

答案 0 :(得分:4)

我不认为你问题中的价值观组合是有道理的。使用(默认)GL_LESS深度比较功能,您需要使用:

layout (depth_greater) out float gl_FragDepth;

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

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

的结果
  • 如果应用早期深度测试,它会消除深度大于片段着色器之前当前值的片段。
  • 如果未应用早期深度测试,片段将由片段着色器处理。由于保证片段着色器只会使值更大,因此它仍然会大于当前深度值,并且会在片段着色器之后通过深度测试消除。

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

layout (depth_less) out float gl_FragDepth;

使用GL_LESS,它确实无效,并且不会使用早期深度测试。