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));