我可以在 GLSL 着色器中使用 if else 吗?

时间:2021-03-04 10:56:17

标签: opengl glsl

使用if else对顶点和片段着色器的性能有多大影响? 我知道顶点着色器是为每个顶点调用的,可能没有很多,使用if else不太可能导致性能问题。

但是为每个像素调用片段着色器,这意味着有很多调用,在我看来,使用 if else 会对性能产生不良影响。 我希望能够使用统一变量if else来配置着色器,对吗? 对此,您有什么想说的吗?

1 个答案:

答案 0 :(得分:2)

据我所知,引入分支确实有影响。关于这个 Stack Overflow Question 和这个 Stack Overflow Question

有很多讨论

简而言之 - 它似乎取决于 2 个因素:gpu 的年龄/品牌以及您拥有的 if 语句类型:

关于 gpu age/make:gpu 上的编译器将以不同的方式处理分支。它可能能够进行优化或假设,或者它可能再次强制执行所有分支,然后选择哪个分支是有效的 - 所以你可以想象在这种情况下,很多分支真的开始影响性能。

关于“if”语句:如果您正在检查一个统一的值,那么在您的着色器程序的所有执行中都会对其进行相同的评估,那么性能影响相对较小。但是,如果您正在检查此顶点/片段代码执行的计算值,则性能损失很大。

我会考虑:

根据配置设置着色器,在您的应用代码中执行 if/else 检查,选择适当的着色器,在没有任何着色器分支的情况下运行。

和/或,研究分支的替代方法,例如可以以某种方式应用的制服 - 如果设置为某些值 - 它们实际上不会改变任何视觉效果。例如。为您的最终结果着色的 BlendColour,如果设置为白色,实际上不会改变您已经计算的任何内容。

但根据我的经验,没有什么比尝试和分析更有效的了。

相关问题