我正在使用以下方法来压缩一堆纹理:
public void OnPostprocessTexture (Texture2D t) {
EditorUtility.CompressTexture(t, TextureFormat.DXT5, 2);
}
想法是在导入时尝试压缩纹理。我有一个项目有很多纹理没有使用最佳格式。
问题是这些更改不会保存在任何地方,如果您检查编辑器,您会看到格式保持不变。我可以将脚本留在那里并重新导入构建服务器中的所有内容,但我想要一种保存这些更改的方法。
我能想到的唯一方法是使用我想要的格式创建另一个纹理并复制/替换纹理。有更好的方法吗?
修改
做了一些测试,我注意到一些奇怪的事情:EditorUtility.CompressTexture
以某种方式压缩NPOT纹理。这是在运行脚本之前:
这是在运行EditorUtility.CompressTexture
:
这是如何工作的? 虽然Sergey的回答可以帮助我改变格式,但它不会压缩NPOT纹理,我真的需要保存这些字节。
答案 0 :(得分:3)
这里有2个问题。
您正试图在OnPostprocessTexture
方法中执行此操作,这为时已晚。您需要在OnPreprocessTexture
方法中执行此操作。
EditorUtility.CompressTexture
压缩纹理对象本身(驻留在RAM中的对象),而不是相应的资源(驻留在磁盘上的对象)。
正确的做法是使用TextureImporter.textureFormat
。
这是一个有效的例子:
public void OnPreprocessTexture()
{
TextureImporter textureImporter = assetImporter as TextureImporter;
textureImporter.textureFormat = TextureImporterFormat.DXT5;
}
另一个细节:我不同意CompressTexture在RAM而不是磁盘中创建一个对象,我认为它在Library文件夹中创建了一个文件(在某些时候它被加载到RAM中)。
不,它不会在Library文件夹中创建任何内容。这很容易检查:
AssetPostprocessor
方法的OnPostprocessTexture
的后代。OnPostprocessTexture
方法。)做了一些测试,我注意到一些奇怪的事情:EditorUtility.CompressTexture以某种方式压缩NPOT纹理。
D3DFMT_A8R8G8B8
。有一点需要注意。实际上,DXT压缩不需要纹理具有两种尺寸的功率。它要求它们的大小为4的倍数。希望这有助于:)