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深入的主要内容,如果未能解决你的问题,请参考以下文章