opengl - 着色器开关 v 着色器内部有条件

标签 opengl branch shader

就性能而言,是创建两个着色器(分支的每一侧一个)更好,还是将分支放在像素着色器代码中更好?例如,如果我有一个高斯模糊着色器,它决定执行水平或垂直 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/

相关文章:

git - "Move"文件到 Git 中自己的分支

git - 不在 Git 的 master 分支上工作的原因

glsl - Alderlake GT1 上的着色器编译器 : SIMD32 shader inefficient

XNA SpriteBatch 和 BasicEffect 不兼容?

在 Code::Blocks Ubuntu 中找不到 -l<library>

c++ - 为 Qt5 指定 OpenGL 桌面而不是 ES

visual-studio - TFS > 分支 : Converting Source Folder To Branch

opengl - 确定内存中已编译着色器的大小

c - 如何在 OpenGL 和 GLUT 中制作由按键触发的旋转动画?

opengl - 我使用多少个 VBO?