在GLSL 4.1中使用switch语句

时间:2015-12-10 16:23:50

标签: opengl switch-statement glsl

我最近看到一篇可怕的帖子,有人声称GLSL中的switch语句不使用条件分支,实际上每次进入开关时都会运行所有可能的结果。这让我很担心,因为我目前正在使用延迟渲染引擎,它使用一些嵌套的switch语句。

有没有人知道这是否有任何道理,是否有任何证据支持?

谢谢!

1 个答案:

答案 0 :(得分:4)

  

我最近阅读了一篇可怕的文章,其中有人声称GLSL中的switch语句不使用条件分支,实际上每次进入开关时都会运行所有可能的结果。

这些都不一定都是真的。至少,不是今天的硬件。

发生的事情非常依赖于编译器和底层硬件架构。所以没有一个答案。但它也非常依赖于另一件事:条件实际上是什么。

请参阅,编译器执行条件的两个边的原因与GPU的工作方式有关。 GPU通过将线程组合在一起并以锁步方式执行它们来获得性能,每个线程组执行完全相同的步骤序列。使用条件分支,这是不可能的。所以要做一个真正的分支,你必须根据哪个线程执行哪个分支来分解一个组。

相反,如果两个分支相当短,它将同时执行它们并丢弃未采用分支中的特定值。由于专门的操作码等原因,特定的值丢弃不需要破坏线程组。

好吧,如果条件基于expression which is dynamically uniform(即:在绘制调用/上下文中总是相同的表达式),那么编译器很可能不会执行双方。它会做一个真实的条件。

原因是,由于条件是动态统一的,因此组中的所有线程都将执行相同的代码。所以没有必要打破一组线程以达到适当的条件。

因此,如果你有一个基于uniform变量的switch语句,或者只涉及uniform的表达式和编译时常量变量,那么就没有理由期望它执行多个分支同时进行。

还应该注意,即使表达式不是动态统一的,编译器也不会总是执行两个分支。如果分支太长或太不同或者其他什么,它可以选择分解线程组。这可能会降低性能,但可能不会像执行两个组一样多。这完全取决于编译器如何做到这一点。