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着色器”的更多信息,这些着色器有很多静态分支,只是为了使着色器切换到最小值 依我看,您应该使用两个单独的文件,但您应该首先在目标硬件上配置文件。应该注意的是,分支惩罚会减少(在同一扭曲组/线程簇中)使用同一分支的更多像素。因此,假设该过程中所有扭曲中的所有像素都使用相同的路径,那么惩罚将为零,或者更少?