在现代(GL3.3 +)GPU上使用GLSL时,在制服上分支的可能成本是多少?
在我的引擎中,我已经到了我有很多着色器的地方。我有很多不同的质量预设。就目前而言,我在着色器中使用带if()的制服来选择不同质量的预设。然而,我担心通过重新编译着色器并使用#ifdef可以获得更好的性能。问题是当我重新编译着色器时需要担心跟踪和重置其他制服。
基本上我想知道的是我的恐惧是否毫无根据。在现代GPU上以均匀便宜的方式分支?我自己做了一些测试,发现两种方式差别不大,但我只测试了nVidia 680。
答案 0 :(得分:5)
我承认我不是专家,但也许我的推测总比没有好。
我认为制服上的分支确实相当便宜。它与纹理或属性数据上的分支明显不同,因为SIMD中的所有ALU将遵循着色器的相同代码路径,因此它是真实的"真实的"分支而不是执行掩码。我不太清楚着色器处理器如何在其管道中受到分支气泡的影响,但是管道肯定比通用CPU更浅(特别是考虑到它们通常运行的时钟速度要低得多)。
我希望我能提供更多帮助,如果其他人可以更权威地回答,我也会感激不尽。但是,对于其中之一,我不会过分担心制服上的分支问题。但与往常一样,如果您有可能,请对着色器进行分析,看看它是否有明显区别。