JPG+mask替代透明Png
来源:互联网 发布:极乐净土动作数据下载 编辑:程序博客网 时间:2024/06/05 11:05
看到这个标题,有人估计会质疑,这不蛋疼,好好的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
- 2015.03.最新面试题(1)
- C++ Primer学习总结 第4章 表达式
- mybatis连接mysql数据库插入中文乱码
- Node.js笔记(三)路由和socket.io
- (编译原理)TINY扩充语言的语法分析
- JPG+mask替代透明Png
- 安卓内存回收机制
- UVA 11552-Fewest Flops(DP)
- Metaio in Unity3d 教学--- 二. 创建自己的Application
- 关于刀塔传奇中的那些alpha_mask文件
- mongoDB的读书笔记(via3.0)(00)_【概览】(02)_mongoDB3.0中的mongod启动方式小试牛刀
- Metaio in Unity3d 教学--- 三. 使用ID Marker作为扫描目标
- 黑马程序员 -- IOS C语言 函数
- getimg