本文記錄了在使用Texture2DArray時(shí)遇到的一些問題以及解決方案垦沉。
以下是最初的代碼煌抒,由Texture2D的數(shù)組厕倍,生成一個(gè)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");
}
調(diào)用方法讹弯,遇到的第一個(gè)問題:
GetPixels需源文件可讀寫
更改貼圖的Import Settings即可
接著又遇到了新的問題:
SetPixels需特定類型
設(shè)置其format 為 RGBA32可解決此問題:
Texture2DArray texture2DArray = new Texture2DArray(sourceTextures[0].width,
sourceTextures[0].height, sourceTextures.Length, TextureFormat.RGBA32, true, false);
不過這樣的話闸婴,生成的Texture2DArray的體積就變大了。
考慮使用Graphics.CopyTexture來復(fù)制Texture降狠。這樣還有一個(gè)好處是可不勾選源紋理為可讀寫的也行庇楞。
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);
}
}
但如果創(chuàng)建的是法線的Texture2DArray,和之前的表現(xiàn)有差異蛋褥,需在新建Texture2DArray的時(shí)候設(shè)置linear為true
Texture2DArray texture2DArray = new Texture2DArray(firstTexturePrototype.width,
firstTexturePrototype.height, prototypeArray.Length, firstTexturePrototype.format, true, true);