就性能而言,是创建两个着色器(分支的每一侧一个)更好,还是将分支放在像素着色器代码中更好?例如,如果我有一个高斯模糊着色器,它决定执行水平或垂直 channel ,那么我最好将其分成两个单独的着色器,先绑定(bind)一个,然后再绑定(bind)另一个,或者将分支保留在着色器内代码本身,这意味着我不必为第二遍切换着色器?
void main(void)
{
...
if (uniform_Orientation == 0)
{
// Horizontal blur
}
else
{
// Vertical blur
}
}
我的直觉告诉我应该将其分成两个单独的着色器,但我不确定切换着色器对性能有何影响。
有人对此有什么想法吗?
最佳答案
着色器中有两种类型的分支:
- 静态分支:例如,当使用 if 和基于统一变量的条件时。可以在着色器启动之前计算分支。
- 动态分支:基于着色器内部的变量,例如基于变化变量的条件。这会产生一些成本,因为像素可以使用不同的路径。
您的问题属于静态分支。静态分支当然比动态分支更好更快。
问题的答案: 静态分支是否比着色器的实际切换更快并不那么明显。当然,这取决于情况。但在您的示例中,您可能不会看到任何性能差异。
查看有关“ super 着色器”的更多信息,这些着色器具有大量静态分支,只是为了将着色器切换保持在最低限度。 http://wiki.gametheorylabs.com/groups/judgementengine/wiki/4c55c/Uber_Shader.html
关于opengl - 着色器开关 v 着色器内部有条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14672531/