I think this would certainly be possible with get/setpixels. You’d just need to properly interpolate between the pixels… Hm. It would be something like:
newColour = topColour * topAlpha + ( (bottomColour-1) * (bottomAlpha-topAlpha) )
newAlpha = topAlpha + bottomAlpha
You’d need to do the first one for each colour. I took the liberty of putting this into a helper method:
static float BlendSubpixel(float top, float bottom, float alphaTop, float alphaBottom){
return (top * alphaTop) + ( (bottom-1f) * (alphaBottom-alphaTop) );
}
public static Color AlphaBlend(Color top, Color bottom){
return new Color(BlendSubpixel(top.r,bottom.r,top.a,bottom.a),
BlendSubpixel(top.g,bottom.g,top.a,bottom.a),
BlendSubpixel(top.b,bottom.b,top.a,bottom.a),
top.a + bottom.a
);
}
That’s from some notebook calculations, so you might have to play around with them. But theoretically, you’d just need to set each pixel that way, and you’d have your properly alpha-blended result.
Regarding System.Drawing: First, go to Edit>Project Settings>Player. In the second platform icon (Standalone), under API Compatability Level, select ‘.NET 2.0’, /not/ the subset. Then, in MonoDevelop, on the first solution (Assembly-CSharp (you need to have a C# script open, and the Solution panel, to see it)), right-click References, Edit References. Scroll down to find System.Drawing, and select it.
Of course, if I were in your position, I’d simply use GUI.DrawTexture
as necessary (textures are automatically alpha-blended on top of each other in the order they are drawn). This is assuming you are displaying the textures on screen, and not on a mesh, say.
I think that’s everything. Let me know if you have any questions.