原文链接:http://www.jianshu.com/p/f7c3741f22af

Unity3d引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。
在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如iOS设置成PVRTC4,Android平台设置成RGBA16等。嗯,非常的智能。
但是,在一些进阶的使用中,一些情况是难以满足的。比如,我们NGUI的图集中,在Android平台,使用ETC1纹理+Alpha通道图的方式;IOS平台,使用PVRTC4的纹理;部分要求清晰度较高的,使用RGBA16,但是使用RGBA16的渐变显示图片却惨不忍睹;一些要求高保真的,则需要直接使用RGBA32格式。有些时候,单纯的Unity纹理管理已经无法满足我们的需求了,需要做一下额外工作。
总结一下我自己的纹理压缩方案:
纹理压缩的策略手游开发(Android/IOS)中,我会使用3个级别的压缩程度:高清晰无压缩、中清晰中压缩、低清晰高压缩;4种压缩方法:RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。一般足够应付大部分的需求了。
高清晰无压缩 - RGBA32

RGBA32等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。
要注意一些png图片,在硬盘中占用几KB,怎么在Unity中显示却变大?因为Unity显示的是Texture大小,是实际运行时占用内存的大小,而png却是一种压缩显示格式;可以这样理解,png类似于zip格式,是一个压缩文件,只不过在运行时会自动解压解析罢了。
中清晰中压缩 - RGBA16 + Dithering
RGBA16+Dithering

Unity RGBA32 - 高清晰无压缩.png

RGBA32等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。
要注意一些png图片,在硬盘中占用几KB,怎么在Unity中显示却变大?因为Unity显示的是Texture大小,是实际运行时占用内存的大小,而png却是一种压缩显示格式;可以这样理解,png类似于zip格式,是一个压缩文件,只不过在运行时会自动解压解析罢了。
中清晰中压缩 - RGBA16 + Dithering
RGBA16+Dithering

Unity RGBA16,不抖动处理的渐变图片惨不忍睹

既然叫RGBA16,自然就是RGBA32的阉割版。
对于一些采用渐变的图片,从RGBA32转换成RGBA16,能明显的看出颜色的层叠变化,如上图。

采用Floyd Steinberg抖动处理后,除非放大,否则肉眼基本看不出区别

RGBA16的优点,内存占用是RGBA32的1/2;搭配上Dithering抖动,在原尺寸下看清晰度一模一样;
缺点,Unity原生不支持Dithering抖动,需要自己做工具对图片做处理;对于需要放大、拉伸的图片,Dithering抖动的支持不好,会有非常明显的颗粒感。
如何进行Dithering抖动?

Texture Packer工具中Image Format选择RGBA4444,Dithering选择FloydSteinberg

在我的项目中,TexturePacker具有非常重要的作用,像UI的图集生成,预先生成好正方形的IOS PVRTC4图集和非正方形的Android ETC1图集、 缩放原图50%等工作都由TexturePacker完成。
同样,对图像进行抖动处理,也是预先在TexturePacker使用FloydSteinberg算法进行图像抖动,再在Unity中导入使用。
TexturePacker提供命令行工具,可以做成自动化的工具。具体方法这里不详述。
RGB16

而RGB16,是主要针对一些,不带透明通道,同时长宽又不是2的次方的图片;对于这些图片,使用RGB16可以降低一半的内存,但是效果会略逊于RGB32。
当然了,RGB16其实也是可以搭配抖动,也能提升显示效果;但同样的Dithering抖动对拉伸放大是不友好的。
低清晰高压缩 - ETC1+Alpha/PVRTC4
很多初学者都会疑惑,为什么游戏开发中经常看到一些图片,需要设置成2的次方?因为像ETC1、PVRTC4等这类在内存中无需解压、直接被GPU支持的格式,占用内存极低,而且性能效率也是最好的。
但是,相对RGBA32,还是能肉眼看出质量有所下降的。
ETC1
ETC1+Alpha一般应用在Android版的UI图集中,ETC1不带透明通道,所以需要外挂一张同样是ETC1格式的Alpha通道图。方法是,在原RGBA32的原图中,提取RGB生成第一张ETC1,再提取A通道,填充另一张ETC1的R通道;游戏运行时,Shader将两张ETC1图片进行混合。
生成Alpha通道图的方法可参考:
http://blog.csdn.net/u010153703/article/details/45502895
要配合ETC1+Alpha,还需要Shader支持,这里提供参考直接修改NGUI的Unlit/Transparent With Colored的Shader。

Paste_Image.png

PVRTC4
PVRTC4在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等。
几种纹理格式的对比

