本文记录了在使用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);
网友评论