2014-06-26 90 views
1

我用下面的方法來壓縮一串質地:更改多重紋理壓縮格式

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

的想法是嘗試導入時,壓縮的紋理。我有一個項目有許多紋理,沒有使用最佳格式。

問題是這些更改沒有保存在任何地方,如果您檢查編輯器,您會發現格式保持不變。我可以將腳本留在那裏並重新導入構建服務器中的所有內容,但我想要一種方法來保存這些更改。

我能想到的唯一方法是使用我想要的格式創建另一個紋理並複製/替換紋理。有一個更好的方法嗎?


編輯

做一些更多的測試,我發現了一些奇怪:EditorUtility.CompressTexture以某種方式壓縮NPOT紋理。這是運行腳本之前:

before

這是運行EditorUtility.CompressTexture後:

after

這是如何工作的? Sergey的答案可以幫助我改變格式,但它不會壓縮NPOT紋理,我真的需要保存這些字節。

回答

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中創建一個對象,而不是磁盤,我認爲它在庫文件夾內創建了一個文件(在某些時候加載到RAM中)。

不,它不會在庫文件夾內創建任何內容。這是很容易檢查:

  1. 開始用最少的Unity3D項目:只有一個紋理,只有一個編輯器腳本(的AssetPostprocessor後裔與你OnPostprocessTexture方法
  2. 打開庫文件夾,並記下文件和數量的大小。
  3. 重新導入從Unity編輯紋理(它會導致你的OnPostprocessTexture方法的執行)。
  4. 打開庫文件夾,然後看有沒有文件,並將文件的總大小保持不變(至少這是怎麼了它適用於我的機器)

答到編輯的問題

做一些更多的測試,我發現了一些奇怪:EditorUtility.CompressTexture以某種方式壓縮NPOT紋理。

  1. 如果我試圖去模仿它,統一輸出錯誤行安慰:「hasError」。
  2. 儘管Unity編輯器說在使用DXT5壓縮紋理之後,實際紋理格式爲D3DFMT_A8R8G8B8,但您在插件中檢查該格式。

有一點需要注意。實際上,DXT壓縮並不要求紋理具有兩種尺寸的力量。它要求他們的大小爲4的倍數。希望這有助於:)

+0

謝謝!雖然這有助於我仍然留下了問題,因爲我的新發現(我編輯了我的問題,請看看)。另一個細節:我不同意CompressTexture在RAM中創建一個對象而不是磁盤,我認爲它會在Library文件夾內創建一個文件(在某些時候加載到RAM中)。 – Roberto