[原]JPG+mask替代透明Png

本人水平有限,不正之处还往大拿狂喷!

看到这个标题,有人估计会质疑,这不蛋疼,好好的png干嘛要分拆成两个啊!

倘若你有如此质疑,如此愤青的言论,恭喜你来对地方了,同时也小小鄙视你一下,水平太菜了。哈哈 言归正传!

为什么要这么做?

1、主要目的为了减小包大小,同时图片质量损失小。手游大家都知道,包越小转化率越高(可玩性相同的前提下)

实现细节:把一张带alpha通道的导入ps,在ps里面新建一张大小跟原图一样,格式为位图(为什么要位图,alpha值在标记透明的时候 其实就是非黑及白 也就是 0 1),复制原图的alpha通道到新建的图层,保存为png,保存原图为JPG 这样mask和jpg制作好了

前后大小比较:

实现原理:

在渲染过程中,把这两个重新还原回来,缓冲区的rgb为jpg纹理的rgb,a为mask纹理的r或g或b(为什么是 r/g/b 保存的mask时三个值是一样的 不信你试试 反正我试了 好使)

shader源码:

Shader "MaskTest" {

    Properties {
        _MainTex ("Base (RGB)", 2D) = "" {}
         _MainMask ("Base (RGB)", 2D) = "" {}
    }
    SubShader {
        Pass
        {
        Blend SrcAlpha OneMinusSrcAlpha  //一定不要忘了这个
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct vert_Input
            {
                fixed4 vertex : POSITION;
                fixed2 texcoord : TEXCOORD0;
            };
            struct vert_Output
            {
                fixed4 pos : SV_POSITION;
                fixed2 texcoord : TEXCOORD0;
            };
            uniform sampler2D _MainTex;
            uniform sampler2D _MainMask;
            vert_Output vert(vert_Input i)
            {
                vert_Output o;
                o.pos = mul(UNITY_MATRIX_MVP,i.vertex);
                o.texcoord = i.texcoord;
                return o;
            }

            fixed4 frag(vert_Output o):COLOR
            {
                fixed4 color1  = tex2D(_MainTex,o.texcoord);
                fixed4 mask = tex2D(_MainMask,o.texcoord);
                color1.a = mask.r;
                return color1;
            }

        ENDCG
        }
    }
}

实现效果:

使用纹理:

这样基本实现了功能,但是有点麻烦 还的每次计算两个纹理,效率有点低,也不够高大尚

参考别人的说法,是在加载纹理的时候,实现纹理合并,在内存中一次生成一个texture,避免在shader中的运算。实现原理就是jpg的rgb拷贝到texture的rgb,把png的r/b/g拷贝到texture的a中

核心代码如下:

for(int i = 0; i < len; i++)
    {
        dest = pngData[srcIndex];//得到第一个

outPic[outIndex] = jpgData[srcIndex];
        outPic[outIndex + 1] = jpgData[srcIndex + 1];
        outPic[outIndex + 2] = jpgData[srcIndex+2];
        outPic[outIndex + 3] = dest;
        srcIndex += 3;
        outIndex += 4;
    }

时间: 2024-08-03 07:12:01

[原]JPG+mask替代透明Png的相关文章

将刀塔传奇中的jpg+mask文件转换为带透明通道的png文件

实际操作非常没有技术含量,不过想展示一下万能的python.虽然python的文字编码和空格对齐我很反感,但是不得不说,其接口设计非常优秀,让复杂的工作变得非常简单,这种思想也体现在第三方扩展上面. 刀塔传奇使用jpg+mask文件的形式,达到压缩资源的目的.jpg的压缩比非常优秀,而mask含有透明通道信息,这样就可以大大压缩图片大小. 不过我个人更倾向于png,使用png8+压缩纹理不会比这个方案更差,换来的是更加快的加载速度和内存的节约.尤其是在Unity中,我更希望Unity来管理纹理,

