- Home /
Blending two Texture2D
Is there a way to blend two Texture2D objects so the bottom texture has the top texture added on top of it, using the top texture's alpha channel to properly paste the image on top instead of completely overriding the pixels in the bottom texture?
I've tried the GetPixels/SetPixels and GetPixels32/SetPixels32 methods, and they seem to replace the entire texture with the SetPixels texture, instead of blending them.
Also, it seems as if Unity doesn't allow the use of System.Drawing, so the regular C# bitmap classes seem to be out of the question..
Answer by hammil · Sep 20, 2013 at 09:40 PM
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.
Your answer
Follow this Question
Related Questions
Assiging an Image to a Button 1 Answer
Changing color of texture with transparency efficiently 0 Answers
shown like 16bit color image 1 Answer
Difficulty loading alpha textures at runtime 0 Answers
Scaling / Resizing an Image (Texture2D) 6 Answers