What is the correct way to mix colours in a surface shader?

Most shader examples multiply colour values.

Eg, Mixing Gray with Gray should give Gray, however when multiplying the colour values you get (0.25, 0.25, 0.25) = (0.5, 0.5, 0.5) * (0.5, 0.5, 0.5) which is a darker gray!

What is the correct way to mix colours in a shader?

Mixing is a really very broad and naive description and because of this "correct" depends on what exactly you mean.

Multiplying, adding, subtracting, dividing, signed addition, and lerping are all forms of mixing. There any number of different kinds of mixing as determined by your mixing function.

  • If you wanted both to have the same contribution to the final output, you could do something like `(colorA + colorB) * 0.5`.
  • If you wanted to lerp them together based on some value such as alpha, you could do `Lerp(colorA, colorB, mixAmount)`
  • You could multiply the colors by their alphas, add them together and set the alpha to be the addition of the two alphas `half4((colorA.rgb*colorA.a+colorB.rgb*colorB.a),colorA.a+colorB.a)`.

Lots of shaders do any number of different things. Multiplying will darken the colour and in many cases, that is what is needed, especially when applying lighting. Adding will brighten the colour which would be used for things like emission. If you need something different, then write your shader to do something different.