专题:DUILIB Win32 透明效果

Win32 透明效果相关基础知识 Layered Windows 分层窗口.这是Windows2000开始引入的概念,重新定义了窗口的Hit Testing方法,以前都是把窗口按rectangle的方式裁剪,而把窗口加上WS_EX_LAYERED的Style后就可以根据窗口的形状和像素 值进行Hit Testing,这样我们的不规则窗口就变成了真正意义上的独立窗口,而不是传统的被一个不可见的矩形窗口所包含. 分层窗口重绘方式.透明效果产生 创建不规则窗口的三种方式 1. 通过区域相关API设置窗

CVPR2019 | Mask Scoring R-CNN 论文解读

Mask Scoring R-CNN 作者 | 文永亮 研究方向 | 目标检测.GAN 推荐理由: 本文解读的是一篇发表于CVPR2019的paper,来自华科和地平线,文章提出了Mask Scoring R-CNN的框架是对Mask R-CNN的改进,简单地来说就是给Mask R-CNN添加一个新的分支来给mask打分从而预测出更准确的分数. 源码地址:https://github.com/zjhuang22/maskscoring_rcnn 研究动机: Mask R-CNN其实是何恺明大神在

Image模块

1.创建一个新的图片 Image.new(mode,size) Image.new(mode,size,color) 2.层叠图片 层叠两个图片,img1和img2,alpha是一个介于[0,1]的浮点数,如果为0,效果为img1,如果为1.0,效果为img2.当然img1和img2的尺寸和模式必须相同.Image.blend(img1,img2,alpha) composite可以使用另外一个图片作为蒙版(mask),所有的这三张图片必须具备相同的尺寸,mask图片的模式可以为"1"

浅析vanish

浅析 VANISH --一种cache 第一部分:理解vanish的准备工作 1.对CDN的小剖析 CDN  content  delivery  network  内容分发(推送)网络,是在现有的Internet中增加一层新的网络架构,将网络内容发布到最接近用户的网络边缘(边缘服务器),使用户最近取得所需内容,解决网络拥挤状态,提高用户访问网站的速度. CDN网络架构主要有两部分组成,中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡.边缘主要指异地节点,CDN分发

SERVERAID 8K和8K-L阵列卡在添加新硬盘时会丢失阵列配置信息

客户有一台IBM X3400需要扩容本地硬盘,去之前以为和IBM x3650M4等服务器类似,就没有多查资料,到现场后发现阵列卡型号是SERVERAID 8K,整个配置界面与x3650M4 的webbios配置阵列卡完全不同,没敢贸然操作,上网查了查资料,一些注意的地方和大家分享一下. 使用ARC配置ServeRAID_8k-l8k8i图文手册,已经上传到这里http://down.51cto.com/data/1357299 适用机型: 所有System x3400; 所有System x35

iOS Core Animation之CALayer心得

使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的API是较高级的封装,使用便捷,使得我们免于自己使用OpenGL实现动画.本文主要介绍如何使用CALayer的mask实现一个双向注水动画(姑且这么叫吧). 了解CALayer的mask 以上是CALayer的头文件关于mask的说明,mask实际上layer内容的一个遮罩. 如果我们把mask是透明的

哈希算法

/*** Hash算法大全<br>* 推荐使用FNV1算法* @algorithm None* @author Goodzzp 2006-11-20* @lastEdit Goodzzp 2006-11-20* @editDetail Create*/public class HashAlgorithms{    /**//**    * 加法hash    * @param key 字符串    * @param prime 一个质数    * @return hash结果    */   

点击劫持漏洞

0x01:什么是点击劫持 点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的.不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面.通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,攻击者常常配合社工手段完成攻击. 0x02 漏洞危害 攻击者精心构建的另一个置于原网页上面的透明页面.其他访客在用户毫不知情的情况下点击攻击者的页面从而完成攻击.具体危害取决Web应用. 0x03 POC