
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)首先要說一下圖像文件格式和紋理格式的區(qū)別。
常用的圖像文件格式有BMP,TGA,JPG,GIF,PNG等;
常用的紋理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等。
文件格式是圖像為了存儲信息而使用的對信息的特殊編碼方式,它存儲在磁盤中,或者內(nèi)存中,但是并不能被GPU所識別,因為以向量計算見長的GPU對于這些復(fù)雜的計算無能為力。這些文件格式當(dāng)被游戲讀入后,還是需要經(jīng)過CPU解壓成R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等像素格式,再傳送到GPU端進行使用。
紋理格式是能被GPU所識別的像素格式,能被快速尋址并采樣。
舉個例子,DDS文件是游戲開發(fā)中常用的文件格式,它內(nèi)部可以包含A4R4G4B4的紋理格式,也可以包含A8R8G8B8的紋理格式,甚至可以包含DXT1的紋理格式。在這里DDS文件有點容器的意味。
OpenGL ES 2.0支持以上提到的R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8,A8R8G8B8等紋理格式,其中 R5G6B5,A4R4G4B4,A1R5G5B5每個像素占用2個字節(jié)(BYTE),R8G8B8每個像素占用3個字節(jié),A8R8G8B8每個像素占用 4個字節(jié)。

對于一張512*512的紋理的話,R5G6B5格式的文件需要占用512KB的容量,A8R8G8B8格式的文件需要占用1MB的容量;如果是1024*1024的紋理,則各需要2M和4M的容量,這對于動輒需要幾十、幾百張甚至更多紋理的游戲,上G容量的游戲在移動平臺上是不容易被接受的(當(dāng)然,還是有1、2G的大作的,里面包含了幾千張的紋理)。
聰明的設(shè)計師們在想,有沒有其他辦法,既能表現(xiàn)豐富的色彩和細節(jié),又能是最小失真的情況下,達到更小的紋理容量呢。壓縮紋理格式應(yīng)運而生(當(dāng)然,并不是在移動平臺后才有的產(chǎn)物)。
3. 常見的壓縮紋理格式
基于OpenGL ES的壓縮紋理有常見的如下幾種實現(xiàn):
1)ETC1(Ericsson texture compression)
2)PVRTC (PowerVR texture compression)
3)ATITC (ATI texture compression)
4)S3TC (S3 texture compression)
ETC1:
ETC1格式是OpenGL ES圖形標(biāo)準(zhǔn)的一部分,并且被所有的Android設(shè)備所支持。
擴展名為: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以僅能用于不透明紋理。
當(dāng)加載壓縮紋理時, 參數(shù)支持如下格式:?
GL_ETC1_RGB8_OES(RGB,每個像素0.5個字節(jié))
PVRTC:
支持的GPU為Imagination Technologies的PowerVR SGX系列。
OpenGL ES的擴展名為: GL_IMG_texture_compression_pvrtc。
當(dāng)加載壓縮紋理時, 參數(shù)支持如下幾種格式:?
GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG (RGB,每個像素0.5個字節(jié))?
GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG (RGB,每個像素0.25個字節(jié))?
GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG (RGBA,每個像素0.5個字節(jié))?
GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG (RGBA,每個像素0.25個字節(jié))
ATITC:
支持的GPU為Qualcomm的Adreno系列。
支持的OpenGL ES擴展名為: GL_ATI_texture_compression_atitc。
當(dāng)加載壓縮紋理時, 參數(shù)支持如下類型的紋理:?
GL_ATC_RGB_AMD (RGB,每個像素0.5個字節(jié))?
GL_ATC_RGBA_EXPLICIT_ALPHA_AMD (RGBA,每個像素1個字節(jié))?
GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD (RGBA,每個像素1個字節(jié))
S3TC:
也被稱為DXTC,在PC上廣泛被使用,但是在移動設(shè)備上還是屬于新鮮事物。支持的GPU為NVIDIA Tegra系列。
OpenGL ES擴展名為:
GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc。
當(dāng)加載壓縮紋理時, 的參數(shù)有如下幾種格式:?
GL_COMPRESSED_RGB_S3TC_DXT1 (RGB,每個像素0.5個字節(jié))?
GL_COMPRESSED_RGBA_S3TC_DXT1 (RGBA,每個像素0.5個字節(jié))?
GL_COMPRESSED_RGBA_S3TC_DXT3 (RGBA,每個像素1個字節(jié))?
GL_COMPRESSED_RGBA_S3TC_DXT5 (RGBA,每個像素1個字節(jié))
由此可見,Mali系列GPU只支持ETC1格式的壓縮紋理,而且該紋理不支持透明通道,有一定局限性。
以上壓縮紋理格式每個像素大小相對A8R8G8B8格式的比例,最高壓縮比是16:1,最低壓縮比是4:1,對于減小紋理的數(shù)據(jù)容量有明顯作用,相應(yīng)在顯存帶寬上也有明顯優(yōu)勢,從而提高游戲的運行效率(此特性沒有絕對數(shù)值,根據(jù)每個游戲的用法和瓶頸點不同而有差別)。
4. OpenGL中相關(guān)API的使用
1) 獲得GPU的型號
glGetString(GL_RENDERER)
2) 獲得GPU的生產(chǎn)廠商
glGetString(GL_VENDOR);
3) 獲取GPU支持哪些壓縮紋理
string extensions = (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) 填充壓縮紋理數(shù)據(jù)
void glCompressedTexImage2D (
GLenum target,
GLint level,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLint border,
GLsizei imageSize,
const GLvoid * data);
這里的參數(shù)不做詳細解釋,其中internalformat即是壓縮紋理格式的類型。
5. 壓縮紋理工具的使用
每種壓縮紋理以及相應(yīng)的廠商都提供了壓縮紋理的工具,工具都分兩個版本:
a. 可視化轉(zhuǎn)換工具 (給美工或小白少量使用)
b. 命令行轉(zhuǎn)換工具 (給程序批量使用)
下面對每個工具的用法進行說明。
1)Imagination Technologies PowerVR
工具下載地址
http://www.imgtec.com/powervr/insider/sdkdownloads/index.asp?installer=W...
可視化轉(zhuǎn)換界面

