Unity和Unity ShaderLab 里面的SmoothStep居然不是一样的东西。。所以记录一下
Unity Lerp 同 Shader Lerp
public float Lerp(float a, float b, float value)
{
if(value <= 1 && value >= 0)
{
return a * (1 - value) + b * value;
}
else if(value < 0)
{
return a;
}
else
{
return b;
}
}
Unity InverseLerp
public float InverseLerp(float a, float b, float value)
{
if (a != b)
return Mathf.Clamp01((value - a) / (b - a));
else
return 0.0f;
}
unity SmoothStep
float SmoothStep(float a, float b, float value)
{
if(value <= 1 && value >= 0)
{
value = value * value * (3 - 2 * value);
return a * (1 - value) + b * value;
}
else if(value < 0)
{
return a;
}
else
{
return b;
}
}
Shader SmoothStep
float SmoothStep(float a, float b, float x)
{
x = clamp((x - a) / (b- a), 0,1);
return x * x * (3 - 2 * x);
}
Unity SmoothDamp
public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, [DefaultValue("Mathf.Infinity")] float maxSpeed, [DefaultValue("Time.deltaTime")] float deltaTime)
{
smoothTime = Mathf.Max(0.0001f, smoothTime);
float num = 2f / smoothTime;
float num2 = num * deltaTime;
float num3 = 1f / (1f + num2 + 0.48f * num2 * num2 + 0.235f * num2 * num2 * num2);
float num4 = current - target;
float num5 = target;
float num6 = maxSpeed * smoothTime;
num4 = Mathf.Clamp(num4, -num6, num6);
target = current - num4;
float num7 = (currentVelocity + num * num4) * deltaTime;
currentVelocity = (currentVelocity - num * num7) * num3;
float num8 = target + (num4 + num7) * num3;
if (num5 - current > 0f == num8 > num5)
{
num8 = num5;
currentVelocity = (num8 - num5) / deltaTime;
}
return num8;
}
|