Smoothstep
Smoothstep is a scalar interpolation function commonly used in computer graphics[1][2] and video game engines.[3] The function interpolates smoothly between two input values based on a third one that should be between the first two. The returned value is clamped between 0 and 1.
The slope of the smoothstep function tends toward zero at both edges. This makes it easy to create a sequence of transitions using smoothstep to interpolate each segment rather than using a more sophisticated or expensive interpolation technique.
As pointed out in MSDN and OpenGL documentation, smoothstep implements cubic Hermite interpolation after doing a clamp:
An example implementation provided by AMD[4] follows.
float smoothstep(float edge0, float edge1, float x) { // Scale, bias and saturate x to 0..1 range x = saturate((x - edge0)/(edge1 - edge0)); // Evaluate polynomial return x*x*(3 - 2*x); }
Variations
Ken Perlin suggests[5] an improved version of the smoothstep function which has zero 1st and 2nd order derivatives at t=0 and t=1:
Reference implementation:
float smootherstep(float edge0, float edge1, float x) { // Scale, and clamp x to 0..1 range x = clamp((x - edge0)/(edge1 - edge0), 0.0, 1.0); // Evaluate polynomial return x*x*x*(x*(x*6 - 15) + 10); }
Origin
3rd order equation
We start with a generic third order polynomial function and its first derivative:
Applying the desired values for the function at both endpoints we get:
Applying the desired values for the first derivative of the function at both endpoints we get:
Solving the system of 4 unknowns formed by the last 4 equations we obtain the values of the polynomial coefficients:
Introducing these coefficients back into the first equation gives the third order smoothstep function:
5th order equation
We start with a generic fifth order polynomial function, its first derivative and its second derivative:
Applying the desired values for the function at both endpoints we get:
Applying the desired values for the first derivative of the function at both endpoints we get:
Applying the desired values for the second derivative of the function at both endpoints we get:
Solving the system of 6 unknowns formed by the last 6 equations we obtain the values of the polynomial coefficients:
Introducing these coefficients back into the first equation gives the fifth order smoothstep function:
References
External links
- Using smoothstep (in the RenderMan Shading Language) by Prof. Malcolm Kesson.
- Interpolation tricks by Jari Komppa