移動端紋理壓縮格式

2022-03-06 01:42:48 字數 2036 閱讀 1775

裝置資源的限制和製作過程中對表現的無限追求永遠是矛盾點,不會隨裝置的發展而轉移。紋理壓縮就是這種矛盾的一種解決方式,不同於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壓縮紋理的實現原理弄清楚了。至於什麼是壓縮紋理,如何使用,可以參考 檔...