从我到目前为止所读到的内容,使用丢弃或更改片段着色器内的深度值将禁用早期深度测试,从而降低着色器性能。
现在我有一个应用程序,使用discard只会产生轻微影响,但更改深度值会严重降低性能: http://potree.org/demo/experimental/early_depth/examples/philly.html (增加点大小并放大,如果它对你来说太快)
我得到了这些结果:
使用插值时,会发生一些额外的事情,但我已经检查过它是“gl_FragDepthEXT = ...”,其中任何一种值都会影响性能。
答案 0 :(得分:3)
规范基本上说深度测试是在片段着色器处理完毕后发生的。但是,该规范清楚地表明,如果结果不会受到影响,则允许实现按任何顺序执行操作。
所以,gl_fragDepthEXT
,通常情况下最好在前面的东西之前在前面绘制不透明的东西,因为GPU可以在运行片段着色器之前进行深度测试。如果深度测试失败,则不必运行片段着色器。设置gl_fragDepthEXT
虽然发生了变化,因为它在运行片段着色器之前无法进行深度测试,因为通过设置gl_fragDepthEXT
你已经告诉它你将决定深度值。
换句话说,当你不使用gl_FragDepthEXT
时,许多像素永远不必让它们的片段着色器运行,因为早期的深度测试会将它们排除在外。在另一种情况下,你使用gl_FragDepthEXT
的每个像素必须让片段着色器运行,因为GPU在你告诉它你正在计算的深度值之后才能进行深度测试。
至于discard
我从未亲眼看到它需要更多时间。也许是时候与什么相比呢?如果你有一个分支if (cond) discard;
,那么你至少需要将它与具有类似分支if (cond) color = red;
的着色器或沿着那些行的某个东西进行比较