为什么 "discard" 只是略微降低了性能,而 "gl_FragDepthEXT" 却显着降低了性能?

Why does "discard" only slightly but "gl_FragDepthEXT" significantly reduce performance?

据我目前所读,在片段着色器中使用丢弃或更改深度值将禁用早期深度测试,从而降低着色器性能。

现在我有一个应用程序,其中使用丢弃只会产生很小的影响,但更改深度值会严重降低性能: http://potree.org/demo/experimental/early_depth/examples/philly.html (如果对您来说太快,请增加磅值并放大)

我得到了这些结果:

使用插值时,会发生一些额外的事情,但我已经检查过它 "gl_FragDepthEXT = ..." 具有影响性能的任何类型的值。

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

因此,gl_fragDepthEXT,通常最好先在前面绘制不透明的东西,然后再在后面绘制,因为 GPU 可以在 运行 片段着色器之前进行深度测试。如果深度测试失败,则不必 运行 片段着色器。设置 gl_fragDepthEXT 虽然改变了这一点,因为它无法进行深度测试,直到它 运行 片段着色器之后,因为通过设置 gl_fragDepthEXT 你已经告诉它你将决定深度值。

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

至于 discard 我个人从未见过它需要更多时间。也许与什么相比,时间更多?如果你有一个分支 if (cond) discard; 那么你至少需要将它与具有类似分支 if (cond) color = red; 或类似分支

的着色器进行比较