各種移動GPU壓縮紋理的使用方法

介紹了各種移動設備所使用的GPU,以及各個GPU所支持的壓縮紋理的格式和使用方法。

1. 移動GPU大全
目前移動市場的GPU主要有四大廠商系列:

1)Imagination Technologies的PowerVR SGX系列

    

代表型號:PowerVR SGX 535、PowerVR SGX 540、PowerVR SGX 543MP、PowerVR SGX 554MP等
代表作  :Apple iPhone全系
、iPad全系,三星I9000、P3100等

2)Qualcomm(高通)的Adreno系列

    

代表型號:Adreno 200、Adreno 205、Adreno 220、Adreno 320等
代表作  :HTC G10、G14,小米1、2等

3)ARM的Mali系列

    

代表型號:Mali-400、Mali-T604等
代表作  :三星Galaxy SII、Galaxy SIII、Galaxy Note1、Galaxy Note2(亞版)等

4)nVIDIA(英偉達)的Tegra系列

    

代表型號:nVIDIA Tegra2、nVIDIA Tegra3等
代表作  :Google Nexus 7,HTC One X等


2. 壓縮紋理的必要性
1)首先要說一下圖像文件格式和紋理格式的區別。
常用的圖像文件格式有BMP,TGA,JPG,GIF,PNG等;
常用的紋理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。

    文件格式是圖像爲了存儲信息而使用的對信息的特殊編碼方式,它存儲在磁盤中,或者內存中,但是並不能被GPU所識別,因爲以向量計算見長的GPU對於這些 複雜的計算無能爲力。這些文件格式當被遊戲讀入後,還是需要經過CPU解壓成R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等像素格式,再傳送到GPU端進行使用。
    紋理格式是能被GPU所識別的像素格式,能被快速尋址並採樣。
舉個例子,DDS文件是遊戲開發中常用的文件格式,它內部可以包含A4R4G4B4的紋理格式,也可以包含A8R8G8B8的紋理格式,甚至可以包含DXT1的紋理格式。在這裏DDS文件有點容器的意味。

    OpenGL ES 2.0支持以上提到的R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8,A8R8G8B8等紋理格式,其中 R5G6B5,A4R4G4B4,A1R5G5B5每個像素佔用2個字節(BYTE),R8G8B8每個像素佔用3個字節,A8R8G8B8每個像素佔用 4個字節。

    

    對於一張512*512的紋理的話,R5G6B5格式的文件需要佔用512KB的容量,A8R8G8B8格式的文件需要佔用1MB的容量;如果是 1024*1024的紋理,則各需要2M和4M的容量,這對於動輒需要幾十、幾百張甚至更多紋理的遊戲,上G容量的遊戲在移動平臺上是不容易被接受的(當然,還是有1、2G的大作的,裏面包含了幾千張的紋理)。

    聰明的設計師們在想,有沒有其他辦法,既能表現豐富的色彩和細節,又能是最小失真的情況下,達到更小的紋理容量呢。壓縮紋理格式應運而生(當然,並不是在移動平臺後纔有的產物)。


3. 常見的壓縮紋理格式
基於OpenGL ES的壓縮紋理有常見的如下幾種實現:
1
)ETC1(Ericsson texture compression)
2
)PVRTC (PowerVR texture compression)
3
)ATITC (ATI texture compression)
4
)S3TC (S3 texture compression)

ETC1:
ETC1格式是OpenGL ES圖形標準的一部分,並且被所有的Android設備所支持。
擴展名爲: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以僅能用於不透明紋理。
當加載壓縮紋理時,<internal format>參數支持如下格式:
    GL_ETC1_RGB8_OES(RGB,每個像素0.5個字節)

PVRTC:
支持的GPU爲Imagination Technologies的PowerVR SGX系列。
OpenGL ES的擴展名爲: GL_IMG_texture_compression_pvrtc。
當加載壓縮紋理時,<internal format>參數支持如下幾種格式:
    GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB,每個像素0.5個字節)
    GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG (RGB,每個像素0.25個字節)
    GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA,每個像素0.5個字節)
    GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG (RGBA,每個像素0.25個字節)

ATITC:
支持的GPU爲Qualcomm的Adreno系列。
支持的OpenGL ES擴展名爲: GL_ATI_texture_compression_atitc。
當加載壓縮紋理時,<internal format>參數支持如下類型的紋理:
    GL_ATC_RGB_AMD (RGB,每個像素0.5個字節)
    GL_ATC_RGBA_EXPLICIT_ALPHA_AMD (RGBA,每個像素1個字節)
    GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD (RGBA,每個像素1個字節)

S3TC
也被稱爲DXTC,在PC上廣泛被使用,但是在移動設備上還是屬於新鮮事物。支持的GPU爲NVIDIA Tegra系列。
OpenGL ES擴展名爲:
GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。
當加載壓縮紋理時,<internal format>的參數有如下幾種格式:
    GL_COMPRESSED_RGB_S3TC_DXT1 (RGB,每個像素0.5個字節)
    GL_COMPRESSED_RGBA_S3TC_DXT1 (RGBA,每個像素0.5個字節)
    GL_COMPRESSED_RGBA_S3TC_DXT3 (RGBA,每個像素1個字節)
    GL_COMPRESSED_RGBA_S3TC_DXT5 (RGBA,每個像素1個字節)

    由此可見,Mali系列GPU只支持ETC1格式的壓縮紋理,而且該紋理不支持透明通道,有一定侷限性。
    以上壓縮紋理格式每個像素大小相對A8R8G8B8格式的比例,最高壓縮比是16:1,最低壓縮比是4:1,對於減小紋理的數據容量有明顯作用,相應在顯 存帶寬上也有明顯優勢,從而提高遊戲的運行效率(此特性沒有絕對數值,根據每個遊戲的用法和瓶頸點不同而有差別)。


4. OpenGL中相關API的使用

1) 獲得GPU的型號

    glGetString(GL_RENDERER)

2) 獲得GPU的生產廠商

    glGetString(GL_VENDOR);

3) 獲取GPU支持哪些壓縮紋理

    stringextensions = (const char*)glGetString(GL_EXTENSIONS);

    a. 判斷是否支持ETC1格式的壓縮紋理

    return (extensions.find("GL_OES_compressed_ETC1_RGB8_texture")!= string::npos);

    b. 判斷是否支持DXT格式的壓縮紋理

    return (extensions.find("GL_EXT_texture_compression_dxt1")!= string::npos ||

            extensions.find("GL_EXT_texture_compression_s3tc")!= string::npos);

    c. 判斷是否支持PVRTC格式的壓縮紋理

    return (extensions.find("GL_IMG_texture_compression_pvrtc")!= string::npos);

    d. 判斷是否支持ATITC格式的壓縮紋理

    return (extensions.find("GL_AMD_compressed_ATC_texture")!= string::npos ||

            extensions.find("GL_ATI_texture_compression_atitc")!= string::npos);

4) 填充壓縮紋理數據

    void glCompressedTexImage2D (

         GLenumtarget,

         GLintlevel,

         GLenuminternalformat,

         GLsizeiwidth,

         GLsizeiheight,

         GLintborder,

         GLsizeiimageSize,

         const GLvoid * data);

    這裏的參數不做詳細解釋,其中internalformat即是壓縮紋理格式的類型。



5. 壓縮紋理工具的使用
   每種壓縮紋理以及相應的廠商都提供了壓縮紋理的工具,工具都分兩個版本:
   a. 可視化轉換工具 (給美工或小白少量使用)
   b. 命令行轉換工具 (給程序批量使用)

下面對每個工具的用法進行說明。
1)Imagination Technologies PowerVR
工具下載地址
http://www.imgtec.com/powervr/insider/sdkdownloads/index.asp?installer=Windows%20Installer

可視化轉換界面

    

命令行轉換腳本
for %%i in (*.tga) do PVRTexTool.exe -f PVRTC4 -i %%i
(將本目錄下的所有tga文件,轉換成"PVRTC4"編碼格式的pvr文件,不帶mipmap)
詳細使用說明:PvrTexTool.exe /?

2)Qualcomm Adreno
工具下載地址
https://developer.qualcomm.com/mobile-development/mobile-technologies/gaming-graphics-optimization-adreno/tools-and-resources

可視化轉換界面

    

命令行轉換腳本
for %%i in (*.tga) do QCompressCmd.exe %%i %%i.ktx "ATC RGBA Explicit" yes 
(將本目錄下的所有tga文件,轉換成"ATC RGBA Explicit"編碼格式的ktx文件,帶mipmap)
詳細使用說明:QCompressCmd.exe /?

3)ARM Mali
工具下載地址
http://malideveloper.arm.com/develop-for-mali/mali-gpu-texture-compression-tool/

可視化轉換界面

    

命令行轉換腳本
for %%i in (*.tga) do PVRTexTool.exe -f ETC -i %%i
(將本目錄下的所有tga文件,轉換成"ETC"編碼格式的pvr文件,不帶mipmap這裏還是使用的PVRTexTool.exe,也可以使用QCompressCmd.exe)
詳細使用說明:PVRTexTool.exe /?

4)nVIDIA Tegra
可以使用DirectX SDK中自帶的DirectX Texture Tool進行轉換
可視化轉換界面

    

命令行轉換腳本
for %%i in (*.tga) do texconv.exe -f DXT5 %%i
(將本目錄下的所有tga文件,轉換成"DXT5"編碼格式的dds文件,不帶mipmap)
詳細使用說明:TexConv.exe /?


發佈了10 篇原創文章 · 獲贊 66 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章