Unity中Texture2DArray使用小结

本文记录了在使用Texture2DArray时遇到的一些问题以及解决方案。
以下是最初的代码,由Texture2D的数组,生成一个Texture2DArray:

    public Texture2D[] sourceTextures;

    private void CreateTexArray()
    {
        if (sourceTextures.Length == 0)
        {
            return;
        }

        //Create texture2DArray
        Texture2DArray texture2DArray = new Texture2DArray(sourceTextures[0].width,
            sourceTextures[0].height, sourceTextures.Length, sourceTextures[0].format, true, false);
        // Apply settings
        texture2DArray.filterMode = FilterMode.Bilinear;
        texture2DArray.wrapMode = TextureWrapMode.Repeat;

        for (int i = 0; i < sourceTextures.Length; i++)
        {
            texture2DArray.SetPixels(sourceTextures[i].GetPixels(), i, 0);
        }

        // Apply our changes
        texture2DArray.Apply(false);

        //Save 
        AssetDatabase.CreateAsset(texture2DArray, "Assets/TexArray.asset");
    }

调用方法,遇到的第一个问题:

GetPixels需源文件可读写
更改贴图的Import Settings即可

接着又遇到了新的问题:

SetPixels需特定类型

设置其format 为 RGBA32可解决此问题:

Texture2DArray texture2DArray = new Texture2DArray(sourceTextures[0].width,
            sourceTextures[0].height, sourceTextures.Length, TextureFormat.RGBA32, true, false);

不过这样的话,生成的Texture2DArray的体积就变大了。
考虑使用Graphics.CopyTexture来复制Texture。这样还有一个好处是可不勾选源纹理为可读写的也行。

        for (int i = 0; i < sourceTextures.Length; i++)
        {
            for (int m = 0; m < sourceTextures[i].mipmapCount; m++)
            {
                Graphics.CopyTexture(sourceTextures[i], 0, m, texture2DArray, i, m);
            }
        }

但如果创建的是法线的Texture2DArray,和之前的表现有差异,需在新建Texture2DArray的时候设置linear为true

        Texture2DArray texture2DArray = new Texture2DArray(firstTexturePrototype.width,
            firstTexturePrototype.height, prototypeArray.Length, firstTexturePrototype.format, true, true);

你可能感兴趣的:(Unity中Texture2DArray使用小结)