2013-02-03 51 views
2

就性能而言,创建两个着色器,一个用于分支的每一侧,还是将一个分支放入像素着色器代码中是否更好?例如,如果我有一个高斯模糊着色器,它决定执行水平还是垂直传递,对我来说,将它分成两个单独的着色器,绑定一个然后另一个,或将分支保留在着色器中会更好代码本身,这意味着我不必为第二遍切换着色器?着色器开关v有条件的内部着色器

void main(void) 
{ 
    ... 

    if (uniform_Orientation == 0) 
    { 
     // Horizontal blur 
    } 
    else 
    { 
     // Vertical blur 
    } 
} 

我的直觉告诉我,我应该出来把它分成两个独立的着色器,但后来我不知道什么对性能的影响是切换着色器。

任何人有任何想法呢?基于例如均匀的变量使用如果与条件时:

+0

IMO,你应该使用2个独立的文件,但你应该首先在目标硬件上进行配置文件。应该注意的是,分支惩罚会减少更多像素(在相同的warp组/线程集群中)采用相同的分支。 – Necrolis

+0

因此,考虑到所有经线中的所有像素都将采用相同的路径,惩罚将为零,或者更少? – Robinson

回答

2

有在着色器两种类型的分支:

  • 静态分支。在着色器启动之前,可以对分支进行校正。
  • 动态分支:基于着色器内部的变量,例如基于变量变量的条件。这有一些成本,因为像素可以使用不同的路径。

您的问题属于静态分支。静态分支当然更好更快,然后动态。

问题的答案: 如果静态分支比着色器的实际切换速度更快,它并不那么明显。这当然取决于。但在你的例子中,你可能不会看到任何性能差异。

查看更多关于'超级着色器'有很多静态分支只是为了保持着色器切换到最低限度。 http://wiki.gametheorylabs.com/groups/judgementengine/wiki/4c55c/Uber_Shader.html

+0

非常好,谢谢你。 – Robinson