纳金网

标题: Unity3D类分析——Texture2D [打印本页]

作者: vzheng    时间: 2013-3-19 23:07
标题: Unity3D类分析——Texture2D
1. 帮助文档:
2. 继承关系     Texture2D 继承与Texture 而Texture继承与Object,这也是我为什么跳过Texture类,设计Texture类的目的是因为还有三个子类 叫做 Texture2D、Texture3D和 RenderTexture的类。这里先简单说一下RenderTexture这个类,这个类其实也是一个Texture,只是渲染到纹理的特效承载器。具体的使用方法:在每一个Camera的属性中,都有一个Target Texture。这个的意思是这此相机的渲染目标是什么,如果为空就是指的屏幕,但是它的目标也可以是一个 RenderTexture 新建一个 Render Texture这时候将你创建的 Render Texture 拖拽带Camera的那个属性上去就行了,这时候,相机所看到的任何东西 都将放到你所创建的Texture上去了。3. Texture2D的性质我们对这一类的类分析是,需要从另外一个角度知道,那就是他的内部结构,所以这就涉及到一个Texture 究竟是什么?所得通俗一点,Texture就是图片,他还有一些其他的称呼,比如纹理,材质等等,这些名称是在不同的场合或者说起到不同的作用的时候名称,(其实当时他已经不仅仅是一张图片了,而是程序取走了他的信息和数据的重新应用)。我们首先得知道,一张图片代表了什么,他携带了怎样的信息。一张图片其实就是一张携带着像素信息的文件:我们首先将图片放到二维坐标系里,这时候,我们就可以给每一个像素定位,并获取每一个像素或者设置每一个像素信息了。我们在应用的时候,也是在利用这些信息,比如我们将一张图片拖拽到了一个GameObject上的时候,出现这样的:这个过程,其实越过了几步,我来说明一下,当我们拖拽过去的时候,编辑器为我们首先创建了一个材质球,之后得到我们拖拽的那张图片,作为Base的参数这个时候,这个材质会获取这张图片的信息,比如每一个像素的颜色,并给材质设置好相同的颜色,如果你将材质给别人贴过去,那么那个GameObject就是这张图片的颜色了。对于Texture2D最重要的两个属性我们的知道: 第一个是纹理过滤模式:关于这个概念,百度一下一大把,这个是比较基础的图形学概念,这里简单说一下,当我们贴图时候,不是说128×128大小的图片就一定贴到那么大的物体上,如果大了或者小了怎么办呢?这时候,我们就需要用算法来计算了,比如图片小了,128×128个像素需要放256×256个物体上去,这个时候,我们需要扩大图片,那么怎么扩大呢?主要有两种方式:(百度百科)(1)Linear(线性过滤)——分为具有纹理放大、缩小筛选器的双线性插补过滤,和在mipmap(纹理映射)级别间使用的三线性mipmap插补筛选器。双线性筛选后的纹理使用所需像素周围2x2区域内的“纹理像素”(单个像素纹理元素)的加权平均值。三线性筛选中,光栅化程序使用两个最近的mipmap纹理像素对像素颜色执行线性插补。显然三线性纹理过滤品质在3D游戏中高于双线性。(2)Anisotropic(各项异性过滤)——此项技术能通过筛选与屏幕XY轴平面之间的角度差异所造成的纹理模糊失真,是MT Framework中支持的最强纹理过滤技术,按图形效果分为2倍到16倍筛选级别。第二个就是纹理的重复模式:效果如图:
       这个设置是从这里:

重复模式有两个:一个是重复的铺上,另一个是使用最边缘的像素作为其他的像素填充上。所以看看上面的效果可以理解。4. Texture2D的方法我们知道了图片的性质,就有相应的访问的方法,这里主要介绍主要的方法。设置像素,指定三个参数 坐标 x,y,和颜色。
获得像素的颜色,两个参数 x,y,这个像素的坐标。
如果设置了像素,调用这个函数,使其生效。这个函数是将当前的纹理信息转换成PNG格式。这里设计到了另外一个知识点,就是图片格式。我们平常见到的PNG jpg 等等格式的不同,从根本上说是内部编码的不同。比如PNG格式,可以参开这里Unity3D 提供了PNG格式的转换,我们使用.Net 文件处理方法就可以得到这样的png图片了。整个Texutre的使用其实就跟我们制作一个图片再拿到Unity3D里面一样,只是一个用编辑的方式实现,一个用脚本控制。下面做几个代码案例试试:1. 完全Copy,获得一个,之后获取信息,重现创建一个============================================================================     public Texture2D same;    void Start() {        Texture2D texture = new Texture2D(same.width, same.height, TextureFormat.ARGB32, ***e );
        int y = 0;        while (y < texture.height)        {            int x = 0;            while (x < texture.width)            {                Color color = same.GetPixel(x, y);                texture.SetPixel(x, y, color);                ++x;            }            ++y;        }        texture.Apply();          renderer.material.mainTexture = texture;
    }============================================================================2. 将获取的图片转换为PNG格式,并将文件写入硬盘============================================================================ IEnumerator writeFile()    {        yield return new WaitForEndOfFrame();        path = Application.dataPath;        Texture2D tex = new Texture2D( Screen.width, Screen .height, TextureFormat.RGB24, false);        tex.ReadPixels( new Rect (0, 0, Screen.width, Screen.height), 0, 0);        tex.Apply();        byte[] bytes = tex.EncodeToPNG();        Destroy(tex);        Debug.Log(fileName);        string thisName = fileName + ".png" ;        Debug.Log(thisName);        if (Application .platform == RuntimePlatform.Android)        {            path = "/mnt/sdcard/" + thisName;        }        else        {            path =path+ "/"+ thisName;        }
        FileStream cache = new FileStream(path, FileMode.Create);        Debug.Log(path);        cache.Write(bytes, 0, bytes.Length);        cache.Close();    }============================================================================


作者: 王者再临    时间: 2013-3-19 23:59
很不错的介绍与分享,顶一个先!!

作者: 雅雅    时间: 2013-3-20 02:45
如果有加上案例的图片就更好了。。谢谢

作者: ku    时间: 2013-3-20 14:47
从这个角度就去学u3d,这个文章的作者必然是剑指架构师,希望多出这类文章,thx

作者: 崔小妹儿    时间: 2016-6-8 12:07
为什么我这里看不到图片呢,一直加载不出来




欢迎光临 纳金网 (http://old.narkii.com/club/) Powered by Discuz! X2.5