OpenGL ES 壓縮紋理

什么是壓縮紋理

在實際應用特別是游戲中紋理占用了相當大的包體積鲫懒,而且GPU無法直接解碼目前流行的圖片格式嫩实,圖片必須轉換為RGB等類型的格式才能上傳到GPU內存,這顯然增加了GPU內存的占用窥岩。為了處理這些問題于是出現(xiàn)了GPU支持的壓縮紋理格式甲献,在GPU中進行解碼。壓縮紋理屬于有損壓縮颂翼,更在意解碼速度晃洒,而編碼在程序運行之前,因此速度較慢朦乏。

壓縮紋理的常見格式

基于OpenGL ES的壓縮紋理有常見的如下幾種實現(xiàn):
1)ETC1(Ericsson texture compression)
2)ETC2(Ericsson texture compression)
3)PVRTC (PowerVR texture compression)
4)ATITC (ATI texture compression)
5)S3TC (S3 texture compression)

ETC1

ETC1格式是OpenGL ES圖形標準的一部分球及,并且被所有的Android設備所支持。
擴展名為: GL_OES_compressed_ETC1_RGB8_texture呻疹,不支持透明通道吃引,所以僅能用于不透明紋理。
且要求大小是2次冪。
當加載壓縮紋理時镊尺,參數(shù)支持如下格式: GL_ETC1_RGB8_OES(RGB朦佩,每個像素0.5個字節(jié))

ETC2

ETC2 是 ETC1 的擴展,壓縮比率一樣庐氮,但壓縮質量更高吕粗,而且支持透明通道,能完整存儲 RGBA 信息旭愧。ETC2 需要 OpenGL ES 3.0(對應 WebGL 2.0)環(huán)境颅筋,目前還有不少低端 Android 手機不兼容,iOS 方面從 iPhone5S 開始都支持 OpenGL ES 3.0输枯。ETC2 和 ETC1 一樣议泵,長寬可以不相等,但要求是 2 的冪次方桃熄。

PVRTC

支持的GPU為Imagination Technologies的PowerVR SGX系列先口。
OpenGL ES的擴展名為: GL_IMG_texture_compression_pvrtc。
當加載壓縮紋理時瞳收,參數(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界弧。
當加載壓縮紋理時凡蜻,參數(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上廣泛被使用条获,但是在移動設備上還是屬于新鮮事物忠荞。支持的GPU為NVIDIA Tegra系列。
OpenGL ES擴展名為:
GL_EXT_texture_compression_dxt1和GL_EXT_texture_compression_s3tc帅掘。
當加載壓縮紋理時委煤,參數(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é))

壓縮紋理相關API的使用

1) 獲得GPU的型號

glGetString(GL_RENDERER)

2) 獲得GPU的生產廠商

glGetString(GL_VENDOR);

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

string extensions = (const char*)glGetString(GL_EXTENSIONS);

4)判斷是否支持ETC1格式的壓縮紋理

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

5) 判斷是否支持DXT格式的壓縮紋理

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

6)判斷是否支持PVRTC格式的壓縮紋理

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

7)判斷是否支持ATITC格式的壓縮紋理

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

8) 上傳壓縮紋理數(shù)據(jù)

void glCompressedTexImage2D(
        GLenum target,
        GLint level,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLint border,
        GLsizei imageSize,
        const GLvoid * data);

internalformat即是壓縮紋理格式的類型萍悴。
9)查看設備支持的texture壓縮格式,可以使用如下代碼獲取:

int num_formats;
glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &num_formats);
std::cout<<"Texture extensions: "<<num_formats<<std::endl;

int *formats = (int*)alloca(num_formats * sizeof(int));
glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);
for(int i=0; i<num_formats; i++)
{
    std::cout<<i<<" 0x"<<hex<<formats[i]<<dec<<std::endl;
} 

//注意使用PVRTC格式紋理時癣诱,紋理的filter mode不能設置為 GL_LINEAR_MIPMAP_LINEAR, 
//否則的話加載出來的畫線顯示黑色, 這里有提到计维。

