遊戲中的壓縮紋理格式

2022-07-04 17:33:13 字數 1903 閱讀 1862

歸納總結遊戲中使用到的各種紋理壓縮格式,詳解各自的**和原理。

格式,是檔案的儲存格式,用於檔案的儲存和傳輸,通常在磁碟檔案,記憶體以及網路傳輸中使用。

紋理格式是顯示卡能夠直接進行取樣的紋理資料的格式,是向顯示卡中載入紋理時使用的資料格式。

格式和紋理格式的關係,就是沒有關係。如果要傳輸給顯示卡使用,則必須轉換成顯示卡能夠識別的紋理格式,這個在遊戲引擎中,會對應自動轉換,也可以通過相關的**設定顯式的轉換。

常見的格式,有 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壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...