命令行轉(zhuǎn)換腳本
for %%i in (*.tga) do PVRTexTool.exe -f PVRTC4 -i %%i
(將本目錄下的所有tga文件,轉(zhuǎn)換成"PVRTC4"編碼格式的pvr文件,不帶mipmap)
詳細使用說明:PvrTexTool.exe /?
2)Qualcomm Adreno
工具下載地址
https://developer.qualcomm.com/mobile-development/mobile-technologies/ga...
可視化轉(zhuǎn)換界面

命令行轉(zhuǎn)換腳本
for %%i in (*.tga) do QCompressCmd.exe %%i %%i.ktx "ATC RGBA Explicit" yes
(將本目錄下的所有tga文件,轉(zhuǎn)換成"ATC RGBA Explicit"編碼格式的ktx文件,帶mipmap)
詳細使用說明:QCompressCmd.exe /?
3)ARM Mali
工具下載地址
http://malideveloper.arm.com/develop-for-mali/mali-gpu-texture-compressi...
可視化轉(zhuǎn)換界面

命令行轉(zhuǎn)換腳本
for %%i in (*.tga) do PVRTexTool.exe -f ETC -i %%i
(將本目錄下的所有tga文件,轉(zhuǎn)換成"ETC"編碼格式的pvr文件,不帶mipmap這里還是使用的PVRTexTool.exe,也可以使用QCompressCmd.exe)
詳細使用說明:PVRTexTool.exe /?
4)nVIDIA Tegra
可以使用DirectX SDK中自帶的DirectX Texture Tool進行轉(zhuǎn)換
可視化轉(zhuǎn)換界面

