介紹了各種移動裝置所使用的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. 指令行轉換工具 (給程式批量使用)
可視化轉換界面
指令行轉換腳本 for %%i in (*.tga) do pvrtextool.exe -f pvrtc4 -i %%i (将本目錄下的所有tga檔案,轉換成"pvrtc4"編碼格式的pvr檔案,不帶mipmap) 詳細使用說明:pvrtextool.exe /?
指令行轉換腳本 for %%i in (*.tga) do qcompresscmd.exe %%i %%i.ktx "atc rgba explicit" yes (将本目錄下的所有tga檔案,轉換成"atc rgba explicit"編碼格式的ktx檔案,帶mipmap) 詳細使用說明:qcompresscmd.exe /?
指令行轉換腳本 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 /?
簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。
版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/geniusalex/p/3561099.html