Unity之贴图混合

有如下几种方式:

1.CPU端逐像素根据alpha通道进行叠加

 1         public void MergeTexture(Texture2D tt1, Texture2D tt2, int offsetX, int offsetY)
 2         {
 3             Texture2D newTex = new Texture2D(tt1.width, tt1.height, TextureFormat.ARGB32, false);
 4 
 5             newTex.SetPixels(tt1.GetPixels());
 6 
 7             for (int x = 0; x < tt2.width; x++)
 8             {
 9                 for (int y = 0; y < tt2.height; y++)
10                 {
11                     var PixelColorFore = tt2.GetPixel(x, y) * tt2.GetPixel(x, y).a;
12                     var newY = tt1.height - offsetY - tt2.height + y;
13                     var PixelColorBack = tt1.GetPixel(x + offsetX, newY) * tt1.GetPixel(x + offsetX, newY).a;
14                     newTex.SetPixel(x + offsetX, newY, PixelColorFore+ PixelColorBack);
15                 }
16             }
17             newTex.Apply();
18             System.IO.File.WriteAllBytes(Application.dataPath + "/" + tt1.name + ".png", newTex.EncodeToPNG());
19             GameObject.Find("obj001").GetComponent<Renderer>().material.mainTexture = newTex;
20         }

2.逐像素操作改为块操作

 1         public void MergeTexture(Texture2D tt1, Texture2D tt2, int offsetX, int offsetY)
 2         {
 3             Texture2D newTex= new Texture2D(tt1.width, tt1.height, TextureFormat.ARGB32, false);
 4             
 5             newTex.SetPixels(tt1.GetPixels());
 6             Color32[] colors = tt2.GetPixels32();
 7             // tt1.
 8             newTex.SetPixels32(offsetX, tt1.height - offsetY - tt2.height,tt2.width,tt2.height, colors,0);
 9             newTex.Apply();
10             GameObject.Find("obj001").GetComponent<Renderer>().material.mainTexture = newTex;
11         }

3.调用Unity的底层绘制接口在GPU上进行操作

 1         public Texture2D texture;        //Starting image.
 2         public Texture2D stampTexture;   //Texture to Graphics.Drawtexture on my RenderTexture.
 3         public float posX = 256f;        //Position the DrawTexture command while testing.
 4         public float posY = 256f;        //Position the DrawTexture command while testing.
 5         RenderTexture rt;                //RenderTexture to use as buffer.
 6 
 7         public void MergeTexture()
 8         {
 9             rt = new RenderTexture(1024, 1024, 32);           //Create RenderTexture 1024x1024 pixels in size.
10             GameObject.Find("obj001").GetComponent<Renderer>().material.mainTexture = rt;   //Assign my RenderTexure to be the main texture of my object.
11             RenderTexture.active = rt;
12             Graphics.Blit(texture, rt);          //Blit my starting texture to my RenderTexture.
13             RenderTexture.active = rt;                      //Set my RenderTexture active so DrawTexture will draw to it.
14             GL.PushMatrix();                                //Saves both projection and modelview matrices to the matrix stack.
15             GL.LoadPixelMatrix(0, 1024, 1024, 0);            //Setup a matrix for pixel-correct rendering.
16                                                              //Draw my stampTexture on my RenderTexture positioned by posX and posY.
17             Graphics.DrawTexture(new Rect(posX, posY, stampTexture.width, stampTexture.height), stampTexture);
18             Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
19             png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
20             System.IO.File.WriteAllBytes(Application.dataPath + "/" + "nihao.png", png.EncodeToPNG());
21             GL.PopMatrix();
22             //Restores both projection and modelview matrices off the top of the matrix stack.
23             RenderTexture.active = null;                    //De-activate my RenderTexture.
24         }

 

转载请注明出处:https://www.cnblogs.com/jietian331/p/17836843.html

 

posted @ 2023-11-16 17:30  孤独の巡礼  阅读(132)  评论(0编辑  收藏  举报