介绍
Android 平台上使用的 ETC1 并不包含 Alpha 通道,因此如果想要平衡体积与质量,可以尝试将纹理拆分为两份:不包含 Alpha 通道的与包含 Alpha 通道的,然后在运行时通过 Shader 将两个纹理合并起来。

需求
支持处理场景、Prefab 中的材质
收集使用到的 Shader 以便后续改写处理
增加 Alpha 通道材质
自动替换材质的 Shader 并设置纹理字段
准备工作
需要将使用到的 Shader 编辑通道分离版本,即同时读取两张纹理显示。要注意的是需要尽量保持纹理属性名字一致,这样可以减少特殊情况处理。

处理思路
获取 Shader
private static void GetShadersInGameObject(GameObject go, List list)
{
var renderers = go.GetComponentsInChildren(true);

foreach (var renderer in renderers)
{if (renderer == null){continue;}foreach (var material in renderer.sharedMaterials){if (material == null || material.shader == null){continue;}if (!list.Contains(material.shader.name)){list.Add(material.shader.name);}}
}

}
分离 Alpha 纹理
这里要注意,分离出来 Alpha 纹理需要继承原纹理的导入选项。

var originTextureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
var settings = originTextureImporter.GetPlatformTextureSettings(“Android”);
settings.textureCompression = TextureImporterCompression.Compressed;
originTextureImporter.SetPlatformTextureSettings(settings);
originTextureImporter.SaveAndReimport();

AssetDatabase.ImportAsset(alphaPath);
var textureImporter = AssetImporter.GetAtPath(alphaPath) as TextureImporter;
textureImporter.mipmapEnabled = false;
textureImporter.textureType = TextureImporterType.Default;
textureImporter.SetPlatformTextureSettings(settings);
textureImporter.SaveAndReimport();
遍历方法
由于需要修改 Renderer 的材质属性,因此按照 Renderer 逐个处理其材质即可。

private static void ProcessScene()
{
var gos = SceneManager.GetActiveScene().GetRootGameObjects();

foreach (var go in gos)
{Traverse(go.transform, ProcessTransform);
}AssetDatabase.SaveAssets();

}

private static void Traverse(Transform t, System.Action action)
{
action.Invoke(t);

for (int i = 0; i < t.childCount; i++)
{Traverse(t.GetChild(i), action);
}

}

private static void ProcessTransform(Transform t)
{
var noRuntimeRenderer = t.GetComponent();
if (noRuntimeRenderer != null)
{
return;
}

var renderers = t.GetComponents<Renderer>();
foreach (var renderer in renderers)
{if (renderer == null){Debug.LogError("Renderer error: " + t.name, t);continue;}ProcessRenderer(renderer);
}

}

private static void ProcessRenderer(Renderer renderer)
{
if (renderer.sharedMaterials == null || renderer.sharedMaterials.Length == 0)
{
Debug.LogError("Renderer has no material: " + renderer.name, renderer);
return;
}

foreach (var material in renderer.sharedMaterials)
{if (material == null || material.shader == null){Debug.LogError("Material error: " + renderer.name, renderer);continue;}switch (material.shader.name){case "CustomShader":ProcessMaterial(material, "_MainTex", renderer);break;default:break;}
}

}
替换 Shader
private static void ProcessMaterial(Material material, string mainTexName, Renderer renderer)
{
var texture = material.GetTexture(mainTexName) as Texture2D;
var alphaTexture = ProcessTexture(texture);

string dir = Path.GetDirectoryName(material.shader.name);
string name = Path.GetFileName(material.shader.name);
string alphaShaderName = dir + "_Alpha" + "/" + name;Texture mainTexture = material.GetTexture(mainTexName);
Vector2 scale = material.GetTextureScale(mainTexName);
Vector2 offset = material.GetTextureOffset(mainTexName);material.shader = Shader.Find(alphaShaderName);SetTexture(material, "_MainTex", mainTexture, scale, offset);
SetTexture(material, "_AlphaTex", alphaTexture, scale, offset);EditorUtility.SetDirty(material);

}

private static void SetTexture(Material material, string propertyName,
Texture texture, Vector2 scale, Vector2 offset)
{
material.SetTexture(propertyName, texture);
material.SetTextureScale(propertyName, scale);
material.SetTextureOffset(propertyName, offset);
}

转载于:http://www.googln.net/

Unity 纹理拆分 Alpha 通道相关推荐

  1. unity recorder输出带alpha通道图像

    首先选中相机 如下图 1.给相机设置tag 2.clearFlags 选择 solidColor 模式 3 mask 选择指定的渲染的层级 要渲染的物体设置如下 1 l指定layer 和相机的渲染的层 ...

  2. Unity项目优化-Alpha通道分离

    前段时间由于项目打包生成的apk太大,所以引入了Alpha通道分离,后面在用的时候发现实际效果不是那么理想就移除了,但还是觉得有必要记录一下 前言 我们都知道,一个图片有RGBA四个通道,其中R红色. ...

  3. android,ETC1压缩纹理带alpha通道

    天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行指乱其所为,所以动心忍性,曾益其所不能. --<孟子> 1,ETC纹理. opengl2.0的所有android机器支持ET ...

  4. Unity播放带Alpha通道的视频【WebM+Video Player】(替代播放GIF方案)

    在Unity中播放GIF或者动态效果,可以通过Video Player播放带透明通道的WebM视频来实现. 制作带Alpha的MOV视频 制作带Alpha通道的MOV视频有多重方式,如AE.PR.PS ...

  5. DirectX11 Alpha通道

    Alpha通道 1. 漫反射贴图控制Alpha通道 在RGB混合中,源alpha分量可以用来控制透明度.混合方程中的源颜色来自于像素着色器.我们会在最后一章中看到,我们将漫反射材质的alpha值作为像 ...

  6. unity加载sprite_Unity 分离贴图 alpha 通道实践

    引言 在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种 ...

  7. Unity 分离贴图 alpha 通道实践

    在做手机游戏时可能会遇到这些问题: UI 同学天天抱怨 iOS 上一些透明贴图压缩后模糊不堪 一些古早的 Android 手机上同样的贴图吃内存超过其他手机数倍,游戏经常闪退 这篇文章给出了一种手机游 ...

  8. OpenCV中拆分通道、合并通道、alpha通道的讲解及实战演示(附python源码 超详细)

    需要源码和图片请点赞关注收藏后评论区留言私信~~~ 在BGR色彩空间中,图像的通道由B通道.G通道和B通道构成,下面将介绍OpenCV提供的方法拆分和合并通道 一.拆分通道 为了拆分图像中的通道 Op ...

  9. 在PS6中将bmp图片背景变成透明,增加alpha通道,可在unity中使用

    1.将bmp图片用ps打开,设置为rgb模型,用魔术工具选中图案,delete删除背景. 2.新增alpha通道,黑色部分代表背景透明显示部分,白色对应图案部分. 3.保持时选择32位的rgba格式.

  10. unity 纹理属性及UI图片导入设置

    一.纹理属性 Texture Type unity中常见纹理类型有以下8种:    editor gui and legacy gui:编辑器和传统GUI: cursor:自定义光标: lightma ...

最新文章

  1. 日志文件和mysql同步到kafka_logstash_output_kafka:Mysql同步Kafka深入详解
  2. [TJOI2013]最长上升子序列
  3. VS2013+OpenCV3.4.2编译
  4. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)
  5. docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint
  6. mysql 组合索引 or_Mysql_组合索引和单列索引
  7. 驱动、数据库-Java HIVE 使用Jdbc连接Hive-by小雨
  8. bzoj 1151: [CTSC2007]动物园zoo
  9. 哪些蔬菜基本不会使用农药?
  10. 阶段3 2.Spring_01.Spring框架简介_02.今日课程内容介绍
  11. SylixOS 缺页异常
  12. Tomcat8安装(或卸载重装)
  13. 如何给绘制好的CAD图纸设置密码?
  14. SSM三大框架工作流程与原理详解
  15. oracle 两表关联查询
  16. 在燃烧的远征寻找冰封王座:电竞之春下的游戏直播
  17. java对excel加密_随笔:Java 对Excel等文件进行加密、解密
  18. Warshall算法的实现(两种方式)
  19. 分布式事务系列一:BASE,一种ACID的替代方案(eBay分布式事务解决方案)
  20. 怎么看待“别人恐惧我贪婪,别人贪婪我恐惧 “这句话

热门文章

  1. 一起学习荷花定律/金蝉定律和竹子定律
  2. 台式计算机无线网络,台式电脑如何使用无线上网?
  3. JavaScript的一些简单代码
  4. 邮件服务器软件选择,3款windows下的免费邮件服务器软件
  5. ubuntu 安装GPU黑屏 修改GRUB_Windows 10 amp; Ubuntu 18.04LTS双系统安装
  6. Win11 ARM64深度解析
  7. java选取最大数字_用Java程序找最大的数字(4.1)
  8. LeetCode——777.在LRX字符串中交换相邻字符
  9. Coding and Paper Letter(八十五)
  10. 英语语法之后缀决定词性