JPG+mask替代透明Png
来源:互联网 发布:conoha windows 编辑:程序博客网 时间:2024/06/05 11:35
http://www.cnblogs.com/U-tansuo/p/JPG-Mask.html
还有一个assetsore的插件 https://www.assetstore.unity3d.com/en/#!/content/23722
[原]JPG+mask替代透明Png
本人水平有限,不正之处还往大拿狂喷!
看到这个标题,有人估计会质疑,这不蛋疼,好好的png干嘛要分拆成两个啊!
倘若你有如此质疑,如此愤青的言论,恭喜你来对地方了,同时也小小鄙视你一下,水平太菜了。哈哈 言归正传!
为什么要这么做?
1、主要目的为了减小包大小,同时图片质量损失小。手游大家都知道,包越小转化率越高(可玩性相同的前提下)
实现细节:把一张带alpha通道的导入ps,在ps里面新建一张大小跟原图一样,格式为位图(为什么要位图,alpha值在标记透明的时候 其实就是非黑及白 也就是 0 1),复制原图的alpha通道到新建的图层,保存为png,保存原图为JPG 这样mask和jpg制作好了(这块用的bmp原图遭吐槽了,补充一份png的图)
前后大小比较:
实现原理:
在渲染过程中,把这两个重新还原回来,缓冲区的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;
}
- JPG+mask替代透明Png
- JPG+mask替代透明Png
- JPG+mask替代透明Png
- JPG+mask替代透明Png
- ImageMagick 拆分透明PNG、合并JPG和Alpha Mask
- ImageMagick 拆分透明PNG、合并JPG和Alpha Mask
- ImageMagick 拆分透明PNG、合并JPG和Alpha Mask
- 将刀塔传奇中的jpg+mask文件转换为带透明通道的png文件
- 如何jpg和png混和使用,实现mask?
- 设置PNG非透明区域为mask区域
- png jpg
- 笔记:jpg图片和png图片的区别(之一):png图片白色背景可透明,jpg图片不可以
- png透明
- png透明
- png透明
- Qt 解决png图片转jpg图片透明背景变成黑色的问题
- C# png格式图像转jpg时透明背景变为黑色问题
- png、x-png、jpg、pjpeg
- JS的作用域、闭包原理以及性能问题
- 三个人比饭量
- [Leetcode] Longest Palindromic Substring
- Material适配1 - 入门篇
- Hibernate session load get 区别
- JPG+mask替代透明Png
- Redhat 7.0使用CentOS 7 的Yum 网络源
- zabbix主动、被动检测的详细过程与区别
- iOS UIWebView中javascript与Objective-C交互、获取摄像头
- <android5.0>之CircularReveal
- JS的prototype详解
- expdp/impdp使用小结
- 调用系统拍照和相册的集成工具类(包含Popwindow的使用)
- 关于BigDecimal数据的四舍五入