内容简介:游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中,本文聊聊PVRTC2bit 和 PVRTC4bit 贴图合并的方法。先看看PVRTC贴图的排列方式。核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。
游戏中一旦有换装功能,角色可能就会是多个DrawCall了,所以我们可以将部件的贴图动态合并在一张中,本文聊聊PVRTC2bit 和 PVRTC4bit 贴图合并的方法。先看看PVRTC贴图的排列方式。
核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。
我们将256和128的贴图合并在一张512的PVRTC贴图中,排列的位置如下。
代码中同时支持PVRTC2bit和PVRTC4bit,注意Apply()的第二个参数是true,表示合并贴图后立即删除内存拷贝,也就是Read/Write了。
using System; using UnityEngine; using UnityEngine.UI; public class PVRTCombine : MonoBehaviour { public Texture2D texture256; public Texture2D texture128; void Start () { GetComponent<RawImage>().texture = Combine(texture256, texture128);; } Texture2D Combine(Texture2D tex,Texture2D tex1) { int length = 512; byte[] data = null; var blcokBytes = 0; switch (tex.format) { case TextureFormat.PVRTC_RGB2: case TextureFormat.PVRTC_RGBA2: blcokBytes = 4; data = new byte[length / 4 * length]; break; case TextureFormat.PVRTC_RGB4: case TextureFormat.PVRTC_RGBA4: blcokBytes = 8; data = new byte[length / 2 * length]; break; default: Debug.Log("Not supported."); return null; } //填充左下角 256 CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, 0); //填充左上角 256 CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, BlcokOffset(tex.width,blcokBytes)); //填充右下角 256 CombineBlocks(tex.GetRawTextureData(), data, tex.width, 4, blcokBytes, 2 * BlcokOffset(tex.width,blcokBytes)); //填充右上角区域 //左下角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes)); //左上角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + BlcokOffset(tex1.width,blcokBytes)); //右下角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + 2 * BlcokOffset(tex1.width, blcokBytes)); //右上角 128 CombineBlocks(tex1.GetRawTextureData(), data, tex1.width, 4, blcokBytes, 3 * BlcokOffset(tex.width,blcokBytes) + 3 * BlcokOffset(tex1.width, blcokBytes)); var combinedTex = new Texture2D(length, length, tex.format, false); combinedTex.LoadRawTextureData(data); combinedTex.Apply(false,true); return combinedTex; } int BlcokOffset(int length, int blcokBytes) { return length / (16 / blcokBytes) * length; } void CombineBlocks(byte[] src, byte[] dst, int length, int block, int bytes, int blockOffest) { int cell = length / block; for (int i = 0; i < cell; i++) { for (int j = 0; j < cell; j++) { int srcindex = ((i * cell) + j) * bytes; int dstindex = srcindex + blockOffest; Buffer.BlockCopy(src, srcindex, dst, dstindex, bytes); } } } }
iPhone 5SE 真机测试大概合并一张512的贴图需要1毫秒,如果游戏中适合一帧只显示一个角色,如果有建议或者意见欢迎在下面留言。
- 本文固定链接: https://www.xuanyusong.com/archives/4531
- 转载请注明:雨松MOMO 于雨松MOMO程序研究院 发表
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
以上所述就是小编给大家介绍的《Unity3D研究院之IOS运行时合并PVRTC贴图(九十九)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Unity3D研究院之运行时合并ETC1、ETC2、ASTC、DXT1、DXT5、PVRTC贴图(一百)
- 巨头们的AI研究院战事
- 清华人工智能研究院成立「知识智能研究中心」,发布四大知识平台
- AWS在上海成立人工智能研究院
- 微软亚洲研究院:NLP将迎来黄金十年
- 微软亚洲研究院27篇论文入选AAAI 2019
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出HTML5编程
弗里曼 (Eric Friiman)、罗布森 (Elisabdth Robson) / 东南大学出版社 / 2012-4 / 98.00元
《深入浅出HTML5编程(影印版)(英文)》就是你的特快车票,它可以带你学习如何使用今天的标准同时也会是明日的最佳实践来搭建Web应用。同时,你会了解HTML5的新API的基本知识,甚至你还会弄明白这些API是如何与你的网页进行交互,JaVaScript如何为它们提供动力,以及你如何使用它们来搭建能够打动你的老板并且吸引你的朋友的Web应用。一起来看看 《深入浅出HTML5编程》 这本书的介绍吧!