对于海洋着色器,我需要一个快速函数来计算sin(x)的非常近似值。唯一的要求是它是周期性的,大致类似于正弦波。
泰勒系列的罪太慢了,因为我需要计算x的第9次幂才能得到一个完整的句号。
有什么建议吗?
编辑:抱歉,我没有提及,我不能使用查找表,因为这是在顶点着色器上。查找表将涉及纹理样本,其在顶点着色器上比内置的sin函数慢。 它不一定是准确的,只需看起来不错。答案 0 :(得分:6)
根据需要使用Chebyshev近似值。如果您的输入角度被约束得很好(-π.. +π或0 ...2π),这一点尤其容易,因此您不必先将参数减少到合理的值。您可以使用2或3个术语而不是9个。
答案 1 :(得分:2)
您可以为某些值创建一个包含sin值的查找表,并在这些值之间使用线性插值。
答案 2 :(得分:2)
sin(x)的有理代数函数逼近是:
f = (C1 * x) / (C2 * x^2 + 1.)
使用常量:
c1 = 1.043406062
c2 = .2508691922
这些常数是通过Lawson& amp;的最小二乘子程序DHFTI找到的。汉森。 这仅在0到π/ 2之间有效,因此请使用以下内容减少输入:
IF (t < pi) THEN
IF (t < pi/2) THEN
x = t
ELSE
x = pi - t
END IF
ELSE
IF (t < (3./2)*pi) THEN
x = t - pi
ELSE
x = twopi - t
END IF
END IF
然后计算:
f = (C1 * x) / (C2 * x*x + 1.0)
IF (t > pi) f = -f
如果输入在[0,2π]之外,则需要取x mod2π
结果应该在实际正弦的5%左右。
答案 3 :(得分:1)
嗯,你没有说你需要多准确。正弦可以通过间隔[0,pi / 2],[pi / 2,3 * pi / 2],[3 * pi / 2,2 * pi]的斜率2 / pi和-2 / pi的直线近似。 ]。在减小角度mod 2 * pi后,这种近似可以用于乘法和加法的成本。
答案 4 :(得分:0)
使用查找表可能是控制速度和准确度之间权衡的最佳方法。