Here is a script I wrote a long time ago as an experiment, that does just what you want:
var textures : Texture2D[];
var combineSrc = 0;
var combineMod = 1;
enum CombineMode {Multiply = 0, Add = 1, AlphaBlend = 2}
var combineMode = CombineMode.Multiply;
var outputToRenderer : Renderer;
function Start ()
{
var srcTexture : Texture2D = textures[combineSrc];
var modTexture : Texture2D = textures[combineMod];
var newTexture : Texture2D;
newTexture = CombineTextures(srcTexture, modTexture, combineMode);
if(outputToRenderer.material.mainTexture) Destroy(outputToRenderer.material.mainTexture);
outputToRenderer.material.mainTexture = newTexture;
}
function CombineTextures(srcTexture : Texture2D, modTexture : Texture2D, mode : CombineMode) : Texture2D
{
var newTexture : Texture2D = new Texture2D(srcTexture.width, srcTexture.height, TextureFormat.ARGB32, true);
if(mode == CombineMode.Multiply)
DoMultiply(srcTexture, modTexture, newTexture);
else if(mode == CombineMode.Add)
DoAdd(srcTexture, modTexture, newTexture);
else if(mode == CombineMode.AlphaBlend)
DoAlphaBlend(srcTexture, modTexture, newTexture);
newTexture.Apply();
return newTexture;
}
function DoMultiply (srcTexture : Texture2D, modTexture : Texture2D, newTexture : Texture2D)
{
var x = 0;
while(x < srcTexture.width)
{
var y = 0;
while(y < srcTexture.height)
{
var basePixel : Color = srcTexture.GetPixel(x, y);
var modPixel : Color = modTexture.GetPixel(x, y);
var newPixel : Color = Color(basePixel.r * modPixel.r, basePixel.g * modPixel.g, basePixel.b * modPixel.b, basePixel.a * modPixel.a);
newTexture.SetPixel(x, y, newPixel);
y++;
}
x++;
}
}
function DoAdd (srcTexture : Texture2D, modTexture : Texture2D, newTexture : Texture2D)
{
var x = 0;
while(x < srcTexture.width)
{
var y = 0;
while(y < srcTexture.height)
{
var basePixel : Color = srcTexture.GetPixel(x, y);
var modPixel : Color = modTexture.GetPixel(x, y);
var newPixel : Color = Color(basePixel.r + modPixel.r, basePixel.g + modPixel.g, basePixel.b + modPixel.b, basePixel.a + modPixel.a);
newTexture.SetPixel(x, y, newPixel);
y++;
}
x++;
}
}
function DoAlphaBlend (srcTexture : Texture2D, modTexture : Texture2D, newTexture : Texture2D)
{
var x = 0;
while(x < srcTexture.width)
{
var y = 0;
while(y < srcTexture.height)
{
var basePixel : Color = srcTexture.GetPixel(x, y);
var modPixel : Color = modTexture.GetPixel(x, y);
var newPixel : Color = Color.Lerp(basePixel, modPixel, modPixel.a);
newTexture.SetPixel(x, y, newPixel);
y++;
}
x++;
}
}