如何避免CG Shader Model 3代码中的Else语句?

时间:2013-10-13 23:44:28

标签: algorithm opengl glsl shader hlsl

帮助我的代码编译12000个数学指令!假设我有20个小算法,每个算法有6个数学指令+ / - *等。它们被分成2组,A和B,每组10个算法,在一个函数中可以组合来自A和B的任何2个算法......结果只有12条指令。但是图形着色器返回12个指令的10 * 10组合,即它编译所有1200种不同的算法可能性。如果我添加另一个选择器C,它会生成18000条指令。因为SM3没有动态分支,所以将所有代码循环展开到所有可能的范围内。

        half algorithmA ( half s, float x)
        {
                if(s<=0) {return sin(x*2.2);}      
                else if(s==1){return tri(x);}
                else if(s==2){return rn(x);}
                else if(s==3){half v1= tri(x); return v1*v1*v1;}
                else if(s==4){return (abs(sin(x)))*2-1;} 
                else if(s==5){return lfo(x);}
                else if(s==6){return slfo(x);}
                //else if(s==7){return sin(x*2.2*sin(x*.3));} 
                //else if(s>=6){return fmod(abs(x),2)-1;} 
        }

因此,通过ELSE IF algo number ==选择器编号选择算法,似乎效率低下并且更容易崩溃图形卡/着色器...所以我想只有一个像这样工作的选择器:

算法no1 *(选择器编号XOR 1)+算法no2 *(选择器编号XOR 2)......等等达10 ...

这个想法是所有的算法都会乘以0,除非它们等于选择器,我将有100个编译的代码而不是1800的指令,而4个选择器是24000指令!它只是一种不同形式的选择器,可以在CG着色器中更好地编译。

问题:我应该在HLSL / CG语言中使用哪个逻辑数学运算而不是XOR,这样所有选项都不等于“选择器号”乘以0,而选项等于选择器乘以1?

If-Else段落会更快吗?

在C代码中,你可以为同一个任务编写一个函数数组,并从数组中运行一个选择器。

0 个答案:

没有答案