Geometry 如何在GLSL/HLSL中实现SLERP

Geometry 如何在GLSL/HLSL中实现SLERP,geometry,glsl,interpolation,hlsl,Geometry,Glsl,Interpolation,Hlsl,我正在尝试从GLSL中SLERP(HLSL也可以,因为我的目标是Unity3D) 我找到了这个页面: 它包含以下列表: #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 p

我正在尝试从GLSL中SLERP(HLSL也可以,因为我的目标是Unity3D)

我找到了这个页面:

它包含以下列表:

#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;
}
这个数字是2π/360,即DEG2RAD dotp,也就是cos(θ)不是一个角

i、 脱胶是没有意义的

括号不是错了吗

float DEG2RAD = 3.14159/180.0;
float theta_rad = acos(dotp) * DEG2RAD;
即使这样,我也怀疑acos()是否会返回学位


有人能在GLSL中提供正确的SLERP实现吗?

所有这些代码似乎都很好。只需删除“*3.14159/180.0”,让它只是:

float theta = acos(dotp);

好问题,可惜没有答案。我同意,你发布的实现看起来是坏的。acos肯定会返回弧度。你找到正确的实现方法了吗?有一个vec2实现,可以很容易地推广到vec3/vec4。实际上,acos获取弧度值,并返回间隔[0,pi]内的值-参见。
float theta = acos(dotp);