由于 Android 平台各种硬件标准的不统一,为了开发的软件项目能够在大部分 Android 机上完美运行,我们需要以较差的硬件支持为基础做准备。

Android 平台基本上都支持对不带 Alpha 通道的图片进行 ETC1 压缩。Android 4.3 由于对 OpenGL ES 3.0 的支持,添加了对透明图的 ETC2 压缩。

为了实现在大部分 Android 机上以低容量低存储以及处理图片,我们希望把一些比较大的透明图用RGB图替代,简言之就是把 PNG 图换成 JPG 图存储。

如何实现呢。要么是把透明通道单独提取出来作为另一张图进行存放。这样处理下可以节省 Android 平台下至少一半的开销。但是对 iOS 平台来说,则多了一张图的开销。当然,如果在项目设立之初就想到这个问题,那么完全可以分开打包。

针对大图往往是许多小图合成的图集 Atlas,且 GPU 在处理图片是总是需要 POT (Power of Two)大小的纹理这两个特性。另一种处理方式是把小图挤到半张 Atlas 里面,另外半张放透明度信息。这样处理, iOS 平台下的开销也就不会太大。其实,由于小图往往长宽比不规则,很多原本需要一张大图的Atlas完全可以放在半张图里面。

本文主要是介绍后面的处理方式。当然,也就讲个思路。先把图片排到半张图得到半图,再利用 Mali 的 TCT 工具获得所需的全图。最后写一个 Shader 来得到完整的图片信息。搞定。

Unity 相关知识点

Unity 对于平台不支持的压缩格式,会默认转为 RGBA 32bpp。而 Android 平台普遍支持的含透明度格式为 RGBA 16bpp。如果采用 RGB ETC 4bpp 的两幅图,那么需要 8bpp(使用该格式可能会导致遮罩出现问题)。如果能够把两幅图放在同一张纹理里面,那么能够再节省一半,大概4bpp(shader处理的时候会比较消耗GPU)。

Unity 在为 Android 打包时,默认对JPG采用 ETC1,对PNG采用 RGBA 16。

NPOT 的图最终会被转为 POT 的图,而且 Unity 会把 NPOT 的图会被转为 RGBA 32 格式 (GUI Texture 支持 NPOT,图片格式不会改,但是最终送 GPU 的时候还是会转为 POT)。

Mali 的 TCT 工具

命令行需要在bin目录下执行。觉得不方便可以把路径添加到环境变量 PATH,并把 .dll 文件都放到 C:\Windows\System32\ 目录下(不知道是不是这里,笔者没这么干,这个步骤也是YY的。。)。

PNG 转为一半 JPG ,一半灰度图的 KTX 文件:

$ etcpack [文件名].png img -c etc1 -aa -ktx

KTX 转 JPG 格式(放到当前目录下的 myImage文件夹):

$ etcpack [文件名].ktx myImage -ext JPG

Shader

Shader 的框架部分抄的 Particle Add Scaling -AlphaBlended.shader 文件。在顶点着色中进行了简单的 MVP 转换。在片段着色中取图片上部分的RGB值,取下半部分的R值作为透明度。


^^ 正(wéi)直(suǒ)的版权衔接线 vv     全文出处:http://www.cnblogs.com/tangyikejun/p/4696877.html

几种主要的纹理格式

1. DXT

DXT 是 DirectX 提供的一种压缩格式。只能针对 POT 格式纹理进行处理。DDS 文件采用此种压缩方式进行文件存储。

  支持的纹理格式              占用空间

DXT1 RGB5A1 4bpp 压缩比 4:1

DXT2 RGBA4444 8bpp 压缩比 2:1

DXT3 RGBA4444 同上 同上

DXT4 通过线性插值生成 Alpha 同上 同上

DXT5 同上 同上 同上

DXT纹理压缩

2. ETC

ETC1 (Ericsson Texture Compression) 仅仅支持 RGB 4bpp 的图,不支持 Alpha 通道。

OpenGL ES 3.0 能支持 ETC2,但是 Android 4.3 才开始支持 GLES 3.0。

ETC1 采用 4X4 的像素区域编入64位空间,也就是 4bpp。ETC 将像素区域分为4X2(2X4)两个部分。每个部分有一个基色,在基色基础上给两个部分分别 444RGB 的偏移或者 555RGB/333RGB的偏移。每个部分还有3位的亮度选择。 Each pixel is then offset from the base color by adding one of four signed values to the base color for its half of the 4×4 group.

