贴图、图集的处理

来源:互联网 发布:数据挖掘 预测算法 编辑:程序博客网 时间:2024/05/01 22:40

1、基本概念

     1)美术图片:jpg、png、位图

           纹理(Texture)“美术图片”反到unity目录中,它就是Texture类型

           贴图(Map)其功能就是把纹理通过 UV 坐标映射到3D 物体表面

           材质(Material)它是贴图+shader+一系列信息,是一个数据集;

                                         主要功能就是给渲染器提供数据和光照算法。

           图集(Atlas)不是图,而是个有UIAtlas组件的Prefab,它引用了一个材质(球),用于UI;

    2)NGUI中的UISprite和UITexture区别

          UISprite引用一个图集内的图片,是一个DrawCall,如果你做了一个图集是1024X1024的。此时你的界面上只用了图集中的一张很小的图,那么很抱歉1024X1024这张贴图都需要载入你的内存里面;

          UITexture没有图集的概念,只需要把图片挂上去就行了。这样内存里只会占用你这一张图的大小,内存虽然小了但是DrawCall就上去了,因为每一张UITexture是一次DrawCall

             那些重复性比较高的图片最好打成图集,而一些原画,或者背景图建议直接使用UITexture

2、贴图各种属性

       Read/Write可读可写:只有打开这个开关,才可以对贴图使用Texture2D.GetPixel,读取或改写贴图资源的像素,但这就需要系统在内存里保留一份贴图的拷贝,以供CPU访问

       Generate Mip Maps多重纹理格式:包含两张贴图,远的用小的贴图,近的用大的贴图。这样能减少传输给GPU中的数据和减少渲染,是牺牲内存换区CPU&GPU,但不能用于UI,因为它没有远近之分

       Occlusion Culling遮挡剔除:其实就是当某个物体在摄像机前被另外一个物体完全挡住的情况,挡住就不发送给GPU渲染,从而直接降低DRAW CALL。不过有些时候在CPU中计算其是否被挡住则会很耗计算,反而得不偿失

3、贴图的压缩

      1)必须符合以下条件才能压缩:图片的长宽为2的幂次方、没有透明通道、没有光照

      2)非GPU支持的纹理格式,需要经过CPU解码;而GPU支持的纹理格式,GPU直接解码和显示,GPU的解码有很多优化,随机访问、快速寻址和并行解码等,因此效率高得多

      3)在ios设备上,建议选择PVR格式。wp8和win8设备上,DXT格式。android设备,不透明贴图选择通用支持的ETC格式;而透明贴图,4大GPU厂商各自有自己的压缩格式,可以选择RGBA16

      4)贴图建议做成方形的,一般不要超过1024x1024,否则可能出现纹理丢失现象

      5)参考http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html

4、图集的处理

      1)图集制作方式:方法1-NGUI; 方法2-代码:Texture2D.PackageTextures()这个API可以自动将你的几张贴图合并为一张大图

      2)那些重复性比较高的图片最好打成图集

5、优化建议

      1)如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更高效

      2)尽可能共用材质

      3)将不需要移动的物体设为Static,让引擎可以进行其批处理

      4)尽可能不用灯光,移动端优化可以采用用光照贴图(Lightmapping)去烘培一个静态的贴图,以代替每次的光照计算

      5)确保不要让不必要的贴图素材驻留内存

      6)降低贴图素材分辨率,前提是不影响我美术效果

      7)如果你需要通过脚本来控制单个材质属性,需要注意改变Renderer.material将会造成一份材质的拷贝。因此,你应该使用Renderer.sharedMaterial来保证材质的共享状态

6、优化算法


0 0
原创粉丝点击