Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 着色器开关v条件内部着色器_Opengl_Branch_Shader - Fatal编程技术网

Opengl 着色器开关v条件内部着色器

Opengl 着色器开关v条件内部着色器,opengl,branch,shader,Opengl,Branch,Shader,就性能而言,创建两个着色器(一个用于分支的每一侧)更好,还是在像素着色器代码中放置一个分支更好?例如,如果我有一个高斯模糊着色器,它决定执行水平过程还是垂直过程,那么我最好将其拆分为两个单独的着色器,先绑定一个,然后绑定另一个,还是将分支保留在着色器代码本身内,这意味着我不必为第二个过程切换着色器 void main(void) { ... if (uniform_Orientation == 0) { // Horizontal blur }

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

void main(void)
{
    ...

    if (uniform_Orientation == 0)
    {
        // Horizontal blur
    }
    else
    {
        // Vertical blur
    }
}
我的直觉告诉我应该将其拆分为两个单独的着色器,但我不确定切换着色器会对性能产生什么影响


有人对此有什么想法吗?

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

  • 静态分支:例如,使用基于统一变量的条件的if时。可以在着色器启动之前评估分支
  • 动态分支:基于着色器内的变量,例如基于可变变量的条件。这有一定的成本,因为像素可以使用不同的路径
您的问题属于静态分支。静态分支当然比动态分支更好更快

问题的答案是: 如果静态分支比着色器的实际切换速度快,则不太明显。当然要看情况了。但在您的示例中,您可能看不到任何性能差异


查看有关“uber着色器”的更多信息,这些着色器有很多静态分支,只是为了使着色器切换到最小值

依我看,您应该使用两个单独的文件,但您应该首先在目标硬件上配置文件。应该注意的是,分支惩罚会减少(在同一扭曲组/线程簇中)使用同一分支的更多像素。因此,假设该过程中所有扭曲中的所有像素都使用相同的路径,那么惩罚将为零,或者更少?