为什么 "discard" 只是略微降低了性能,而 "gl_FragDepthEXT" 却显着降低了性能?
Why does "discard" only slightly but "gl_FragDepthEXT" significantly reduce performance?
据我目前所读,在片段着色器中使用丢弃或更改深度值将禁用早期深度测试,从而降低着色器性能。
现在我有一个应用程序,其中使用丢弃只会产生很小的影响,但更改深度值会严重降低性能:
http://potree.org/demo/experimental/early_depth/examples/philly.html
(如果对您来说太快,请增加磅值并放大)
- 将质量设置为 "Circles" 将调用丢弃以将点渲染为圆圈。
- 将质量设置为 "Interpolation" 将更改片段深度值。
我得到了这些结果:
- 正方形:55fps
- 圈数:52fps
- 插值:30fps
使用插值时,会发生一些额外的事情,但我已经检查过它 "gl_FragDepthEXT = ..." 具有影响性能的任何类型的值。
规范基本上说深度测试发生在片段着色器处理之后。但是,规范清楚地表明,如果结果不会受到影响,则允许实现以任何顺序执行操作。
因此,gl_fragDepthEXT
,通常最好先在前面绘制不透明的东西,然后再在后面绘制,因为 GPU 可以在 运行 片段着色器之前进行深度测试。如果深度测试失败,则不必 运行 片段着色器。设置 gl_fragDepthEXT
虽然改变了这一点,因为它无法进行深度测试,直到它 运行 片段着色器之后,因为通过设置 gl_fragDepthEXT
你已经告诉它你将决定深度值。
换句话说,当您不使用 gl_FragDepthEXT
时,许多像素永远不必使用它们的片段着色器 运行,因为早期的深度测试将它们排除在外。在另一种情况下,您使用 gl_FragDepthEXT
每个像素都必须具有片段着色器 运行 因为 GPU 在您告诉它您正在计算的深度值之前无法进行深度测试.
至于 discard
我个人从未见过它需要更多时间。也许与什么相比,时间更多?如果你有一个分支 if (cond) discard;
那么你至少需要将它与具有类似分支 if (cond) color = red;
或类似分支
的着色器进行比较
据我目前所读,在片段着色器中使用丢弃或更改深度值将禁用早期深度测试,从而降低着色器性能。
现在我有一个应用程序,其中使用丢弃只会产生很小的影响,但更改深度值会严重降低性能: http://potree.org/demo/experimental/early_depth/examples/philly.html (如果对您来说太快,请增加磅值并放大)
- 将质量设置为 "Circles" 将调用丢弃以将点渲染为圆圈。
- 将质量设置为 "Interpolation" 将更改片段深度值。
我得到了这些结果:
- 正方形:55fps
- 圈数:52fps
- 插值:30fps
使用插值时,会发生一些额外的事情,但我已经检查过它 "gl_FragDepthEXT = ..." 具有影响性能的任何类型的值。
规范基本上说深度测试发生在片段着色器处理之后。但是,规范清楚地表明,如果结果不会受到影响,则允许实现以任何顺序执行操作。
因此,gl_fragDepthEXT
,通常最好先在前面绘制不透明的东西,然后再在后面绘制,因为 GPU 可以在 运行 片段着色器之前进行深度测试。如果深度测试失败,则不必 运行 片段着色器。设置 gl_fragDepthEXT
虽然改变了这一点,因为它无法进行深度测试,直到它 运行 片段着色器之后,因为通过设置 gl_fragDepthEXT
你已经告诉它你将决定深度值。
换句话说,当您不使用 gl_FragDepthEXT
时,许多像素永远不必使用它们的片段着色器 运行,因为早期的深度测试将它们排除在外。在另一种情况下,您使用 gl_FragDepthEXT
每个像素都必须具有片段着色器 运行 因为 GPU 在您告诉它您正在计算的深度值之前无法进行深度测试.
至于 discard
我个人从未见过它需要更多时间。也许与什么相比,时间更多?如果你有一个分支 if (cond) discard;
那么你至少需要将它与具有类似分支 if (cond) color = red;
或类似分支