歸納總結遊戲中使用到的各種紋理壓縮格式,詳解各自的**和原理。
格式,是檔案的儲存格式,用於檔案的儲存和傳輸,通常在磁碟檔案,記憶體以及網路傳輸中使用。
紋理格式是顯示卡能夠直接進行取樣的紋理資料的格式,是向顯示卡中載入紋理時使用的資料格式。
格式和紋理格式的關係,就是沒有關係。如果要傳輸給顯示卡使用,則必須轉換成顯示卡能夠識別的紋理格式,這個在遊戲引擎中,會對應自動轉換,也可以通過相關的**設定顯式的轉換。
常見的格式,有 jpg, png, bmp, tga, psd, dds, gif, 遊戲中一般用png, tga兩種格式,jpg由於不帶透明通道,所以不常被遊戲採用。 psd容易做成較大的圖,所以也被摒棄。
紋理格式,其實就是針對顯示卡而設定的一些的資料格式。將載入為紋理的時候,需要將格式按照對應的規範解碼,一般先解碼為原始位圖,然後重新編碼為需要的紋理格式,當然這個過程引擎已經做好,不需要我們過多關注。
這樣的過程,有乙個問題,就是加壓縮,解碼,重新編碼壓縮的過程比較消耗cpu,如果在遊戲總實時的執行這樣的乙個過程,會出現明顯的卡頓掉幀。為了解決這個過程,一般在專案中,在資源匯入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入遊戲包或者bundle中的是已經預先轉換好的紋理格式,這樣載入的時候優化了解碼和轉換的過程,能夠提高載入速度。這也是為什麼不同平台的bundle不能跨平台使用的原因之一。
目前市面上的gpu的四大廠商有:
qualcomm的adreno系列, 代表作是 htc,小公尺部分系列
arm的mali系列,代表作是三消的galaxy系列
nvidia的tegra系列,代表作是google nexus等
常見的紋理格式有以下幾種: r5g6b5, a4r4g4b4, a1r5g5b5, r8g8b8, a8r8g8b8, 總共四種基本紋理格式,
對於乙個512 * 512大小的紋理,如果使用r5g6b5的紋理格式,其大小為512 * 512 * 2 = 512kb, 用a8r8g8b8, 就是1m,可以預見,遊戲中占用容量最大將是各種紋理,很容易導致遊戲安裝包突破上g,為了縮小紋理格式的資料占用的記憶體大小,對應的壓縮紋理格式產生了。注意,這不是在移動遊戲出現後才產生的,早在pc端遊戲時代就有壓縮紋理格式。
代表性的壓縮紋理格式有
摘自網上的資料,沒有具體的實測,以rgba32的大小為1,那麼各種壓縮格式在儲存上的大小為(不含astc):
rgb pvrtc 4bits: 0.25
rgb pvrtc 2bits: 0.13
argb pvrtc 4bits: 0.25
argb pvrtc 2bits: 0.13
rgba etc2 4bits: 0.25
rgba etc2 8bits: 0.25
rgb + 1-bit alpha etc2 8bits: 0.2
dxt1: 0.3
dxt5: 0.6
argb 16bits: 0.33
argb 32bits: 1
rgb 16bits: 0.5
rgb 24bits: 0.85
在記憶體中的對比,以rgba32為1,其餘壓縮紋理格式的記憶體占用(不含astc):
argb 32 bits: 1
argb 16 bits: 0.5
rgb 24 bits: 0.8
rgb 16 bits: 0.5
dxt1: 0.125
dxt5:0.25
rgb pvrtc 4bits: 0.125
rgb pvrtc 2bits: 0.0625
argb pvrtc 4bits: 0.125
argb pvrtc 2bits: 0.0625
rgba etc2 4bits: 0.125
rgba etc2 8bits: 0.25
rgb+ 1-bit alpha etc2 8bits: 0.125
移動端紋理壓縮格式
裝置資源的限制和製作過程中對表現的無限追求永遠是矛盾點,不會隨裝置的發展而轉移。紋理壓縮就是這種矛盾的一種解決方式,不同於png jgp這種硬碟壓縮方式而言,dxt,etc等紋理壓縮方式可以在遊戲執行中無需cpu解壓就被gpu直接取樣,可以極大的減少記憶體和頻寬的占用,提公升執行效率,對移動遊戲而言...
紋理壓縮格式整理 持續更新
為什麼用紋理格式?自gpu誕生以來,開發人員一直試圖將更大更好的紋理塞進記憶體。有時這需要更多的ram,但更多時候是通過本地支援壓縮紋理格式來實現的。紋理壓縮的目的是減少資料的大小,同時儘量減少對視覺質量的影響。記憶體通與cpu共享,因此記憶體是稀缺資源。受制於移動資料慢,裝置儲存空間小等因素。傳輸...
ETC1壓縮紋理格式詳解
本來以為,etc1作為android 裝置的opengl標準,開源且最常用的的一種壓縮紋理格式,總會有人去翻譯一下khronos的文件,讀一下 給大家作個普及的,不料就是搜不到。沒辦法,儘管英文不好,還是硬啃了下文件,把 etc1壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...