Interpolating between 3 colors

I have 3 colors I want to interpolate between based on a float [-1,1].
Color top = 1
Color middle = 0
Color bottom = -1

How can I interpolate between 3 colors in a shader?

I found how:

      float3 edgeA = IN[1].vertex - IN[0].vertex;
        float3 edgeB = IN[2].vertex - IN[0].vertex;
        float3 normalFace = normalize(cross(edgeA, edgeB));
        float3 realNormalFace = normalize(cross((mul(unity_ObjectToWorld, edgeA).xyz), (mul(unity_ObjectToWorld, edgeB).xyz)));

        float valueSide = 1 - saturate(abs(realNormalFace.y));
        float valueTop = saturate(realNormalFace.y);
        float valueBottom = saturate(-realNormalFace.y);
        fixed4 effectiveColor =
            fixed4(_SideColor.x * valueSide, _SideColor.y * valueSide, _SideColor.z * valueSide, _SideColor.w * valueSide)
            + fixed4(_TopColor.x * valueTop, _TopColor.y * valueTop, _TopColor.z * valueTop , _TopColor.w * valueTop)
            + fixed4(_BottomColor.x * valueBottom, _BottomColor.y * valueBottom, _BottomColor.z * valueBottom, _BottomColor.w * valueBottom);

        float effectiveFactor = _TopExtrude * valueTop
            + _SideExtrude * valueSide
            + _BottomExtrude * valueBottom;

Good job figuring it out.

A reminder that such expressions can be represented more compact like this _SideColor * valueSide or fixed4(_SideColor.rgba) * valueSide if you’re sure you need to convert. A minor point, but makes it a little easier to read.

1 Like