为什么“丢弃”只是轻微但“gl_FragDepthEXT”会显着降低性能?

时间:2015-07-02 19:45:21

标签: opengl-es webgl

从我到目前为止所读到的内容,使用丢弃或更改片段着色器内的深度值将禁用早期深度测试,从而降低着色器性能。

现在我有一个应用程序,使用discard只会产生轻微影响,但更改深度值会严重降低性能: http://potree.org/demo/experimental/early_depth/examples/philly.html (增加点大小并放大,如果它对你来说太快)

  • 将质量设置为“Circles”将调用discard以将点呈现为圆圈。
  • 将质量设置为“插值”将更改片段深度值。

我得到了这些结果:

  • 方块:55fps
  • 圈子:52fps
  • 插值:30fps

使用插值时,会发生一些额外的事情,但我已经检查过它是“gl_FragDepthEXT = ...”,其中任何一种值都会影响性能。

1 个答案:

答案 0 :(得分:3)

规范基本上说深度测试是在片段着色器处理完毕后发生的。但是,该规范清楚地表明,如果结果不会受到影响,则允许实现按任何顺序执行操作。

所以,gl_fragDepthEXT,通常情况下最好在前面的东西之前在前面绘制不透明的东西,因为GPU可以在运行片段着色器之前进行深度测试。如果深度测试失败,则不必运行片段着色器。设置gl_fragDepthEXT虽然发生了变化,因为它在运行片段着色器之前无法进行深度测试,因为通过设置gl_fragDepthEXT你已经告诉它你将决定深度值。

换句话说,当你不使用gl_FragDepthEXT时,许多像素永远不必让它们的片段着色器运行,因为早期的深度测试会将它们排除在外。在另一种情况下,你使用gl_FragDepthEXT的每个像素必须让片段着色器运行,因为GPU在你告诉它你正在计算的深度值之后才能进行深度测试。

至于discard我从未亲眼看到它需要更多时间。也许是时候与什么相比呢?如果你有一个分支if (cond) discard;,那么你至少需要将它与具有类似分支if (cond) color = red;的着色器或沿着那些行的某个东西进行比较