没有查找的快速,不准确的sin函数

时间:2011-08-23 15:26:41

标签: math trigonometry shader

对于海洋着色器,我需要一个快速函数来计算sin(x)的非常近似值。唯一的要求是它是周期性的,大致类似于正弦波。

泰勒系列的罪太慢了,因为我需要计算x的第9次幂才能得到一个完整的句号。

有什么建议吗?

编辑:抱歉,我没有提及,我不能使用查找表,因为这是在顶点着色器上。查找表将涉及纹理样本,其在顶点着色器上比内置的sin函数慢。 它不一定是准确的,只需看起来不错。

5 个答案:

答案 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)

使用查找表可能是控制速度和准确度之间权衡的最佳方法。