0

帮助我的代码正在编译 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 算法编号 == 选择器编号选择算法似乎效率低下并且更容易使显卡/着色器崩溃......所以我想要一个像这样工作的选择器:

算法 1 *(选择器编号 XOR 1)+ 算法 2 *(选择器编号 XOR 2)...等最多 10...

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

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

If-Else 段落会更快吗?

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

4

0 回答 0