Android OpenGL詳解二

OpenGL版本和設備兼容性
  OpenGLES 1.0 和 1.1API 規范從Android1.0就開始支持.從Android2.2 (API Level 8)開始,框架支持OpenGLES 2.0 API規范.OpenGLES 2.0被大多數Android設備所支持並被推薦在新的基於OpenGL的應用中使用.

紋理壓縮的支持
  紋理壓縮通過減少對內存的使用可以顯著提高OpenGL應用的性能.Android框架將支持ETC1壓縮格式作為標準特性,包含一個ETC1Util工具類和壓縮工具etc1tool(在AndroidSDK中的位置:<sdk>/tools/).使用紋理壓縮的例子,請見示例代碼:CompressedTextureActivity.

 

 

  檢查一個設備上是否支持ETC1格式,調用ETC1Util.isETC1Supported()方法.

 

 

  註:ETC1格式不支持帶有alpha通道的紋理.如果你的應用需要帶有alpha通道的紋理,你就需要調查一下下你設備所支持的其它紋理壓縮格式瞭.

 

 

  ETC1格式之外,Android設備還支持其它各種紋理壓縮格式,具體的格式與GPU芯片和OpenGL的實現有關.你應該調查目標設備上所支持的紋理壓縮格式以決定你的應用所使用的格式.為瞭確定在設備上使用哪種壓縮格式,你必須查詢設備並檢查OpenGL擴展的名字,擴展的名字標識瞭設備所支持的紋理壓縮格式(和其它OpenGL特性).一些經常被支持的紋理壓縮格式所列如下:

ATITC(ATC) – ATI 紋理壓縮 (ATITCor ATC)被設備廣泛支持,它支持固定幀率的RGB紋理壓縮,RGB紋理有無alpha通道都可以.本格式可能被多種OpenGL擴展名字所表示,比如:

GL_AMD_compressed_ATC_texture

GL_ATI_texture_compression_atitc

PVRTC- PowerVR 紋理壓縮texturecompression (PVRTC) 也是被設備廣泛支持,它支持2-bit和4-bit帶或不帶alpha通道的像素紋理.這種格式被下面的OpenGL擴展名字所表示:

GL_IMG_texture_compression_pvrtc

S3TC(DXTn/DXTC) – S3紋理壓縮(S3TC)有很多變種格式(DXT1到DXT5),而且被支持的不夠廣泛.它支持4-bit或8-bit帶alpha通道的RGB紋理.此格式可能被下列擴展名字所表示:

GL_OES_texture_compression_S3TC

GL_EXT_texture_compression_s3tc

GL_EXT_texture_compression_dxt1

GL_EXT_texture_compression_dxt3

GL_EXT_texture_compression_dxt5

3DC- 3DC 紋理壓縮(3DC)支持帶alpha通道的RGB紋理壓縮,但應用不是很廣泛.此格式以下OpenGL擴展名字所代表:

GL_AMD_compressed_3DC_texture

  警告:這些紋理壓縮格式不是被所有的設備都支持.對這些格式的支持可能被制造商和設備進行一些變化.

  註:一旦你決定瞭你的應用支持什麼樣的紋理壓縮格式,就要確保在你的manifest中使用<supports-gl-texture>聲明它們.這樣可以使應用市場為不支持所需格式的設備過濾掉你的應用.

 

 

確定OpenGL擴展名
  OpenGL的實現跟據設備上擴展所支持的OpenGLES API不同而不同.這些擴展包括紋理壓縮,但是一般還是會包含其它的OpenGL特性集合.

 

 

  要確定一個設備上所支持的紋理壓縮格式以及其它的OpenGL擴展特性,需在你的目標設備上運行以下代碼:

Stringextensions =javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);

 

 

  警告:處調用的結果在不同的設備上可能不一樣!你必須在多個目標設備上運行此調用來確定哪種壓縮格式是被共同支持的.

查看此方法的輸出來確定設備上所支持的OpenGL擴展.

選擇一個OpenGLAPI 版本
  OpenGLES API v1.0 (和1.1)和v2.0都為創建3D遊戲,視覺效果和用戶界面提供瞭高性能的圖形接口.OpenGLES 1.0/1.1 API比起ES2.0在圖形編程時有很大的不同,所以開發者在使用兩種API之一進行開發前應該慬慎考慮以下的各種因素:

性能 -通常,OpenGLES 2.0提供瞭比ES1.0/1.1 API提供瞭更高的圖形性能.然而,性能在不同的android設備上表現不一樣,這取決於OpenGL圖形管線的實現.

設備兼容性 -開發者應考慮設備的類型,Android的版本和OpenGLES版本.

Coding方便性- OpenGL ES1.0/1.1 API 提供瞭一個固定的功能管線和方便的功能,但這些功能在ES2.0 API中不可用.新的OpenGL開發者可能發現用OpenGLES 1.0/1.1寫代碼更快更方便.

圖形控制 -OpenGL ES 2.0API通過使用著色器提供瞭一個完整的可編程管線從而提供瞭更高水平的控制能力.通過對圖形處理管線的更直接的控制,開發著可以創建對於1.0/1.1API 來說很難做的效果.

 

  性能,兼容性,方便性,控制性以及其它因素都可能影響你的決定,你應該跟據如何來建立最好的用戶體驗來選擇一個OpenGLAPI版本.

 

摘自 nkmnkm的專欄

發佈留言