So a while I go I ran into an issue where I’d want to merge two images together but I needed to do it on run time. Sometimes you need to generate images by combining a few or more images together as saving them as separate files is not very dynamic. This could potentially be used to merge character sprites with armor sprites in a 2D game or different cards and rarities, the possibilities are endless!
The easiest to merge are textures that are of the same size. You would just take the bottom image and slap the top one on it like a sticker without having to worry about any pixel offsets, like this:
Texture2D MergeTextures(Texture2D texture_1, Texture2D texture_2) { Texture2D merge_result = new Texture2D(texture_1.width, texture_1.height); for (int i = 0; i < merge_result.width; i++) { for (int j = 0; j < merge_result.height; j++) { Color tex1_color = texture_1.GetPixel(i, j); Color tex2_color = texture_2.GetPixel(i, j); Color merged_color = Color.Lerp(tex1_color, tex2_color, tex2_color.a / 1); merge_result.SetPixel(i, j, merged_color); } } merge_result.Apply(); return merge_result; }
Make sure the textures you are using are set to read/write enabled and The compression format is set to a supported one or you will be seeing some errors.
How to use
// tex_bottom and tex_top are set as public types of Texture2D // which I set to my textures in the inspector Texture2D tex_result = MergeTextures(tex_bottom, tex_top);
Saving the merge result to file
File.WriteAllBytes(Application.dataPath + "/test.png", tex_result.EncodeToPNG());
Using the Merged result as a sprite on a sprite renderer
// output_sprite is a public SpriteRenderer that I set in the inspector Rect sprite_rect = new Rect(0, 0, tex_result.width, tex_result.height); output_sprite.sprite = Sprite.Create(tex_result, sprite_rect, new Vector2(0.5f, 0.5f));