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

Can I use if else in GLSL shaders?

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

但是片段着色器是为每个像素调用的,这意味着有很多调用,在我看来使用if else会对性能产生不好的影响。 我希望能够使用 uniform variablesif else 配置着色器,对吗? 你对此有何看法?

据我了解,引入分支确实有影响。关于这个 Stack Overflow Question and this

有很多讨论

简而言之 - 它似乎取决于 2 个因素:gpu 的 age/make 以及你有什么样的 if 语句:

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

关于 'if' 语句:如果您正在检查一个统一值,那么在您的 Shader 程序的所有执行中都会对它进行相同的评估,那么对性能的影响相对较小。但是,如果您要检查此 vertex/fragment 代码执行的计算值,那么性能会受到很大影响。

我会考虑:

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

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

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