Мне нужна функция acos()
с двойной точностью в вычислительном шейдере. Поскольку встроенная функция acos()
в GLSL с двойной точностью, я попытался реализовать свои собственные.Есть ли точная аппроксимация функции acos()?
Сначала я реализовал серию Тейлора, как уравнение от Wiki - Taylor series с заранее рассчитанными значениями факультета. Но это кажется неточным около 1. Максимальная ошибка была примерно 0,08 с 40 итерациями.
Я также реализовал this method, который очень хорошо работает на процессоре с максимальной ошибкой -2.22045e-16, но у меня есть некоторые проблемы для реализации этого в шейдере.
В настоящее время я использую функцию приближения acos()
от here, где кто-то разместил свои функции аппроксимации на сайте this. Я использую самую точную функцию этого сайта, и теперь я получаю максимальную ошибку -7.60454e-08, но также эта ошибка слишком высока.
Мой код этой функции:
double myACOS(double x)
{
double part[4];
part[0] = 32768.0/2835.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+sqrt(2.0+2.0*x))));
part[1] = 256.0/135.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+2.0*x)));
part[2] = 8.0/135.0*sqrt(2.0-sqrt(2.0+2.0*x));
part[3] = 1.0/2835.0*sqrt(2.0-2.0*x);
return (part[0]-part[1]+part[2]-part[3]);
}
Кто-нибудь знает другой способ реализации в acos()
, который является очень точным и -если possible- легко реализовать в шейдере?
Определенная информация о системе:
- Nvidia GT 555M
- работает OpenGL 4.3 с optirun
Для чего нужны акулы? если это для slerp, вы можете разделить и победить с повторными lerps –
, есть стандартный [acos] (http://www.cplusplus.com/reference/cmath/acos/) в '' –
NathanOliver
Святое дерьмо, используйте поиск таблицу, если вам нужно это много 'sqrt'. –