着色器切换v条件内部着色器

时间:2013-02-03 12:36:31

标签: opengl branch shader

在性能方面,创建两个着色器(一个分支的每一个,或者在像素着色器代码中放置一个分支)是否更好?例如,如果我有一个高斯模糊着色器,它决定执行水平或垂直传递,我会更好地将它分成两个单独的着色器,绑定一个然后另一个,或保持分支在着色器内代码本身,意味着我不必为第二次传递切换着色器?

void main(void)
{
    ...

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

我的直觉告诉我应该将它拆分成两个单独的着色器,但后来我不确定切换着色器的性能影响。

有人对此有任何想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

查看有关具有大量静态分支的'超级着色器'的更多信息,以便将着色器切换到最小。 http://wiki.gametheorylabs.com/groups/judgementengine/wiki/4c55c/Uber_Shader.html