I did some research and found the answer I was looking for. The three most common ways to interpolate vectors are:
- Slerp - short for "spherical interpolation", this is the most correct way, but is also the costliest. In practice you likely do not need the precision.
- lerp - short for "linear interpolation", you just do a regular linear interpolation between the vectors and use that as a result.
- nlerp - short for "normalized linear interpolation" you just normalize the result of a lerp. Useful if you need your interpolated vector to be a normalized vector.
In practice, lerp/nlerp are pretty good at getting a pretty close interpolated direction so long as the angle they are interpolating between is sufficiently small (say, 90 degrees, or 120 like Simon mentions in his comment), and nlerp is of course good at keeping the right length, if you need a normalized vector. If you want to preserve the length while interpolating between non normalized vectors, you could always interpolate the length and direction separately.
Here is an example of the three interpolations on a large angle. Dark grey = start vector, light grey = end vector. Green = slerp, blue = lerp, orange = nlerp.
Here is an example of a medium sized angle (~90 degrees) interpolating the same time t between the angles:
Lastly, here's a smaller angle (~35 degrees). You can see that the results of lerp / nlerp are more accurate as the angle between the interpolated vectors gets smaller.
If you do lerp or nlerp, you can definitely do both bilinear as well as bicubic interpolation.
Using slerp, you can do bilinear interpolation, but I'm not sure how bicubic would translate.
I generated these images by taking screenshots from an interactive shadertoy demo I made to demonstrate these differences. You can see that shadertoy here: