游戲中的壓縮紋理格式


轉載請標明出處:http://www.cnblogs.com/zblade/

一、概要

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

二、圖片格式和紋理格式

2.1 圖片格式和紋理格式

圖片格式,是圖片文件的存儲格式,用於圖片文件的存儲和傳輸,通常在磁盤文件,內存以及網絡傳輸中使用。

紋理格式是顯卡能夠直接進行采樣的紋理數據的格式,是向顯卡中加載紋理時使用的數據格式。

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

常見的圖片格式,有 jpg, png, bmp, tga, psd, dds, Gif, 游戲中一般用png, tga兩種格式,jpg由於不帶透明通道,所以不常被游戲采用。 psd容易做成較大的圖,所以也被摒棄。

紋理格式,其實就是針對顯卡而設置的一些圖片的數據格式。將圖片加載為紋理的時候,需要將圖片格式按照對應的規范解碼,一般先解碼為原始位圖,然后重新編碼為需要的紋理格式,當然這個過程引擎已經做好,不需要我們過多關注。

這樣的過程,有一個問題,就是加壓縮,解碼,重新編碼壓縮的過程比較消耗CPU,如果在游戲總實時的執行這樣的一個過程,會出現明顯的卡頓掉幀。為了解決這個過程,一般在項目中,在資源導入或者打bundle的時候,會執行相關配套的紋理格式轉換,最終打入游戲包或者Bundle中的是已經預先轉換好的紋理格式,這樣加載的時候優化了解碼和轉換的過程,能夠提高加載速度。這也是為什么不同平台的bundle不能跨平台使用的原因之一。

2.2 移動GPU的四大廠商

目前市面上的GPU的四大廠商有:

  • Imagination Technologies的PowerVR SGX系列,代表是 Apple/iPad系列,三星部分系列
  • Qualcomm的Adreno系列, 代表作是 HTC,小米部分系列
  • ARM的Mali系列,代表作是三消的Galaxy系列
  • nVIDIA的Tegra系列,代表作是Google Nexus等

2.3 常見的紋理格式

常見的紋理格式有以下幾種: R5G6B5, A4R4G4B4, A1R5G5B5, R8G8B8, A8R8G8B8, 總共四種基本紋理格式,

  • R5G6B5 每個像素占用2個字節(BYTE)
  • A4R4G4B4 每個像素占用2個字節
  • A1R5G5B5 每個像素占用2個字節
  • R8G8B8 每個像素占用3個字節
  • A8R8G8B8 每個像素占用4個字節

對於一個512 * 512大小的紋理,如果使用R5G6B5的紋理格式,其大小為512 * 512 * 2 = 512KB, 用A8R8G8B8, 就是1M,可以預見,游戲中占用容量最大將是各種紋理,很容易導致游戲安裝包突破上G,為了縮小紋理格式的數據占用的內存大小,對應的壓縮紋理格式產生了。注意,這不是在移動游戲出現后才產生的,早在PC端游戲時代就有壓縮紋理格式。

三、壓縮紋理格式

3.1 基於OpenGL ES的壓縮紋理格式

代表性的壓縮紋理格式有

  • ETC1(Ericsson texture compression)這種壓縮紋理格式是OpenGL ES的圖形標准,被所有的android設備支持,不支持透明通道,每個像素0.5個字節

  • PVRTC(PowerVR texture compression)
    支持GPU為PowerVR SGX系列,基本的壓縮參數有:
    RGB_PVRTC_4Bit, RGB, 每個像素0.5個字節
    RGB_PVRTC_2Bit, RGB, 每個像素0.25個字節
    RGBA_PVRTC_4Bit, RGBA, 每個像素0.5個字節
    RGBA_PVRTC_2Bit, RGBA, 每個像素0.25個字節

  • ATITC(ATI texture compression) 支持GPU為Qualcomm的Adreno系列, 基本的壓縮參數有:
    ATC_RGB_AMD, RGB, 每個像素0.5字節
    ATC_RGBA_EXPLICIT_ALPHA_AMD, RGBA, 每個像素1個字節
    ATC_RGBA_INTERPOLATED_ALPHA_AMD, RGBA, 每個像素1個字節

  • DXTC(又名S3TC,S3 texture compression) PC上廣泛使用,基本的壓縮參數有:
    RGB_S3TC_DXT1, RGB, 每個像素0.5個字節
    RGBA_S3TC_DXT1, RGBA, 每個像素0.5個字節
    RGBA_S3TC_DXT3, RGBA, 每個像素1個字節
    RGBA_S3TC_DXT5, RGBA,每個像素1個字節

3.2 后起的壓縮紋理格式

  • ETC2
    針對ETC1不支持透明通道的改進,用ETC2可以支持透明通道,不過要求OpenGL ES3.0及以上(Android4.3+),目前基本覆蓋率在9成以上
  • ASTC
    目前各大廠商主推的壓縮紋理格式,壓縮質量高,壓縮塊方案多,代價是壓縮時間長(需要不斷嘗試壓縮結果,算法決定)

3.3 各種壓縮紋理格式對紋理格式圖片的壓縮比例

摘自網上的數據,沒有具體的實測,以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

3.4 推薦使用的壓縮紋理格式

目前(日本)市面上ES3.0的占比超過9成,Apple A8占比超過9成,推薦android使用ETC2, ios使用ASTC,或者PVRTC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM