鉴于gpus受益于大规模并行,我得出结论,使用代码分支是一种在着色器中获得性能的不可靠方式,因为在最坏的情况下,即使只有将使用正确的结果。但是,如果我的前提不正确,请纠正我。
我目前正在寻求获得与sin函数相关的一些性能。我是否能真正获得性能取决于原始功能的实际功能。如果它很复杂并且在幕后做了很多工作,那么如果整个自定义函数加起来比sin()更少计算,那么粗略近似(即使使用分支)可能仍然会更快。但是,如果sin()只能用几行代码实现,那么我担心我的努力可能是徒劳的。如果我的前提不正确,请再次纠正我。
换句话说,我问我是否可以使用这个着色器函数获得一些性能(它使用Unity Engine着色语言的语法)。请注意,不需要高精度 - 它用于为发光的东西制作简单的正弦波效果。
inline fixed CustomSine(fixed val) {
//it is assumed that the input value is never negative
fixed i = val * 57.2958;
fixed ibak;
fixed l;
ibak = i;
i /= 360;
i = floor (i);
i *= 360;
i = ibak - i;
if (i <= 90) {
l = i / 90;
} else {
if (i <= 180) {
i -= 90;
i = 90 - i;
l = i / 90;
} else {
if (i <= 270) {
i -= 180;
l = i / -90;
} else {
i -= 270;
i = 90 - i;
l = i / -90;
}
}
}
return l;
}