SIN()在着色器编程中的幕后工作是什么?

时间:2018-04-19 02:07:22

标签: shader

鉴于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;
}

0 个答案:

没有答案