关于ETC2的官方介绍

ETC 纹理压缩和 Alpha 通道处理

ETC 拼接图 Shader 的编码

3. PVRTC

PVRTC 分 4bpp 和 8bpp。具体的编码方式参见 Wiki

Understanding PowerVR Series5XT: PVRTC, PVRTC2 and texture compression (PVRTC的原理以及与其他压缩格式的对比的那个连接找不到了,也是在这个网站。。)


参考链接

Mali TCT 工具下载地址

Shader 官方手册入口

基于 Unity 的一种透明通道压缩处理的更多相关文章

  1. InnoDB透明页压缩与稀疏文件

    此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MySQL 5.7中包括了很多让人耳目一新的新特性,其中就包括了InnoDB Transparent Pag ...

  2. 【模型压缩】MetaPruning:基于元学习和AutoML的模型压缩新方法

    论文名称:MetaPruning: Meta Learning for Automatic Neural Network Channel Pruning 论文地址:https://arxiv.org/ ...

  3. 基于哈夫曼编码的文件压缩(c++版)

    本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...

  4. 基于Unity的AR开发初探:第一个AR应用程序

    记得2014年曾经写过一个Unity3D的游戏开发初探系列,收获了很多好评和鼓励,不过自那之后再也没有用过Unity,因为没有相关的需求让我能用到.目前公司有一个App开发的需求,想要融合一下AR到A ...

  5. javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图

    wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...

  6. 使用opencv为没有透明通道的图像加入透明通道

    在图像处理中,我们经常需要处理带透明通道的图片,比如为图片或视频添加水印,为图片或视频添加字幕.贴图等.然而,我们的素材图片未必总是带有透明通道.比如,素材的背景本该透明的地方,却是黑色和白色.有时, ...

  7. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  8. Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图

    Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图 分类: OpenCV图像处理2013-02-21 21:35 6459人阅读 评论(8) 收藏 举报   原文链接  ht ...

  9. 关于Unity的两种调试方法

    Unity的两种调试方法 1.Debug.Log()输出语句调试,平时经常用这个 2.把MonoDevelop和Unity进行连接后断点调试 先把编辑器选择为MonoDevelop,Edit----& ...

随机推荐

  1. HDU1885 Key Task

    The Czech Technical University is rather old — you already know that it celebrates 300 years of its ...

  2. MySQL面试总结

    MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键 ...

  3. Ceph 架构以及原理分析

    一.架构 Ceph在一个统一的系统中独特地提供对象,块和文件存储. Ceph高度可靠,易于管理且免费. Ceph的强大功能可以改变您公司的IT基础架构以及管理大量数据的能力. Ceph提供了非凡的可扩 ...

  4. 60%的人不懂Python进程Process,你懂吗?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:蒋狗    新手注意:如果你Python基础学的不够扎实,遇问题没人解答 ...

  5. redis(4)--redis集群之主从复制

    集群 先来简单了解下redis中提供的集群策略, 虽然redis有持久化功能能够保障redis服务器宕机也能恢复并且只有少量的数据损失,但是由于所有数据在一台服务器上,如果这台服务器出现硬盘故障,那就 ...

  6. 刷新.NET

    .NET Core 发布的那一天起,它在完成自我刷新的过程,一切为了适应未来,云原生.不仅仅跨平台那么简单. .NET Core 未来发展路线 我们发现跳过了.NET Core 4.X 避免了和目前. ...

  7. 【NPM】使用学习

    [NPM]使用学习 转载: 目录 ============================================== 1.修改 npm 模块的安装路径 2.淘宝 NPM 镜像 3.vue-c ...

  8. 十年Java程序员-带你走进Java虚拟机-类加载机制

    类的生命周期 1.加载 将.class文件从磁盘读到内存 2.连接 2.1 验证 验证字节码文件的正确性 2.2 准备 给类的静态变量分配内存,并赋予默认值 2.3 解析 类装载器装入类所引用的其它所 ...

  9. ThinkPhp RBAC实现原理

    RBAC是英文Role-Based Access Control的缩写,是基于角色访问进行控制的机制.意思是给每个用户设定一个角色,然后根据这个角色来判断用户的权限. 在此基于ThinkPhp的MVC ...

  10. Nginx-HTTP Strict Transport Security(HSTS)

    HTTP Strict Transport Security(HSTS) HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTP ...