内容简介:今天是2018年10月24日,祝大家程序员节快乐。游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中。如果想合并PVRTC2或者PVRTC4可以参考我上一篇文章。Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)这篇文章讨论合并ETC1 ETC2 ASTC4X4 DXT1 DXT5运行时合并方式,为什么把它们放在一起讨论,只是因为它们的合并算法都是一样的。DXT1和DXT5一般可用于PC包或者编辑器,ETC1 ETC2用于安卓手机,ASTC4X
今天是2018年10月24日,祝大家 程序员 节快乐。
游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中。如果想合并PVRTC2或者PVRTC4可以参考我上一篇文章。Unity3D研究院之IOS运行时合并PVRTC贴图(九十九) https://www.xuanyusong.com/archives/4531
这篇文章讨论合并ETC1 ETC2 ASTC4X4 DXT1 DXT5运行时合并方式,为什么把它们放在一起讨论,只是因为它们的合并算法都是一样的。DXT1和DXT5一般可用于PC包或者编辑器,ETC1 ETC2用于安卓手机,ASTC4X4用于IOS手机,如下图所示,像素排列算法。
核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。
我们将256和128的贴图合并在一张512的PVRTC贴图中,排列的位置如下。(图片我就不再截取了,和上篇一致,只是换了个压缩格式)
代码中同时支持PVRTC2bit和PVRTC4bit,注意Apply()的第二个参数是true,表示合并贴图后立即删除内存拷贝,也就是Read/Write了。
using UnityEngine; using UnityEngine.UI; using System; public class TextureCombine : MonoBehaviour { public Texture2D texture256; public Texture2D texture128; void Awake() { GetComponent<RawImage>().texture = Combine(texture256,texture128); } Texture2D Combine(Texture2D tex, Texture2D tex1) { int length = 512; var blcokBytes = 0; byte[] data = null; switch (tex.format) { case TextureFormat.DXT1: case TextureFormat.ETC_RGB4: case TextureFormat.ETC2_RGB: blcokBytes = 8; data = new byte[length / 2 * length]; break; case TextureFormat.DXT5: case TextureFormat.ETC2_RGBA8: case TextureFormat.ASTC_RGB_4x4: case TextureFormat.ASTC_RGBA_4x4: blcokBytes = 16; data = new byte[length * length]; break; default: UnityEngine.Debug.Log("Not supported."); return null; } //填充左下角 256 CombineBlocks(tex.GetRawTextureData(), data, 0, 0, tex.width, 4, blcokBytes, length); //填充左上角 256 CombineBlocks(tex.GetRawTextureData(), data, 0, tex.width, tex.width, 4, blcokBytes, length); //填充右下角 256 CombineBlocks(tex.GetRawTextureData(), data, tex.width, 0, tex.width, 4, blcokBytes, length); //填充右上角区域 //左下角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex.width, tex.width, tex1.width, 4, blcokBytes, length); //左上角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex.width, tex.width + tex1.width, tex1.width, 4, blcokBytes, length); //右下角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex.width + tex1.width, tex.width, tex1.width, 4, blcokBytes, length); //右上角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex.width + tex1.width, tex.width + tex1.width, tex1.width, 4, blcokBytes, length); var combinedTex = new Texture2D(length, length, tex.format, false); combinedTex.LoadRawTextureData(data); combinedTex.Apply(false,true); return combinedTex; } void CombineBlocks(byte[] src, byte[] dst, int dstx, int dsty, int width, int block, int bytes, int length) { var dstbx = dstx / block; var dstby = dsty / block; for (int i = 0; i < width / block; i++) { int dstindex = (dstbx + (dstby + i) * (length / block)) * bytes; int srcindex = i * (width / block) * bytes; Buffer.BlockCopy(src, srcindex, dst, dstindex, width / block * bytes); } } }
ok!如果有建议或者意见欢迎在下面给我留言.
- 本文固定链接: https://www.xuanyusong.com/archives/4535
- 转载请注明:雨松MOMO 于雨松MOMO程序研究院 发表
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)
- 巨头们的AI研究院战事
- 清华人工智能研究院成立「知识智能研究中心」,发布四大知识平台
- AWS在上海成立人工智能研究院
- 微软亚洲研究院:NLP将迎来黄金十年
- 微软亚洲研究院27篇论文入选AAAI 2019
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算机科学概论(第7版) (平装)
J.Glenn Brookshear / 王保江 / 人民邮电出版社 / 2003-9 / 49.0
《计算机科学概论(第2版)》更新了部分内容,使其更加贴近于计算机科学领域内的最新趋势,这包括了网络安全、开源运动、关联存储、公钥加密、XML、Java和C#等内容。扩充了网络和Internet所覆盖的内容。一个程序用C#语言编写,还有C、C++和Java,作为语言的例子。不过整个方法依旧保持语言的独立。一起来看看 《计算机科学概论(第7版) (平装)》 这本书的介绍吧!