命令行轉(zhuǎn)換腳本
for %%i in (*.tga) do texconv.exe -f DXT5 %%i
(將本目錄下的所有tga文件,轉(zhuǎn)換成"DXT5"編碼格式的dds文件,不帶mipmap)
詳細使用說明:TexConv.exe /?
本文來源:?http://www.cnblogs.com/luming1979/archive/2013/02/04/2891421.html
主流紋理壓縮標(biāo)準(zhǔn):ETC、PVRTC、S3TC
首先說OpenGL ES標(biāo)準(zhǔn)中的,2.0版規(guī)范中將ETC(Ericsson Texture Compression)作為基本的紋理壓縮標(biāo)準(zhǔn),這是大部分移動GPU都會支持的紋理標(biāo)準(zhǔn)。OpenGL ES 3.0中還引入了ETC2、EAC紋理壓縮格式,二者基本一致,只不過EAC主要用于1-2通道數(shù)據(jù)的情況。目前ECT2還在改進中,除了高通的Adreno 320之外還沒有移動GPU支持,Tgera 4也不行。
此外,OpenGL ES 3.0中還有一種可選紋理壓縮格式——ASTC(Adaptive Scalable Texture Compression,自適應(yīng)擴展紋理壓縮),這是ARM提出的,去年被Khronos組織認可,納入到標(biāo)準(zhǔn)中來,不過并不是強制性的,目前也只有Mali-T600系列支持。
Imagination旗下的PowerVR GPU支持的是PVRTC(PowerVR texture compression)和ETC,高通的Adreno 2xx系列支持ETC之外還有3Dc和ATITC。后兩者都是原來的ATI開發(fā)的,Adreno 320除了前面三種標(biāo)準(zhǔn)之外還支持ETC2紋理壓縮。
ARM的Mali-300/400系列支持ETC,Mali-T600還多了ASTC紋理支持。
NVIDIA的Tegra系列更有趣。之前的說法稱Tegra支持自己的紋理格式,實際上除了通用的ETC之外,Tegra支持的紋理叫做S3TC(S3 Texture Compression),也被稱為DXTn或者DXTC。S3TC是S3公司在1999年引入的,后來被DX 6.0和OpenGL 1.3吸收為官方標(biāo)準(zhǔn),DXTC相當(dāng)于Windows版的名字,S3TC是OpenGL中的名字。
說到S3TC,之前蘋果和HTC大打?qū)@麘?zhàn)的時候就涉及到了這個標(biāo)準(zhǔn)。S3已經(jīng)歸為VIA威盛旗下,HTC和威盛又有同一個老板——王雪紅。為了支援HTC打?qū)@麘?zhàn),威盛去年就把S3部門出售給了HTC,算是左手倒右手吧。
S3TC是DX顯卡都支持的標(biāo)準(zhǔn),NVIDIA也在Tegra中支持了這個標(biāo)準(zhǔn),S3TC根據(jù)不同算法又分為DXT1-DXT5這五個級別,Terga支持的實際上是DXT1、DXT3和DXT5。
Vivante的GC系列也支持ETC和S3TC,跟NVIDIA的Tegra路線相同。以前都說Vivante支持的是NVIDIA Tegra的紋理數(shù)據(jù),實際上二者是選擇了共同的路線而已,DXT也不是NVIDIA的專利。
目前來說我們能常用到的紋理壓縮主要是ETC、PVRTC、S3TC、ATITC這四種種。
主流紋理壓縮格式優(yōu)缺點

常見的TC格式壓縮比
先來看壓縮比。如果無失真的PNG容量是5.4MB,那么S3TC和ETC都能壓縮到1.1MB,PVRTC壓縮最高,可壓縮到528KB,不過PVRTC的問題在于它只支持PowerVR系列GPU,有排他性,高通的Adreno支持的ATITC同樣有排他性,其他廠商并不支持。

ETC是最通用的紋理壓縮格式,不過ETC并不招廠商待見,因為ETC紋理壓縮不支持Alpha通道,只能用于壓縮不透明的材質(zhì),不過ETC也有自己的優(yōu)點,幾乎所有的安卓設(shè)備都可以支持ETC壓縮的GPU加速。
S3TC無論壓縮速度還是壓縮比都不錯,也支持GPU加速,而且是桌面顯卡通用的壓縮格式,看起來是最完美的選擇,可惜的是移動市場跟PC不一樣,大家各自為王,NVIDIA現(xiàn)在還沒強大到讓其他GPU廠商低頭采用S3TC標(biāo)準(zhǔn)的程度,因為S3TC說到底還是一種私有的標(biāo)準(zhǔn),有專利上的麻煩。
ETC2壓縮標(biāo)準(zhǔn)補全了ETC1不支持Alpha通道的缺陷,支持更高質(zhì)量的RGBA(RGB+Alpha)壓縮,而ARM提出的ASTC標(biāo)準(zhǔn)在壓縮速度和質(zhì)量上比S3TC要好,但是這兩種壓縮格式都是新出的,支持的廠商實在太少了。