Unity3D 画笔实现系列05-Texture2D深入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 画笔实现系列05-Texture2D深入相关的知识,希望对你有一定的参考价值。

继续百度,发现c#处理图片的三种方法,像素(最慢)、内存、指针(最快),傻乎乎的一上来就直奔指针,弄得晕头转向(功力不够),最后无奈暂时放弃。转向内存法。

Texture2D中的 LoadRawTextureData(byte[] data)可以中内存在加载图片。

先来看看内存法笔像素的效率高很多

下面是将一张图片变成黑色,

技术分享图片
 1  private void PixelFun(Texture2D Text2D)
 2     {
 3         int width = Text2D.width;
 4         int height = Text2D.height;
 5         print(width);
 6         print(height);
 7         for (int i = 0; i < width; i++)
 8         {
 9             for (int j = 0; j < height; j++)
10             {
11                Text2D.SetPixel(i, j, new Color(0, 0, 0, 1));
12             }
13         }
14         Text2D.Apply();
15     }
像素法
技术分享图片
 1  private void MemoryCopy(Texture2D Text2D)
 2     {
 3         int width = Text2D.width;
 4         int height = Text2D.height;
 5         byte[] arrDst = Text2D.GetRawTextureData();
 6         for (int i = 0; i < arrDst.Length; i += 4)
 7         {
 8 
 9 
10             arrDst[i] = arrDst[i + 1] = arrDst[i + 2] = 0;
11             arrDst[i + 3] = 1;
12         }
13         Text2D.LoadRawTextureData(arrDst);
14         Text2D.Apply();
15 
16 
17     }
内存拷贝法

既然决定用内存法,就面临的如何将鼠标点击的位置转到byte[]数组中的特定位置的问题。

我选择的解决方法是图片设置成TextureFormat.RGBA32格式。byte数组长度为图片宽*高*4;对应方式为(Width * y  + x ) * 4

技术分享图片
 1 public static void DrawPixel(int x, int y, int drawBackgroudWidth, int drawBackgroudHeight, byte[] pixels, Color color)
 2         {
 3             lock (locker)
 4             {
 5                 int pixel = 0;
 6                 pixel = (drawBackgroudWidth * y + x) * 4;
 7                 DrawPoint(pixels, color, pixel);
 8             }
 9 
10         }
11 public static void DrawPoint(byte[] pixels, Color color, int pixel)
12         {
13 
14             pixels[pixel + 3] = (byte)(color.a * 255);
15             pixels[pixel + 0] = (byte)(color.r * 255);
16             pixels[pixel + 1] = (byte)(color.g * 255);
17             pixels[pixel + 2] = (byte)(color.b * 255);
18         }
画一个像素的方法

缺点,画线太粗还会卡。

暂时解决不了了。。。。。。。。。。。。。

以上是关于Unity3D 画笔实现系列05-Texture2D深入的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D 画笔实现系列01-LineRender

Unity3D 画笔实现系列02-UnityGL

Unity3D 画笔实现系列04-Texture2D

[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放

Unity3D应用案例系列时钟钟表小组件开发

Unity3D应用案例系列时钟钟表小组件开发