贴图、图集的处理
2015-07-21 00:51
239 查看
1、基本概念
1)美术图片:jpg、png、位图
纹理(Texture)“美术图片”反到unity目录中,它就是Texture类型
贴图(Map)其功能就是把纹理通过 UV 坐标映射到3D 物体表面
材质(Material)它是贴图+shader+一系列信息,是一个数据集;
主要功能就是给渲染器提供数据和光照算法。
图集(Atlas)不是图,而是个有UIAtlas组件的Prefab,它引用了一个材质(球)
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、优化算法
1)美术图片:jpg、png、位图
纹理(Texture)“美术图片”反到unity目录中,它就是Texture类型
贴图(Map)其功能就是把纹理通过 UV 坐标映射到3D 物体表面
材质(Material)它是贴图+shader+一系列信息,是一个数据集;
主要功能就是给渲染器提供数据和光照算法。
图集(Atlas)不是图,而是个有UIAtlas组件的Prefab,它引用了一个材质(球)
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、优化算法
相关文章推荐
- 算法导论 第二十五章:每对顶点间的最短路径
- T-SQL 查找重复记录
- Go语言开发环境配置
- uva 12235(dp)
- ZOJ 3793 First Digit(数学)
- OpenGL(一) 使用Win API 建立黑色窗口
- oj水题
- Integer to Roman
- 2015年07月21日第12天笔记
- 多层的if循环
- 自定义相机
- Xcode常用快捷键
- HTTP协议:pipeline、持久连接、非持久连接
- 不重启VMWare虚拟机添加虚拟磁盘的方法(上)
- 结构体3 使用函数赋值
- Java基础总结(一)
- 纪录: INNER JOIN,LEFT JOIN 之解惑
- 字符串转换成数字以及注意事项
- 欢迎使用CSDN-markdown编辑器
- 在数据库的设计中,外键(Foreign key)约束是否真的有必要呢?(一)