【问题标题】:Understanding GL_ARB_conservative_depth extension了解 GL_ARB_conservative_depth 扩展
【发布时间】:2015-07-25 08:16:47
【问题描述】:

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

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

【问题讨论】:

  • 您有任何关于 GL_LESS 和 depth_less 会导致早期深度测试的参考吗?至少在ARB specification 中我找不到任何提示。

标签: opengl depth-buffer


【解决方案1】:

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

layout (depth_greater) out float gl_FragDepth;

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

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

  • 如果应用了早期深度测试,它会在片段着色器之前消除深度大于当前值的片段。
  • 如果未应用早期深度测试,片段将由片段着色器处理。由于保证了fragment shader只会让值变大,所以还是会大于当前的depth值,会在fragment shader之后被深度测试淘汰。

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

layout (depth_less) out float gl_FragDepth;

GL_LESS,确实没用,早期的深度测试也不会用。

【讨论】:

  • 使用 depth_greater,如果缓冲区中的值为 0.4,像素深度为 0.2,这将通过早期深度测试,但如果我们在 FS 中将深度更改为 0.5,那么呢?
  • 那么它会在片段着色器之后的最终深度测试失败。早期深度测试不一定能替代最终深度测试。这只是一种优化,以避免对不可见的片段执行片段着色器。需要防止的是,对于可见的片段,早期深度测试失败。相反,早期深度测试通过了最终不可见的碎片,是无害的。
  • 我假设深度测试只发生一次。
猜你喜欢
  • 2014-06-15
  • 2013-06-29
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多