Быстрая, неточная функция греха без поиска - PullRequest
5 голосов
/ 23 августа 2011

Для океанского шейдера мне нужна быстрая функция, которая вычисляет очень приблизительное значение для sin (x). Единственное требование состоит в том, что оно является периодическим и примерно напоминает синусоидальную волну.

Ряд грехов Тейлора слишком медленный, так как мне нужно вычислить до 9-й степени x, чтобы получить полный период.

Есть предложения?

РЕДАКТИРОВАТЬ: Извините, я не упомянул, я не могу использовать таблицу поиска, так как это на вершинный шейдер. Таблица поиска будет включать образец текстуры, который в вершинном шейдере медленнее, чем встроенная функция sin. Он не должен быть точным, просто должен выглядеть красиво.

Ответы [ 5 ]

6 голосов
/ 23 августа 2011

Используйте приближение Чебышева для любого количества терминов.Это особенно легко, если ваши входные углы ограничены, чтобы вести себя хорошо (-π .. + π или 0 .. 2π), поэтому вам не нужно сначала уменьшать аргумент до разумного значения.Вы можете использовать 2 или 3 термина вместо 9.

2 голосов
/ 07 ноября 2013

Приближение рациональной алгебраической функции к греху (x):

f = (C1 * x) / (C2 * x^2 + 1.) 

с константами:

c1 =   1.043406062 
c2 =  .2508691922 

Эти константы были найдены с помощью функции наименьших квадратов, 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π], вам нужно взять х мод 2 πРезультаты должны быть в пределах 5% от настоящего синуса.

2 голосов
/ 23 августа 2011

Вы можете создать справочную таблицу со значениями sin для некоторых значений и использовать линейную интерполяцию между этими значениями.

1 голос
/ 24 августа 2011

Ну, вы не говорите, насколько точным он должен быть. Синус может быть аппроксимирован прямыми линиями наклона 2 / пи и -2 / пи на интервалах [0, пи / 2], [пи / 2, 3 * пи / 2], [3 * пи / 2, 2 * пи ]. Такое приближение можно получить за счет умножения и сложения после уменьшения угла mod 2 * pi.

0 голосов
/ 23 августа 2011

Использование справочной таблицы, вероятно, является лучшим способом контроля компромисса между скоростью и точностью.

...