我可以使用如果在GLSL着色器?



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

但是对于每个像素调用片段着色器,这意味着有很多调用,在我看来,使用如果否则可能会对性能产生不良影响。我想能够配置着色器使用统一变量如果否则,是正确的吗?你对此有什么看法?

根据我的理解,引入分支确实有影响。关于这个堆栈溢出问题和这个堆栈溢出问题有很多讨论

简而言之,这似乎取决于两个因素:gpu的年龄/制造以及你有什么样的if语句:

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

的"if"语句:如果你检查一个统一的值,这将在你的着色器程序的所有执行中被评估相同,那么性能影响相对较小。但是如果你检查的是顶点/片段代码执行的计算值,那么性能会受到很大的影响。

我会考虑:

有了每个配置的着色器,在你的应用代码中做if/else检查,选择合适的着色器,在没有任何着色器分支的情况下运行。

和/或,看看分支的替代方案,例如,可以在某种程度上应用制服,如果设置为某些值,它们实际上不会改变任何视觉结果。例如,blendcolor,着色你的最终结果,如果设置为白色,实际上并不改变任何你已经计算。

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

相关内容

最新更新