格式 内存占用 质量 透明 二次方大小 建议使用场合
RGBA32 1 ★★★★★ 无需 清晰度要求极高
RGBA16+Dithering 1/2 ★★★★ 无需 UI、头像、卡牌、不会进行拉伸放大
RGBA16 1/2 ★★★ 无需 UI、头像、卡牌,不带渐变,颜色不丰富,需要拉伸放大
RGB16+Dithering 1/2 ★★★★ 无需 UI、头像、卡牌、不透明、不会进行拉伸放大
RGB16 1/2 ★★★ 无需 UI、头像、卡牌、不透明、不渐变,不会进行拉伸放大
RGB(ETC1) + Alpha(ETC1) 1/4 ★★★ 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
RGB(ETC1) 1/8 ★★★ 需要二次方,长宽可不一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
PVRTC4 1/8 ★★ 需要二次方正方形,长宽一样 尽可能默认使用,在质量不满足时再考虑使用上边的格式
  • 内存占用,相对于RGBA32做比较
  • 质量星级,更多是本人感受,仅供参考

在项目中,尽可能是使用ETC1和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提升压缩格式,来满足需要。
因此,实际项目中要混搭各种纹理格式。

文/公的Kelly
原文链接:http://www.jianshu.com/p/f7c3741f22af

干货:Unity游戏开发图片纹理压缩方案相关推荐

  1. 【转】Unity游戏开发图片纹理压缩方案

    http://blog.csdn.net/goodai007/article/details/52679333 转载于:https://www.cnblogs.com/xxxianhongfeng/p ...

  2. 【Unity3D】图片纹理压缩方式,干货走起!

    Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...

  3. Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

    Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着 ...

  4. Unity 游戏开发技巧集锦之创建透明的材质

    Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...

  5. Unity游戏开发——Excel数据读取到游戏中

    C# Unity游戏开发--Excel中的数据是如何到游戏中的 (一) 引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键, ...

  6. confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...

  7. 喵的Unity游戏开发之路 - 互动环境(有影响的运动)

    如图片.视频或代码格式等显示异常,请查看原文: https://mp.weixin.qq.com/s/Sv0FOxZCAHHUQPjT8rUeNw 很多童鞋没有系统的Unity3D游戏开发基础,也不知 ...

  8. 1.15 从0开始学习Unity游戏开发--游戏UI

    上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的近 ...

  9. 喵的Unity游戏开发之路 - 对象持久化

    原文: https://mp.weixin.qq.com/s/NNLHFLEBJE_UIksBtDcglA 前言         很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此 ...

最新文章

  1. Android ListView item设置分割线以及分割线宽度
  2. 算法设计与分析第4章 动态规划(一)【背包问题】
  3. 【linux】Valgrind工具集详解(十三):DRD(线程错误检测器)
  4. LeetCode 611. 有效三角形的个数(双指针)
  5. Python中的匿名函数及递归思想简析
  6. linux system查看内存占用,Linux查看系统内存占用
  7. 你需要的前端进阶书籍清单,分享下载
  8. 网站二次开发如何防止别人打包源码_企业网站制作前需注意的几个事项
  9. STM32F103单片机使用内部RC振荡器做时钟源
  10. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解...
  11. 怎么把程序内部坐标转为屏幕坐标,如何将工作空间坐标转换为屏幕坐标?
  12. BMW M550i xDrive
  13. SQL中代替Like语句的另一种写法
  14. 《深入浅出WPF》c#WPF入门,快速上手
  15. python用的最多的版本_为什么有如此多的python版本
  16. “晨光”老矣,尚能饭否?
  17. 消融实验(Ablation study)的最佳解释
  18. C语言美化控制台命令
  19. excel项目计划_使用Excel计划您的聚会座位
  20. 我心里优秀架构师是怎样的?

热门文章

  1. 群狼调研开展深圳市某区开展控烟工作暗访
  2. 水滴筹基于阿里云 EMR StarRocks 实战分享
  3. python画圆弧组成的花瓣代码_用Python绘制个花朵代码示例
  4. 最长上升子序列(acwing 895 acwing 896 acwing1017)
  5. 听说技术网红大白要直播了,非要说 Android 没凉,求着我,要我写篇文章
  6. Android手机如何删除自带软件
  7. 福建师范大学耘曦文学社第五届读书节征文获奖作品
  8. D.Backspace
  9. html5 海浪,分享一个利用HTML5制作的海浪效果代码
  10. 先左后直or先直后左 | 江苏交警总队朱志星:交通精细化管理实践