2

就性能而言,创建两个着色器,一个用于分支的每一侧,还是在像素着色器代码中放置一个分支更好?例如,如果我有一个高斯模糊着色器,它在执行水平或垂直传递之间做出决定,我最好将它分成两个单独的着色器,先绑定一个,然后再绑定另一个,或者将分支保留在着色器内代码本身,这意味着我不必为第二遍切换着色器?

void main(void)
{
    ...

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

我的直觉告诉我应该把它分成两个单独的着色器,但是我不确定切换着色器对性能的影响是什么。

有人对此有任何想法吗?

4

1 回答 1

2

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

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

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

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

请参阅有关具有大量静态分支的“超级着色器”的更多信息,以将着色器切换到最低限度。http://wiki.gametheorylabs.com/groups/judgementengine/wiki/4c55c/Uber_Shader.html

于 2013-02-03T17:13:36.277 回答