为啥shader中如果有使用变量的if或for会变慢?

全局变量的问题不熟悉。分支的问题,是由GPU的设计特性决定的。GPU是一个控制器带一窝运算器执行同样的程序。当遇到分支的时候,把false的运算器关了,带着true的运算器跑一通,然后再把true的关了,打开false的,把另外一个分支跑一通。所以,除非你能保证一窝的运算器有同样的分支,那就得各跑一次,自然就慢了。这也是为什么GPU的纸面运算力非常非常高,实际用的时候很难发挥出来。
■网友
……改成uniform后,这被认为是一个由外部传入的可变参数,因此不会进行优化。不加uniform它只是一个常量,你代码里与它相关的计算都会在编译期间合并,for循环也不复存在,当然快了。

GPU的分支运算逻辑并没有缺陷,它只是在“某些时候”需要无视条件跑完所有的分支(解释起来比较麻烦先不说了),会有一定的性能浪费。但是条件只涉及uniform参数的时候并不会跑多余分支,而假如条件涉及到纹理采样,顶点数据时,使用if是最优解。虽然是有浪费,但也没有更好的办法。
总之,把if转换成step,绝不可能变快。

我知道这是一个老问题,其实我是从这篇文章过来的
shader中uniform变量的if或for判断会降低帧率 - xiaxl - CSDN博客

我其实满赞同有测试精神的人的,但你也得会分析结果啊。这个作者之所以觉得if有性能问题,是因为他忽略了7个if (aa == 1.0) 条件判断本身的性能消耗,经过编译器优化后,条件判断之外的代码也就一句四元数赋值而已,最后的结果也就慢了一倍,这恰恰说明,if的性能是没有问题的。

■网友
gpu由很多个 运算kernel 构成 bluramount 声明局部变量 则每个kernel 一份 用uniform 则共享这个变量 共享存储 和局部存储 访问速度可能不同吧
其二 gpu 存储不能给所有kernerl 一次性分配 存储资源 供使用 就导致 需要多批次 也可能会 降低速度
以上只是我猜测 具体细节 不知

■网友
【为啥shader中如果有使用变量的if或for会变慢?】 GPU不熟悉。


    推荐阅读