现代 GPU 制服上的分支成本

Cost of Branching on uniforms on modern GPUs

在现代 (GL3.3+) GPU 上使用 GLSL 时,统一分支的可能成本是多少?

在我的引擎中,我已经到了有很多着色器的地步。我为其中很多设置了几种不同的质量预设。就目前而言,我在着色器中使用带有 if() 的制服来选择不同的质量预设。然而,我担心我可能会通过重新编译着色器和使用#ifdef 来获得更好的性能。问题是在我重新编译着色器时需要担心跟踪和重置其他制服。

基本上我想知道的是我的恐惧是否没有根据。在现代 GPU 上统一分支是否便宜?我自己做了一些测试,发现两种方式的差别很小,但我只在 nVidia 680 上测试过。

我承认我不是专家,但也许我的推测聊胜于无。

我认为制服上的分支确实相当便宜。它显然与纹理或属性数据上的分支有很大不同,因为 SIMD 中的所有 ALU 都将遵循来自着色器的相同代码路径,因此它是 "real" 分支而不是执行掩码。我不太确定着色器处理器如何在其管道中受到分支气泡的影响,但管道肯定比通用 CPU 更浅(特别是考虑到它们通常 运行 的时钟速度要低得多).

我希望我能提供更多帮助,如果其他人可以更权威地回答,我也将不胜感激。然而,我,一方面,不会太担心制服上的分支。但一如既往,如果有可能,请分析您的着色器,看看它是否有任何明显的不同。