转发收藏【原创】浅谈UGUI的ETC1+A的纹理压缩方案总结

这个信息很早了,2016年6月研究出来的,当时分享在ulua群1共享里面,然后就被大家的文件淹没了,但是这个话题并不老,这不整理群共享空间的时候,被我翻出来了,拿来炒炒。
ETC1+A还是目前业内绝大多数手游纹理压缩方案,因为ETC2依赖于OpenGL3.0,而安卓的OpenGL3依赖于Android 4.3.0,如果不支持OpenGL3的话,系统会自动软解码纹理压缩,但是U3D处理这块很麻烦,要自己分割Alpha通道出来,然后再修改shader合并Alpha,挺麻烦的。
 
Unity5.2开始吧就有个选项:

当时看到这个选项挺兴奋的,因为引擎总是自身支持ETC1+A了,我们终于不用瞎折腾了,经过测试,UGUI并不支持这个选项,什么yis意思:就是说你如果用UGUI的Image组件,它的Sprite并不能使用这个选项,设置也没卵用。fuck,那要你干嘛?后来翻了下unity官方论坛,弄了半天说是只有Sprite Renderer才支持,也就是2D/Sprite组件,但是,我想要UGUI支持咋办?官方给出的jie结论是:未来支持。。。
 
既然官方靠不住,那就自己研究吧,UGUI自带的Sprite Packerbie别指望了,完全黑箱操作,你也没法干预,这块直接放弃掉,想起了在NGUI时代就盛行的Texture Packer,经过研究终于搞定了。
 
分3部分:
(1)Editor脚本,将RGBA的纹理分割为RGB+A,然后将两张纹理分别用ETC1压缩。

Texture2D aTex = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);

        Color newColor = new Color(0f, 0f, 0f);
        for (int i = 0; i < tex.width; ++i) {
            for (int j = 0; j < tex.height; ++j) {
                newColor = tex.GetPixel(i, j);
                //rgbTex.SetPixel(i, j, newColor);

                newColor.r = newColor.a;
                newColor.g = 0;
                newColor.b = 0;
                aTex.SetPixel(i, j, newColor);
            }
        }
        string path = oldPath.Substring(0, oldPath.LastIndexOf("."));

        byte bytes = aTex.EncodeToPNG();
        File.WriteAllBytes(path + "_ETC1_A.png", bytes);

(2)shader部分,从官方自带的builtin_shaders-5.2.3p3里面解压出UI-Default.shader放入工程,然后修改代码:

 fixed4 frag(v2f IN) : SV_Target
            {
                half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
                fixed4 alpha = tex2D(_AlphaTex, IN.texcoord);

                if (_UseClipRect)
                    color *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);

                if (_UseAlphaClip)
                    clip (color.a - 0.001);

                color.a = color.a * alpha.r;

                return color;
            }

上面代码就是简单的合并了alpha通道。
 
(3)然后新建一个材质,选择修改后的shader,将第一步生成的2张纹理拖进去,

(4)在Canvas下面新建一个Image,选择图集的Sprite,并且选择xia相应的材质赋值上去:

至此,大功告成!!

链接: http://pan.baidu.com/s/1slDEGv7 密码: quxy

时间: 2024-10-31 05:30:46

转发收藏【原创】浅谈UGUI的ETC1+A的纹理压缩方案总结的相关文章

[原创]浅谈互联网企业故障定级

[原创]浅谈互联网企业故障定级 相信各位所在的互联网企业,都会有对故障级别的定义,不管是做金融,电信,游戏,还是社交等,故障这个词永远不陌生,今天来谈下对故障定级应如何去考虑. 首先,来谈谈什么是故障?系统上线后,一般都会正常运营,如果出现一些非不可抗拒因素造成的对系统服务中断或是发生非预期的行业,都可以称为故障.通常多数公司都会按严重性来区分故障定级,虽然是一个很好的方法,但有时技术人员会绝得,我很短时间就恢复了,并没有造成很大的损失,所以个人绝得故障也要有时间维度,总结如上所说,我们就将按严

