更改多个纹理的压缩格式

时间:2014-06-26 02:39:23

标签: unity3d

我正在使用以下方法来压缩一堆纹理:

public void OnPostprocessTexture (Texture2D t) {
        EditorUtility.CompressTexture(t, TextureFormat.DXT5, 2); 
} 

想法是在导入时尝试压缩纹理。我有一个项目有很多纹理没有使用最佳格式。

问题是这些更改不会保存在任何地方,如果您检查编辑器,您会看到格式保持不变。我可以将脚本留在那里并重新导入构建服务器中的所有内容,但我想要一种保存这些更改的方法。

我能想到的唯一方法是使用我想要的格式创建另一个纹理并复制/替换纹理。有更好的方法吗?


修改

做了一些测试,我注意到一些奇怪的事情:EditorUtility.CompressTexture以某种方式压缩NPOT纹理。这是在运行脚本之前:

before

这是在运行EditorUtility.CompressTexture

之后

after

这是如何工作的? 虽然Sergey的回答可以帮助我改变格式,但它不会压缩NPOT纹理,我真的需要保存这些字节。

1 个答案:

答案 0 :(得分:3)

这里有2个问题。

问题1

您正试图在OnPostprocessTexture方法中执行此操作,这为时已晚。您需要在OnPreprocessTexture方法中执行此操作。

问题2

EditorUtility.CompressTexture压缩纹理对象本身(驻留在RAM中的对象),而不是相应的资源(驻留在磁盘上的对象)。

正确的做法是使用TextureImporter.textureFormat

解决方案

这是一个有效的例子:

public void OnPreprocessTexture()
{
    TextureImporter textureImporter = assetImporter as TextureImporter;
    textureImporter.textureFormat = TextureImporterFormat.DXT5;
}

回答评论

  

另一个细节:我不同意CompressTexture在RAM而不是磁盘中创建一个对象,我认为它在Library文件夹中创建了一个文件(在某些时候它被加载到RAM中)。

不,它不会在Library文件夹中创建任何内容。这很容易检查:

  1. 从最小的Unity3D项目开始:只有一个纹理和一个编辑器脚本(使用AssetPostprocessor方法的OnPostprocessTexture的后代。
  2. 打开库文件夹并记下文件数量及其大小。
  3. 从Unity编辑器重新导入纹理(这将导致执行OnPostprocessTexture方法。)
  4. 打开库文件夹,看到没有添加任何文件,文件总大小保持不变(至少这是它在我的机器上的工作方式)。
  5. 回答已编辑的问题

      

    做了一些测试,我注意到一些奇怪的事情:EditorUtility.CompressTexture以某种方式压缩NPOT纹理。

    1. 如果我尝试重现它,Unity会向控制台输出一个错误行:“!hasError”。
    2. 尽管Unity编辑器表示在进行此类操作后纹理是使用DXT5压缩的,但在插件中检查时,实际纹理格式为D3DFMT_A8R8G8B8
    3. 有一点需要注意。实际上,DXT压缩不需要纹理具有两种尺寸的功率。它要求它们的大小为4的倍数。希望这有助于:)