1. 程式人生 > 其它 >Unity常見的幾種圖片壓縮方式:DXT、ETC、ASTC

Unity常見的幾種圖片壓縮方式:DXT、ETC、ASTC

一、圖片大小問題

  Unity打包後的圖片大小僅與解析度和匯入設定有關,和原圖大小無關。例如,jpg是有失真壓縮,壓縮原始檔只會讓最終結果變模糊,對打包後的大小沒有任何幫助。

二、DXT壓縮

1,DXT是PC端常用的壓縮演算法,質量較低

 2,壓縮演算法介紹

  DXT壓縮將圖片拆分成4*4的小塊,每一塊取極值的2種顏色,剩下的顏色取插值、共有00,01,10,11四種顏色值。

  壓縮後單個顏色是16位,是RGB565、

  不支援透明通道,原圖RGB24,16個格子,需要24*16=384位

  壓縮後,兩個16位顏色+16個插值,16*2+2*16=64位,壓縮比例1/6

3,DXT3和DXT5壓縮

  在DXT1的基礎上,支援透明圖片,額外使用64位資料來儲存透明通道值,壓縮比例1/3。

DXT3壓縮:每一個畫素點使用4位儲存alpha值,透明值較為粗糙

DXT5壓縮:透明通道也單獨取插值,有2個8位極值,每一個畫素點使用3位插值,8*2+3*16=64位

4,缺點

細節上會有丟失,例如:

三、ETC壓縮

1,ETC是Android平臺通用的壓縮格式,質量較低

ETC:不支援透明通道,圖片寬高必須是2的整數次冪

ETC2:是ETC的擴充套件,支援透明通道,且圖片寬高只要是4的倍數即可

2,壓縮演算法介紹

  也是將圖片分成4*4的小塊進行壓縮,其中每一塊會分成兩半,用1位表示是橫著還是豎著拆分。

  取2種顏色,從2半中各取一個,分為individual模式還是 differential模式,用1位表示取色模式。

individual模式:取兩個RGB444的顏色,適用於兩邊顏色差異大的情況

differential模式:取RGB555+RGB333的顏色,其中,第二個塊的顏色是偏移值,適用於兩邊顏色差異不大的情況,精度更高。

   壓縮時會生成一個全域性的對映表,兩個子塊各需要3位來確定使用哪一行的資料。

  對於每一個畫素點,使用2位資料表示使用這一行的哪一個modifier,去除一個偏移值。例如表中(0,0)格子的-8,偏移值就是(-8,-8,-8),在子塊顏色的基礎上加上偏移值得到當前畫素的顏色。

壓縮前:16*24=384位

壓縮後:1+1+24+3*2+2*16=64位,壓縮比例1/6

四、ASTC壓縮

1,ASTC是Android和IOS平臺下的一種高質量壓縮方式,支援Android5.0和iPhone6以上機型

 2,壓縮演算法介紹

  也是分塊壓縮,一塊128位,塊的大小很靈活,有4*4,6*6,8*8,12*12等多種大小。支援LDR、HDR、2D和3D紋理。每個塊也有端點對endpoints,端點對不一定是RGBA的,也可以只用其中部分通道,比如RG通道,這樣可以對法線貼圖進行更好的壓縮。

BISE演算法:例如有5個數字,值為0,1,2,正常儲存需要2*5=10位。但是實際上只有3^5=243<256種情況,可以使用8位表示這些情況,即使用8位就可以表示5個值為0,1,2的整數。

 ASTC壓縮時,各個部分長度不固定。

BlockMode:平面數、權重範圍、權重網格的大小

Part:分割槽數量

ConfigData、MoreConfigData:每個端點對的端點模式

對於塊內顏色分佈較為複雜的情況,分析塊內顏色的分佈,並做分割槽,分別儲存其對應的endpoints;對於塊內的畫素取值時先定位分割槽,再計算在其在分割槽內的顏色。

對塊內每個畫素儲存一個插值weight,但是weight的數量可以比畫素少。對於規格較大的塊,例如12x12,只能儲存4x6的權重網格。解碼時,權重網格會被雙線性放大到塊的大小。

3,塊大小選擇(塊越大,壓縮質量越差,但是圖片越小)

(1)法線貼圖:儘量選擇4*4,避免丟失過多資料

(2)細節處的貼圖:選擇4*4或者6*6,否則會丟失細節

(3)一般的貼圖:選擇6*6或8*8

(4)無關緊要,但是尺寸特別大的圖:可以考慮8*8,10*10,12*12,不然打包出來太大