首页 > 解决方案 > 我可以在 GLSL 着色器中使用 if else 吗?

问题描述

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

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

标签: openglglsl

解决方案


据我了解,引入分支确实会产生影响。关于这个Stack Overflow Question和这个Stack Overflow Question有很多讨论

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

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

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

我会考虑:

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

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

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


推荐阅读