Unity3D研究院之运行时合并ETC1、ETC2、ASTC、DXT1、DXT5、PVRTC贴图(一百)

栏目: 后端 · 发布时间: 6年前

内容简介:今天是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手机,如下图所示,像素排列算法。

Unity3D研究院之运行时合并ETC1、ETC2、ASTC、DXT1、DXT5、PVRTC贴图(一百)

核心方式是Texture2D.GetRawTextureData()获取贴图的原始数据,运行时使用需要开启贴图的Read/Write,如果出于节省内存的考虑,可以在编辑模式下提前提取贴图的原始数据,运行期在合并。

我们将256和128的贴图合并在一张512的PVRTC贴图中,排列的位置如下。(图片我就不再截取了,和上篇一致,只是换了个压缩格式)

Unity3D研究院之运行时合并ETC1、ETC2、ASTC、DXT1、DXT5、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!如果有建议或者意见欢迎在下面给我留言.

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

最后编辑:

作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

站内专栏 QQ交谈 腾讯微博 新浪微博

捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能Web算法(第2版)

智能Web算法(第2版)

【英】Douglas G. McIlwraith(道格拉斯 G. 麦基尔雷思)、【美】Haralambos Marmanis(哈若拉玛 玛若曼尼斯)、【美】Dmitry Babenko(德米特里•巴邦科) / 达观数据、陈运文 等 / 电子工业出版社 / 2017-7 / 69.00

机器学习一直是人工智能研究领域的重要方向,而在大数据时代,来自Web 的数据采集、挖掘、应用技术又越来越受到瞩目,并创造着巨大的价值。本书是有关Web数据挖掘和机器学习技术的一本知名的著作,第2 版进一步加入了本领域最新的研究内容和应用案例,介绍了统计学、结构建模、推荐系统、数据分类、点击预测、深度学习、效果评估、数据采集等众多方面的内容。《智能Web算法(第2版)》内容翔实、案例生动,有很高的阅......一起来看看 《智能Web算法(第2版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试