裝置資源的限制和製作過程中對表現的無限追求永遠是矛盾點,不會隨裝置的發展而轉移。紋理壓縮就是這種矛盾的一種解決方式,不同於png、jgp這種硬碟壓縮方式而言,dxt,etc等紋理壓縮方式可以在遊戲執行中無需cpu解壓就被gpu直接取樣,可以極大的減少記憶體和頻寬的占用,提公升執行效率,對移動遊戲而言更是如此。非壓縮格式這篇文章做一些簡要概述,詳細紋理壓縮演算法需要查閱更詳細文件。
格式記憶體消耗 (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支援
描述要求
dxtdxt1: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
using astc texture compression for game assets 說明的比較詳細,也給出了一些使用上的建議,即針對不同貼圖型別給出不同的壓縮方案。
arm的參考資料: astc: the future of texture compression
引用[1]: "常用紋理和紋理壓縮格式"
[2]:"unity compressed"
[3]: "移動裝置的紋理壓縮方案"
[4]: "關於u3d貼圖格式壓縮"
[5]: "各種移動gpu壓縮紋理的使用方法"
[6] "版本分布情況"
紋理壓縮格式整理 持續更新
為什麼用紋理格式?自gpu誕生以來,開發人員一直試圖將更大更好的紋理塞進記憶體。有時這需要更多的ram,但更多時候是通過本地支援壓縮紋理格式來實現的。紋理壓縮的目的是減少資料的大小,同時儘量減少對視覺質量的影響。記憶體通與cpu共享,因此記憶體是稀缺資源。受制於移動資料慢,裝置儲存空間小等因素。傳輸...
遊戲中的壓縮紋理格式
歸納總結遊戲中使用到的各種紋理壓縮格式,詳解各自的 和原理。格式,是檔案的儲存格式,用於檔案的儲存和傳輸,通常在磁碟檔案,記憶體以及網路傳輸中使用。紋理格式是顯示卡能夠直接進行取樣的紋理資料的格式,是向顯示卡中載入紋理時使用的資料格式。格式和紋理格式的關係,就是沒有關係。如果要傳輸給顯示卡使用,則必...
ETC1壓縮紋理格式詳解
本來以為,etc1作為android 裝置的opengl標準,開源且最常用的的一種壓縮紋理格式,總會有人去翻譯一下khronos的文件,讀一下 給大家作個普及的,不料就是搜不到。沒辦法,儘管英文不好,還是硬啃了下文件,把 etc1壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...