Можно использовать что попроще, например smoothstep:
inline float3 smoothLerp(float3 a, float3 b, float t)
{
t = clamp(t, 0.0, 1.0);
t = t * t * (3.0 - 2.0 * t);
return a + (b - a) * t;
}
float3 gradientSmooth4(float3 r, float3 g, float3 b, float x)
{
float3 seg0 = smoothLerp(r, g, x * 3.0);
float3 seg1 = smoothLerp(g, b, x * 3.0 - 1.0);
float3 seg2 = smoothLerp(b, r, x * 3.0 - 2.0);
return select(select(seg0, seg1, x > 1.0 / 3.0), seg2, x > 2.0 / 3.0);
}
Как видим, тут (сверху) результат даже лучше, чем у катмул-рома (снизу)