10)glTexImage中指定壓縮格式可以對上傳的紋理進行壓縮以改善內存使用,通過設置intenalFormat為表中一個值實現(xiàn)撕予。通過這種方式進行圖像壓縮增加了紋理加載的開銷鲫惶,但卻能夠通過更有效地使用紋理存儲空間來增加紋理性能,如果由于某些原因無法對紋理進行壓縮实抡,OpenGL就會使用下表中所列出的基本內部格式欠母,并加載未經(jīng)壓縮的紋理。

GL_COMPRESSED_RGB : GL_RGB
GL_COMPRESSED_RGBA : GL_RGBA
GL_COMPRESSED_SRGB : GL_SRGB
GL_COMPRESSED_SRGB_ALPHA : GL_RGBA
GL_COMPRESSED_RED : GL_RED
GL_COMPRESSED_RG : GL_RG

除了這些壓縮格式外吆寨,OpenGL中還加入了一些特定的壓縮格式赏淌,即GL_COMPRESSED_SIGNED_RED_RGTC1,GL_COMPRESSED_SIGNED_RED_RGTC2啄清,和GL_COMPRESSED_SIGNED_RG_RGTC2六水,它們用于各種單顏色通道和雙顏色通道壓縮紋理,他們代替了兼容版本中GL_LUMINANCE和GL_LUMINANCE_ALPHA的功能
11)判斷紋理是否被成功壓縮

GLint comFlag; 
glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_COMPRESSED,&comFlag);

glGetTexLevelParameteriv第三參數(shù)支持的有:

GL_TEXTURE_COMPRESSED:如果紋理被壓縮返回1辣卒,否則返回0
GL_TEXTURE_COMPRESSED_IMAGE_SIZE:獲取壓縮后的紋理大兄兰帧(以字節(jié)為單位)
GL_TEXTURE_INTERNAL_FORMAT:所使用的壓縮格式
GL_NUM_COMPRESSED_TEXTURE_FORMATS:支持的壓縮紋理格式數(shù)量
GL_COMPRESSED_TEXTURE_FORMATS:支持的壓縮紋理格式數(shù)組
GL_TEXTURE_COMPRESSION_HINT: 選擇壓縮格式的方式

11)指定選擇壓縮格式的方式

glHint(GL_TEXTURE_COMPRESSION_HINT,GL_FASTEST); //最快
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_NICEST);  //質量最好
glHint(GL_TEXTURE_COMPRESSION_HINT,GL_DONT_CARE); //自行選擇

壓縮紋理工具

每種壓縮紋理以及相應的廠商都提供了壓縮紋理的工具,包括可視化工具和命令行工具荣茫,可自行下載
1)Imagination Technologies PowerVR
PVETextTool
2)Qualcomm Adreno
Adreno Texture Tool
3)ARM Mali
Mail Texture Compression Tool
4)nVIDIA Tegra
DirectX Texture Tool

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末想帅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啡莉,更是在濱河造成了極大的恐慌博脑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件票罐,死亡現(xiàn)場離奇詭異叉趣,居然都是意外死亡,警方通過查閱死者的電腦和手機该押,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門疗杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕礼,你說我怎么就攤上這事烟具。” “怎么了奠蹬?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵朝聋,是天一觀的道長。 經(jīng)常有香客問我囤躁,道長冀痕,這世上最難降的妖魔是什么荔睹? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮言蛇,結果婚禮上僻他,老公的妹妹穿的比我還像新娘。我一直安慰自己腊尚,他們只是感情好吨拗,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婿斥,像睡著了一般劝篷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上民宿,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天携龟,我揣著相機與錄音,去河邊找鬼勘高。 笑死峡蟋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的华望。 我是一名探鬼主播蕊蝗,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赖舟!你這毒婦竟也來了蓬戚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宾抓,失蹤者是張志新(化名)和其女友劉穎子漩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體石洗,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡幢泼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讲衫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缕棵。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉兽,靈堂內的尸體忽然破棺而出招驴,到底是詐尸還是另有隱情,我是刑警寧澤枷畏,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布别厘,位于F島的核電站,受9級特大地震影響拥诡,放射性物質發(fā)生泄漏触趴。R本人自食惡果不足惜氮发,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雕蔽。 院中可真熱鬧,春花似錦宾娜、人聲如沸批狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚣艇。三九已至,卻和暖如春华弓,著一層夾襖步出監(jiān)牢的瞬間食零,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工寂屏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贰谣,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓迁霎,卻偏偏與公主長得像吱抚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子考廉,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容