OpenGL ES
Android包含高性能2D和3D圖形開放圖形庫(OpenGL®的)。詳細而言,OpenGL ES的API支持。 OpenGL是一個跨平台的圖形API。用於指定的3D圖形處理硬件標准的軟件接口。 ES是用於嵌入式設備的OpenGL規范的味道。 Android支持OpenGL ES的API的幾個版本號:
的OpenGL ES 1.0和1.1 - 本API規范是由Android 1.0及更高版本號支持。
OpenGL ES 2.0的 - 這個API規范由Android 2.2的(API 8級)或更高版本號支持。
的OpenGL ES 3.0 - 本API規范是由Android 4.3(API級別18)和更高的支持。
的OpenGL ES 3.1 - 這個API規范由是Android 5.0(API級別21)和更高的支持。
注意:在設備上的OpenGL ES 3.0 API的支持,須要由設備制造商提供了這個圖形管線的實現。
執行Android 4.3或更高版本號的設備可能不支持的OpenGL ES 3.0 API。
有關檢查在執行時支持哪些版本號的OpenGL ES的信息,請參閱檢查OpenGL ES版本號。
注意:由Android框架所提供的特定的API是類似於J2ME JSR239 OpenGL ES的API。可是是不同樣的。假設您熟悉J2ME JSR239規范。對變化的警報。
基礎
Android的支持OpenGL既通過其框架API和原生開發套件(NDK)。本主題重點介紹了Android框架接口。
有關NDK的很多其它信息,請參閱的Android NDK。
有兩個基礎班在Android框架,讓您創建和操縱符合OpenGL ES API的圖形:GLSurfaceView和GLSurfaceView.Renderer。假設你的目標是使用OpenGL在你的Android應用程序,了解怎樣實現一個活動,這些類應該是你的第一個目標。
GLSurfaceView
這個類是一個視圖,你能夠繪制和操作使用OpenGL API調用的對象。並在功能上SurfaceView類似。
您能夠通過創建GLSurfaceView的實例,並添加你的渲染它使用這個類。可是,假設你想捕捉觸摸屏事件,您應該擴展GLSurfaceView類來實現觸摸監聽器。如圖OpenGL的訓練課中,響應觸摸事件。
GLSurfaceView.Renderer
此接口定義在GLSurfaceView繪制圖形所須要的方法。
你必須提供這個接口作為一個單獨的類的實現,並使用GLSurfaceView.setRenderer其附加到您GLSurfaceView實例()。
該GLSurfaceView.Renderer接口,您須要實現下面方法:
onSurfaceCreated():創建GLSurfaceView時,系統調用這種方法一次。使用此方法來運行僅僅須要發生一次的操作。如設置OpenGL的環境參數或初始化的OpenGL圖形對象。
onDrawFrame()系統調用的GLSurfaceView每一個重繪此方法。使用此方法作為主要運行點繪制(並又一次繪制)圖形對象。
onSurfaceChanged()系統調用此方法時。GLSurfaceView幾何變化,包含在GLSurfaceView的大小或設備屏幕的方向變化。比如。當設備從縱向變為橫向系統調用此方法。使用此方法能夠在GLSurfaceView容器的變化做出反應。
OpenGL ES的包
一旦你建立了使用GLSurfaceView和GLSurfaceView.Renderer為OpenGL ES的容器視圖,您能夠開始使用以下的類中調用OpenGL的API:
的OpenGL ES 1.0 / 1.1 API包
android.opengl - 這個包提供了一個靜態的界面比javax.microedition.khronos封裝接口的OpenGL ES 1.0 / 1.1類和更好的性能。
GLES10
GLES10Ext
GLES11
GLES11Ext
javax.microedition.khronos.opengles - 此軟件包提供了標准實施的OpenGL ES 1.0 / 1.1。
GL10
GL10Ext
GL11
GL11Ext
GL11ExtensionPack
的OpenGL ES 2.0 API類
android.opengl.GLES20 - 此軟件包提供接口的OpenGL ES 2.0,並開始提供Android 2.2的(API級別8)。
的OpenGL ES 3.0 / 3.1 API包
android.opengl - 此軟件包提供了接口的OpenGL ES 3.0 / 3.1類。
3.0版開始提供的Android 4.3(API等級18)。 3.1版開始提供的是Android 5.0(API等級21)。
GLES30
GLES31
GLES31Ext(Android的擴展包)
假設你想開始建設有OpenGL ES的應用程序向右走,遵循的OpenGL ES類顯示圖形。
聲明要求的OpenGL
假設應用程序使用的OpenGL功能,這些功能並不是適用於全部的設備,你必須在你的AndroidManifest.xml文件這些要求。下面是最常見的OpenGL清單的聲明:
OpenGL ES版本號的要求 - 假設你的應用須要OpenGL ES的特定版本號。您必須通過例如以下圖所看到的加入下面設置你的清單聲明要求。
對於OpenGL ES 2.0的:
<!-- Tell the system this app requires OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" />加入此聲明將使谷歌播放從被安裝在不支持OpenGL ES2.0標准的設備將應用程序限制。
假設應用程序是專為支持的OpenGL ES3.0的設備,你也能夠在你的清單中指定的:
對於OpenGL ES的3.0:
<!-- Tell the system this app requires OpenGL ES 3.0. --> <uses-feature android:glEsVersion="0x00030000" android:required="true" />For OpenGL ES 3.1:
<!-- Tell the system this app requires OpenGL ES 3.1. --> <uses-feature android:glEsVersion="0x00030001" android:required="true" />注:的OpenGL ES API 3.X與2.0 API,這意味着你能夠與你的應用程序中實現的OpenGL ES的更靈活的向后兼容。通過聲明的OpenGL ES 2.0 API作為您清單的要求,您能夠使用該API版本號作為默認,檢查在執行時API 3.X的可用性,然后假設設備支持使用OpenGL ES 3.x的功能它。有關檢查設備所支持的OpenGL ES版本號的很多其它信息,請參閱檢查OpenGL ES版本號。
紋理壓縮的要求 - 假設應用程序使用的紋理壓縮格式,您必須使用<支持-GL紋理>聲明應用程序支持的格式,在你的清單文件。有關可用紋理壓縮格式的很多其它信息,請參閱紋理壓縮支持。
在清單中聲明紋理壓縮需求隱藏您的用戶不支持您的聲明壓縮類型的至少一個器件中的應用。
有關谷歌Play怎樣過濾功能紋理壓縮的很多其它信息。請參閱谷歌Play和<支撐-GL紋理>文件的紋理壓縮過濾部分。
貼圖坐標繪制的對象
當中一個在Android設備上顯示圖形的基本問題是,他們的屏幕能夠在大小和形狀各不同樣。 OpenGL的承擔方,統一坐標系統,默認情況下。興致勃勃地繪制這些坐標到您的典型的非方形屏幕。就好像它是完美的正方形。
圖1.默認OpenGL的坐標系(左)映射到一個典型Android裝置畫面(右)。
上面的圖顯示了統一協調如果左側一個OpenGL框架體系,以及怎樣將這些坐標實際上映射到一個典型的設備屏幕在右側橫向。為了解決問題,你能夠申請OpenGL的投影模式和相機意見,使您的圖形對象具有在不論什么顯示器上以正確的比例轉換坐標。
為了運用投影和相機視圖,您創建一個投影矩陣,攝像機視圖矩陣。並將其應用到OpenGL渲染管線。
使他們正確地映射到Android設備屏幕的投影矩陣又一次計算圖形的坐標。攝像機視圖矩陣創建從一個特定的眼睛位置渲染對象的變換。
在OpenGL ES 1.0投影和相機視圖
在ES 1.0 API,通過創建每一個矩陣,然后將其加入到OpenGL的環境中應用投影和相機視圖。
投影矩陣 - 為了又一次計算對象創建使用該設備屏幕的幾何形狀的投影矩陣坐標。以便他們繪制的正確比例。以下的演示樣例代碼演示了怎樣改動GLSurfaceView.Renderer實施onSurfaceChanged()方法來創建基於屏幕的寬高比的投影矩陣。並將其應用到OpenGL渲染環境。
public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); // make adjustments for screen ratio float ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode gl.glLoadIdentity(); // reset the matrix to its default state gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix }相機變換矩陣 - 一旦你使用調整投影矩陣坐標系統,您還必須應用攝影機視圖。以下的演示樣例代碼顯示了怎樣改動GLSurfaceView.Renderer實施onDrawFrame()方法來應用模型視圖,並使用GLU.gluLookAt()有用程序來創建一個模擬攝像機的位置觀看的轉變。
public void onDrawFrame(GL10 gl) { ... // Set GL_MODELVIEW transformation mode gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // reset the matrix to its default state // When using GL_MODELVIEW, you must set the camera view GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); ... }在OpenGL ES 2.0的和更高的投影和相機視圖
在ES2.0和3.0的API,則通過首先加入矩陣部件圖形對象的頂點着色器應用於投影和相機視圖。有了這個矩陣成員加入,你就能夠生成和應用投影和鏡頭視角矩陣來你的對象。
加入矩陣頂點着色器 - 創建視圖投影矩陣的變量,並把它作為着色器的位置的乘數。在以下的樣例中頂點着色器代碼中,包括的MVP矩陣構件同意你投影和相機的觀看矩陣應用到使用此着色的物體的坐標。
private final String vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of objects that use this vertex shader. "uniform mat4 uMVPMatrix; \n" + "attribute vec4 vPosition; \n" + "void main(){ \n" + // The matrix must be included as part of gl_Position // Note that the uMVPMatrix factor *must be first* in order // for the matrix multiplication product to be correct. " gl_Position = uMVPMatrix * vPosition; \n" + "} \n";注:上面的樣例定義了一個變換矩陣成員在當中應用組合投影矩陣和攝像機視圖矩陣頂點着色器。
依據您的應用需求。您可能要定義你的頂點着色器單獨的投影矩陣和攝像機觀察矩陣的成員。以便能夠獨立改變它們。
訪問着色器矩陣 - 在你的頂點着色器創建一個鈎子應用投影和攝像頭視圖后,你就能夠訪問該變量應用投影和攝像頭觀看矩陣。
以下的代碼演示了怎樣改動GLSurfaceView.Renderer實施onSurfaceCreated()方法來訪問在上面的頂點着色器中定義的矩陣變量。
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); ... }創建投影和相機的觀看矩陣 - 生成的投影和觀察矩陣要應用的圖形對象。以下的演示樣例代碼顯示了怎樣改動GLSurfaceView.Renderer實施onSurfaceCreated()和onSurfaceChanged()方法來創建攝像機視圖矩陣,並依據設備的屏幕高寬比的投影矩陣。
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... // Create a camera view matrix Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); float ratio = (float) width / height; // create a projection matrix from device screen geometry Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }應用投影和鏡頭視角矩陣 - 要應用投影和相機視圖變換,乘矩陣一起。然后將其設置到頂點着色器。
以下的演示樣例代碼顯示了怎樣改動GLSurfaceView.Renderer實施onDrawFrame()方法,在上面的代碼創建的投影矩陣和攝像機視圖結合起來。然后將其應用於通過的OpenGL渲染圖形對象。
public void onDrawFrame(GL10 unused) { ... // Combine the projection and camera view matrices Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0); // Apply the combined projection and camera view transformations GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); // Draw objects ... }有關怎樣運用投影和相機視圖與OpenGL ES 2.0的一個完整的演示樣例。請參閱使用OpenGL ES的類顯示圖形。
外形面和繞線
在OpenGL,形狀的面是由三個或很多其它個三維空間中定義的表面。
一組三個或很多其它個三維點(稱為在OpenGL頂點)具有一個前表面和背面。你怎么知道它的臉前,這是回來了? 好問題。
答案與纏繞。或者。您在當中定義形狀的點的方向去做。
圖1.插圖換算成逆時針順序繪制坐標列表。
在本例中,三角形的點中,使得它們在反時針方向繪制的順序進行定義。在這些坐標被繪制的順序定義了形狀的卷繞方向。默認情況下。在OpenGL。這是逆時針方向繪制面對的是前臉。在圖1所看到的的三角形被定義。以便你正在尋找的形狀的前表面(由OpenGL作為解釋),而還有一側是背面。
為什么非常重要知道哪一個形狀的臉是前面?答案與OpenGL的一個經常使用的功能。叫做臉撲殺做。
面剔除是用於OpenGL的環境。它同意渲染流水線忽略(未計算或繪制)的形狀的背面。節省了時間。存儲器和處理周期一個選項:
// enable face culling feature gl.glEnable(GL10.GL_CULL_FACE); // specify which faces to not draw gl.glCullFace(GL10.GL_BACK);假設您嘗試使用面部特征撲殺不知道。你的形狀,兩側都是正面和背面,你的OpenGL圖形要看看有點薄。或可能顯示不出來的。所以,總是定義一個逆時針繪制順序你的OpenGL圖形的坐標。
注意:您能夠設置一個OpenGL環境治療順時針臉的前臉,但這樣做須要很多其它的代碼。並有可能當你問他們幫忙來迷惑經驗豐富的開發者的OpenGL。
所以。不要做。
OpenGL的版本號和設備兼容性
OpenGL ES的1.0和1.1 API規范因為Android 1.0已經支持。採用Android 2.2(API 8級)開始。該框架支持的OpenGL ES 2.0 API規范。
OpenGL ES 2.0的是大多數Android設備的支持。推薦用於新的應用程序正在使用OpenGL開發的。的OpenGL ES 3.0的支持與Android 4.3(API級別18)和更高,在提供OpenGL ES的3.0 API的實現設備。有關支持OpenGL ES的特定版本號的Android供電設備的相對數量的信息。請參閱OpenGL ES版本號儀表板。
圖形編程的OpenGL ES 1.0 / 1.1 API比使用2.0及更高版本號顯著不同。 API的1.x的版本號有更方便的方法和固定圖形管線。而的OpenGL ES 2.0和3.0 API提供了通過利用OpenGL着色器流水線的更直接的控制。
您應該慎重考慮顯卡的要求並選擇最適合您的應用程序API版本號。欲了解很多其它信息,請參閱選擇一個OpenGL API版本號。
OpenGL ES的3.0 API提供了額外的功能,比2.0 API的性能更好。也向后兼容。
這意味着你可能會寫你的應用程序針對的OpenGL ES 2.0和條件包括的OpenGL ES 3.0圖形功能,假設他們都可用。有關檢查為3.0 API的可用性的具體信息,請參閱檢查OpenGL ES版本號
紋理壓縮支持
紋理壓縮能夠通過降低存儲需求的同一時候更有效地利用內存帶寬添加顯著OpenGL應用程序的性能。
Android框架提供了ETC1壓縮格式作為標准功能,包含ETC1Util有用工具類和etc1tool壓縮工具(位於Android SDK中的<SDK> /工具/)的支持。對於使用紋理壓縮一個Android應用程序的演示樣例,請參閱Android SDK中的CompressedTextureActivity代碼演示樣例(<SDK> /樣本/ <版本號> / ApiDemos / src文件夾/ COM /樣例/安卓/的API /圖形/)。
注意:ETC1格式是由大多數Android設備的支持。但它不能保證是可用的。要檢查是否支持設備上的ETC1格式,調用ETC1Util.isETC1Supported()方法。
注:ETC1紋理壓縮格式不支持的紋理與透明度(alpha通道)。假設應用程序須要使用透明紋理,您應該調查在目標設備上可用的其它的紋理壓縮格式。
該ETC2 / EAC紋理壓縮格式,保證使用的OpenGL ES 3.0 API時可用。這樣的紋理格式提供良好的壓縮比與高視覺質量和格式還支持透明度(Alpha通道)。
除了ETC格式,Android設備都依據自己的GPU芯片和OpenGL實現紋理壓縮多樣的支持。您應該調查你的目標來確定應用程序應該支持什么樣的壓縮類型的設備上的紋理壓縮的支持。
為了確定哪些紋理格式都支持特定設備上,必須查詢設備和審查OpenGL擴展名。當中確定哪些紋理壓縮格式(和其它的OpenGL功能)的設備支持。
一些經常使用支持的紋理壓縮格式例如以下:
ATITC(ATC) - ATI紋理壓縮(ATITC或ATC)可在多種設備。並支持RGB紋理使用和不使用alpha通道固定利率壓縮。這樣的格式能夠通過幾種OpenGL擴展名,比如表示:
GL_AMD_compressed_ATC_texture
GL_ATI_texture_compression_atitc
PVRTC - PowerVR的紋理壓縮(PVRTC)可在各種設備,並支持2位和每像素4位的紋理具有或不具有alpha通道。
這樣的格式是由下面OpenGL擴展名來表示:
GL_IMG_texture_compression_pvrtc
S3TC(DXTn / DXTC) - S3紋理壓縮(S3TC)有幾個格式變化(DXT1到DXT5)和不太廣泛使用。該格式支持RGB紋理與4位字母或8位Alpha通道。這樣的格式能夠通過幾種OpenGL擴展名,比如表示:
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)是支持RGB紋理與alpha通道較少廣泛使用的格式。這樣的格式是由下面OpenGL擴展名來表示:
GL_AMD_compressed_3DC_texture
警告:這些紋理壓縮格式不支持的全部設備。對這些格式的支持能夠通過制造商和設備而異。有關怎樣確定的格式是一個特定的設備上什么紋理壓縮的信息,請參閱下一節。
注意:一旦你決定哪些紋理壓縮格式的應用程序將支持,確保您在使用清單<支持-GL紋理>申報。
使用此聲明同意通過外部服務。如谷歌播放過濾,從而僅安裝在支持您的應用要求的格式設備上的應用程序。有關具體信息。請參閱OpenGL的艙單申報。
確定OpenGL擴展
的OpenGL的實現通過Android設備在擴展OpenGL ES的API所支持的方面有所不同。這些擴展包含紋理壓縮,但通常還包含其它擴展到OpenGL的功能集。
要確定哪些紋理壓縮格式。和其它OpenGL擴展,支持在特定設備上:
執行在目標設備上以下的代碼。以確定支持哪些紋理壓縮格式:
String extensions = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_EXTENSIONS);
閱讀本方法的輸出,以確定哪些OpenGL擴展支持在設備上。
Android的擴展包(AEP)
該AEP確保您的應用程序支持一套標准化OpenGL擴展超出了OpenGL的3.1規范中描寫敘述的一套核心。包裝這些擴展一起鼓舞一套一致的跨設備的功能。同一時候同意開發者可以充分利用移動GPU設備的最新作物。
該AEP還改善了圖像,渲染存儲緩沖器,並在片段着色原子專櫃的支持。
對於您的應用程序可以使用的AEP,該應用程序的清單必須聲明的AEP是必需的。
此外,平台版本號必須支持它。
申報清單中的AEP要求例如以下:
<uses feature android:name="android.hardware.opengles.aep" android:required="true" />要驗證平台版本號支持AEP。使用hasSystemFeature(String)方法。在FEATURE_OPENGLES_EXTENSION_PACK傳遞作為參數。以下的代碼片段顯示了怎樣做到這一點的樣例:
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);假設該方法返回true。AEP支持。
有關AEP的很多其它信息,請在Khronos的OpenGL ES的注冊表訪問其網頁。
檢查OpenGL ES版本號
有在Android設備上提供多個版本號的OpenGL ES的。你能夠指定你的應用程序須要在你的清單API的最低版本號。但你也可能想利用功能的新的API在同一時間。
比如,對OpenGL ES 3.0 API與2.0版本號的API向后兼容,所以你可能須要編寫你的應用程序。以便它使用的OpenGL ES 3.0的功能。但假設3.0 API不回落到2.0 API可用。
利用比你的應用程序清單所需的最低更高版本號的OpenGL ES功能之前,你的應用程序應檢查設備上可用的API的版本號。
您能夠通過下面兩種方式之中的一個進行:
嘗試建立更高級別的OpenGL ES上下文(GL上下文),並檢查結果。
創建最小支持OpenGL ES的背景和檢查版本號價值。
以下的演示樣例代碼演示了怎樣通過創建一個EGLContext和檢查結果,檢查可用的OpenGL ES版本號。這個樣例說明怎樣檢查的OpenGL ES 3.0的版本號:
private static double glVersion = 3.0; private static class ContextFactory implements GLSurfaceView.EGLContextFactory { private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; public EGLContext createContext( EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { Log.w(TAG, "creating OpenGL ES " + glVersion + " context"); int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) glVersion, EGL10.EGL_NONE }; // attempt to create a OpenGL ES 3.0 context EGLContext context = egl.eglCreateContext( display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); return context; // returns null if 3.0 is not supported; } }假設上述的createContext()方法,顯示返回null,你的代碼應該創建一個OpenGL ES 2.0的范圍內。而不是和回落到僅僅使用該API。
以下的代碼演示樣例演示怎樣首先創建一個支持的最低上下文。然后檢查版本號字符串檢查OpenGL ES版本號:
// Create a minimum supported OpenGL ES context, then check: String version = javax.microedition.khronos.opengles.GL10.glGetString( GL10.GL_VERSION); Log.w(TAG, "Version: " + version ); // The version format is displayed as: "OpenGL ES <major>.<minor>" // followed by optional content provided by the implementation.
通過這樣的方法,假設您發現該設備支持更高級別的API版本號。您必須銷毀最小的OpenGL ES的背景下,並創建一個新的上下文具有較高可用的API版本號。
選擇一個OpenGL API版本號
的OpenGL ES 1.0 API的版本號(和1.1擴展),2.0版和3.0版的全部用於創建3D游戲,可視化和用戶界面,提供了高性能的圖形界面。
圖形編程的OpenGL ES 2.0和3.0在非常大程度上是相似的,與代表附加功能的2.0 API的超集3.0版本號。
為OpenGL ES的1.0 / 1.1 API與OpenGL ES的編程2.0和3.0不同顯著。因此開發商應該細致考慮開始使用這些API開發之前下面因素:
性能 - 普通情況下。的OpenGL ES 2.0和3.0提供比ES 1.0 / 1.1版本號更快的圖形性能。只是,性能差異能夠依據您的OpenGL應用程序上,執行在Android設備上因為硬件制造商的實現的OpenGL ES圖形管線的不同而有所差異。
設備的兼容性 - 開發人員應該考慮的設備類型,版本號的Android和可用到他們的客戶的OpenGL ES版本號。
對於OpenGL的兼容性跨設備的具體信息,請參閱OpenGL的版本號和設備兼容性部分。
編碼方便 - OpenGL ES的1.0 / 1.1 API提供了一個固定的功能管線和方便的功能,這是不是在OpenGL ES的2.0或3.0的API可用。
開發誰是新的OpenGL ES可能會發現編碼版本號1.0 / 1.1更快,更方便。
圖形控制 - 的OpenGL ES 2.0和3.0的API,通過使用着色器提供全然可編程管線提供更高程度的控制。與圖形處理管線的更直接的控制,開發人員能夠創建效果,將是很困難的使用1.0 / 1.1 API生成。
紋理支持 - 的OpenGL ES 3.0 API擁有紋理壓縮了最好的支持。由於它保證了ETC2壓縮格式,支持透明的可用性。
在1.x和2.0 API的實現通常包含支持ETC1,可是這紋理格式不支持透明度,所以你通常必須提供資源,通過你的目標設備支持的其它壓縮格式。有關具體信息,請參閱紋理壓縮支持。
盡管性能,兼容性,便利性,控制等因素都可能影響你的決定,你應該依據你的想法為你的用戶提供最佳體驗挑一個OpenGL API版本號。