1. 程式人生 > >移動端紋理壓縮格式

移動端紋理壓縮格式

非壓縮格式

格式 記憶體消耗 (bytes/pixel) 描述
RGBA8888(RGBA32) 4bpp RGBA通道各佔用8位
RGBA4444(RGBA16) 2bpp 每個畫素2位元組
RGB888(RGB24) 3bpp 每個畫素3位元組,RGB通道各佔用8位,無透明通道
RGB565(RGB16) 2bpp 每個畫素2位元組,RGB通道各佔用5/6/5位,無透明通道

壓縮格式

格式 壓縮比 GPU支援 描述 圖片要求
DXT DXT1:0.3/DXT5:0.6 Windows\Android(Nvidia Tegra and Intel Bay Trail) 分為DXT1-DXT5這五個級別,DXT1 適用於不具有透明度或者僅具有一位Alpha的貼圖,DXT3和DX5支援包含4位alpha通道的RGB紋理
ATC RGBA/RGB RGBA:0.25/RGB:0.125 Qualcomm -Adreno 高通GPU支援格式,支援帶有Alpha的RGB紋理壓縮。
PVRTC RGBA/RGB 2bit:0.125/4bit:0.25 PowerVR IOS平臺都支援,支援每個畫素2位或者4位的紋理,包含或者不包含alpha通道都可以;PVRTC 2-bpp把一個8×4的畫素單元組壓成一個64位的資料塊,壓縮效果比較差;PVRTC 4-bpp把一個4×4的畫素單元組壓成一個64位的資料塊。遊戲中使用4位壓縮更多。 尺寸為2的N次冪,並且寬高相同。
ETC1 RGB 4Bit 0.125 支援Opnegl ES2.0的GPU OpenGL ES2.0版本支援,移動GPU均支援的一個格式,遺憾的是不支援Alpha通道。ETC1把一個4x4的畫素單元組壓成一個64位的資料塊。遊戲開發中採用最多的格式,不過麻煩的是需要對Alpha通道進行單獨儲存,Unity5.4.3版本之後提供了官方支援 尺寸為2的N次冪,長寬可不同
ETC2 ARGB/RGB 4bit RGBA:0.25/RGB:0.125 支援Opnegl ES3.0的GPU OpenGL ES 3.0以上才支援,補全了ETC1不支援Alpha通道,支援更高質量的壓縮。雖然如此,從Android官方資料來看,還有相當大的裝置是採用Opengl ES2.0;使用需要謹慎,不過隨著裝置更新換代,開發時間週期比較長的遊戲可以考慮直接使用 尺寸為4的倍數

Unity官網對每個平臺預設的紋理壓縮格式以及使用建議給出了詳細描述,需要注意的是:在不同移動GPU平臺下選擇GPU支援的壓縮紋理,就可以在不需要CPU解壓的情況下直接被GPU取樣,節省CPU記憶體和頻寬,也可以節省儲存的體積。如果目標平臺不支援設定的壓縮格式,紋理將解壓為RGBA32或者RGB24,浪費CPU時間和記憶體

ASTC

從IOS9(A8架構)Apple 手機開始支援ASTC壓縮格式 ,如果考慮放棄Apple 6代之前的手機相容問題了,可以直接使用了。相對於PVRTC2/4而言,ASTC(4X4)的壓縮比會增加到0.25,不過顯示效果也會好很多,而且不需要把圖片設定為方形。

Using ASTC Texture Compression for Game Assets 說明的比較詳細,也給出了一些使用上的建議,即針對不同貼圖型別給出不同的壓縮方案。

ARM的參考資料: ASTC: The Future of Texture Compression

引用

[1]: "常用紋理和紋理壓縮格式" http://blog.csdn.net/ynnmnm/article/details/44983545
[2]:"Unity Compressed" https://docs.unity3d.com/Manual/class-TextureImporterOverride.html
[3]: "移動裝置的紋理壓縮方案" http://gad.qq.com/article/detail/72
[4]: "關於U3D貼圖格式壓縮" http://blog.sina.com.cn/s/blog_5b6cb9500102vi6i.html
[5]: "各種移動GPU壓縮紋理的使用方法" http://www.cnblogs.com/luming1979/archive/2013/02/04/2891421.html
[6] "版本分佈情況" https://developer.android.com/about/dashboards/index.html#Screens

紋理資源壓縮測試對比: http://gad.qq.com/article/detail/37502