恒定条件是否比切换着色器更昂贵?


14

通常,在着色器中分支不是一个好主意。但是现在我有了一个着色器,其条件对于整个绘制调用而言是恒定的。因此,对于一个绘制调用,执行的分支始终相同。

这种分支是否仍然比拥有多个没有这些分支并在它们之间切换的着色器还要昂贵?



正如答案在我的问题上所解释的那样,片段被分组为“扭曲”或“波阵面”,并且如果该组中的所有片段都使用同一分支,则仅执行该分支。
马丁·恩德

但是与片段不同的着色器呢?
nikitablack


1
我怀疑这不是重复项,但是需要对其进行编辑以明确要求什么,然后才能确定。一些示例代码或要比较的两个选项的说明会很有帮助。
trichoplax

Answers:


13

在现代硬件上,如果组中的所有调用都遵循相同的路径,则不会评估未使用的路径。

用伪代码:

if(cond){
   res = ...
}else{
   res = ...
}

变成

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

如果anyInvocationARB对着色器的任何调用都具有true as cond(来自opengl扩展ARB_shader_group_vote),则为true

如果cond仅来自制服,则驱动程序可以在开始渲染之前优化和评估条件,并使用goto替换if到正确的分支。OpenGL具有称为统一子例程的功能,该功能使其变得明确。


4
的确如此,但这并不是您唯一需要考虑的性能。GPU仍在静态地为每个着色器调度资源,因此这可能仍然像在执行两个分支一样资源,这可能会损害占用率。
约翰·卡尔斯贝克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.