[原创]浅谈互联网金融接口测试平台搭建

[原创]浅谈互联网金融接口测试平台搭建 接口测试我想各位做测试都不陌生,尤其是在现在分层测试思想倡导下,接口测试可以说是互联网行业必备的测试技能之一,我以前的博文也有讲过类似的内容,要想了解可以移驾到以下内容查看: 接口测试技术介绍 PostMan接口测试神器利剑 浅谈自动化测试中的金字塔模型理解 以上三篇内容会讲解为什么要重视接口测试?好的工具推荐,当然还有接口测试基本内容,如感兴趣可以查阅!好了谈正事,讲讲接口测试平台搭建要注意什么! 很多人会有疑问为什么要去搞个接口测试平台,不是有所谓的现

[原创]浅谈我们需要灰度发布吗?

[原创]浅谈我们需要灰度发布吗? 1 什么是灰度发布? 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式.在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来.灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现.调整问题,以保证其影响度. 概念: 灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期. 2 灰度发布能给我们带来什么好处? 提前获得

【Unity3d游戏开发】浅谈UGUI中的Canvas以及三种画布渲染模式

阅读目录 一.Canvas简介 二.Canvas画布参数与应用 回到顶部 一.Canvas简介 Canvas画布是承载所有UI元素的区域.Canvas实际上是一个游戏对象上绑定了Canvas组件.所有的UI元素都必须是Canvas的自对象.如果场景中没有画布,那么我们创建任何一个UI元素,都会自动创建画布,并且将新元素置于其下. 回到顶部 二.Canvas画布参数与应用 1.创建画布 当你创建任何一个UI元素的时候,都会自动创建画布.也可以主动创建一张画布:点击GameObject->UI->

[原创]浅谈Linux下的rpm

虽然现在很多人都使用yum去替代rpm了,但是rpm在一些特殊场合下还是有其作用的,比如查询跟验证已安装的rpm包,rpm全称Redhat Package Manager,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中,它生成具有.RPM扩展名的文件,与Dpkg类似. rpm的常用功能分两大块: (1)查询/核实软件包是否被安装:rpm {-q|--query} [select-options] [query-options]         (用的多) rpm {-V|

(原创)浅谈任意文件下载漏洞的利用

文章写的一般,如果有错误的地方,请指教~ 0x01 任意文件下载常见利用方式 0x02 信息收集部分 0x03 代码审计部分 0x04 总结 0x01 前言 在web语言中,php和java常常会产生任意文件下载漏洞,由于渗透测试的需要,常常需要进一步getshell,笔者对常见的任意文件下载漏洞常见的getshell方式进行总结.欢迎指出不足和错误之处 0x02 利用方式介绍 信息收集信息>猜路径 >>下载配置文件/代码文件 >> 利用服务器软件漏洞> shell&g

[原创]浅谈JAVA在ACM中的应用

由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些java上面的东西,像结构体排序什么的都有添加进去,博客一直会在更新,对初学者还是有一些帮助的,大牛们就可以忽略了,如果博客有什么问题,欢迎指出! java中的输出a+b import java.io.*; import java.util.*; public class Main { public st

《浅谈JavaScript系列》系列技术文章整理收藏

<浅谈JavaScript系列>系列技术文章整理收藏 1浅谈JavaScript中面向对象技术的模拟 2浅谈javascript函数劫持[转自xfocus]第1/3页 3浅谈javascript 面向对象编程 4老鱼 浅谈javascript面向对象编程 5浅谈javascript的数据类型检测 6浅谈Javascript嵌套函数及闭包 7根据一段代码浅谈Javascript闭包 8浅谈JavaScript编程语言的编码规范 9浅谈Javascript面向对象编程 10浅谈JavaScript

浅谈C# 多态的魅力(虚方法,抽象,接口实现)

浅谈C# 多态的魅力(虚方法,抽象,接口实现) 分类:             asp.net             C#              2014-02-08 11:29     786人阅读     评论(0)     收藏     举报 浅谈C# 多态的魅力(虚方法,抽象,接口实现) 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向