Как реализовать SLERP в GLSL/HLSL

Я пытаюсь выполнить SLERP из GLSL (HLSL тоже будет в порядке, поскольку я нацелен на Unity3D)

Я нашел эту страницу: http://www.geeks3d.com/20140205/glsl-simple-morph-target-animation-opengl-glslhacker-demo

Он содержит следующий список:

#version 150
in vec4 gxl3d_Position;
in vec4 gxl3d_Attrib0;
in vec4 gxl3d_Attrib1;
out vec4 Vertex_Color;
uniform mat4 gxl3d_ModelViewProjectionMatrix;
uniform float time;

vec4 Slerp(vec4 p0, vec4 p1, float t)
{
  float dotp = dot(normalize(p0), normalize(p1));
  if ((dotp > 0.9999) || (dotp<-0.9999))
  {
    if (t<=0.5)
      return p0;
    return p1;
  }
  float theta = acos(dotp * 3.14159/180.0);
  vec4 P = ((p0*sin((1-t)*theta) + p1*sin(t*theta)) / sin(theta));
  P.w = 1;
  return P;
}

void main()
{
  vec4 P = Slerp(gxl3d_Position, gxl3d_Attrib1, time);
  gl_Position = gxl3d_ModelViewProjectionMatrix * P;
  Vertex_Color = gxl3d_Attrib0;
}

Математику можно найти на странице Википедии для SLERP: http://en.wikipedia.org/wiki/Slerp

Но я задаю вопрос о линии

  float theta = acos(dotp * 3.14159/180.0);

Это число равно 2π/360, то есть DEG2RAD И dotp, a.k.a cos (theta) не является углом

то есть. для DEG2RAD это не имеет смысла.

Неправильно ли брекетинг?

float DEG2RAD = 3.14159/180.0;
float theta_rad = acos(dotp) * DEG2RAD;

И даже тогда я сомневаюсь, что acos() возвращает градусы.

Может ли кто-нибудь обеспечить правильную реализацию SLERP в GLSL?