Android OpenGL ES 翻譯

官方文檔地址

Android包含Open Graphics Library(OpenGL?)庫谣拣,特別是OpenGL ES API森缠,以支持高性能的2D和3D圖形。OpenGL是一個跨平臺的圖形處理API, 為3D圖形處理硬件指定了一個標準的軟件接口列肢。OpenGL ES是OpenGL專門針對嵌入式設備制定的規(guī)范瓷马。Android 支持幾個版本的OpenGL ES API:

  • OpenGL ES 1.0 和 1.1 - 這個API規(guī)范的版本在Android 1.0以及更高的版本支持。
  • OpenGL ES 2.0 - 這個API規(guī)范的版本在Android 2.2(API 級別 8)以及更高的版本支持跨晴。
  • OpenGL ES 3.0 - 這個API規(guī)范的版本在Android 4.3(API 級別 18)以及更高的版本支持。
  • OpenGL ES 3.1 - 這個API規(guī)范的版本在Android 5.0(API 級別 21)以及更高的版本支持怀骤。

警告:在設備上使用OpenGL ES 3.0 API需要實現(xiàn)設備制造商提供的此圖形管道蒋伦。運行Android 4.3或更高版本的設備可能不支持OpenGL ES 3.0 API焚鹊。有關(guān)在運行時檢查支持的OpenGL ES版本信息,請參閱檢查OpenGL ES版本

注意:Android框架提供的API類似于J2ME JSR239 OpenGL ES API势决,但不完全相同。如果您熟悉J2ME JSR239規(guī)范陈莽,請注意它們的變化走搁。

OpenGL ES 1.0的投影和相機視圖

其他說明:

基礎(chǔ)

android框架APINDK(Native Development Kit)都支持OpenGL私植。這里主要關(guān)注的是Android框架接口曲稼。想了解更多關(guān)于NDK的信息,請參見Android NDK瑞驱。

Android框架中有兩個基礎(chǔ)類:GLSurfaceViewGLSurfaceView.Renderer唤反,可讓您使用OpenGL ES API創(chuàng)建和操作圖形彤侍。如果你的目的是在你的安卓應用程序中使用OpenGL逆趋,那么弄明白如何在activity中實現(xiàn)這兩個類應該是你的首要目標

GLSurfaceView

這個類是一個view闻书,你可以調(diào)用 OpenGL API 繪制惠窄、操作GLSurfaceView的對象杆融,GLSurfaceView的功能和SurfaceView類似。使用GLSurfaceView需要創(chuàng)建GLSurfaceView的實例并向它添加一個Renderer蒋腮。如果你想要獲取屏幕觸摸事件池摧,你應該像教程響應觸摸事件中演示的那樣擴展GLSurfaceView類實現(xiàn)觸摸監(jiān)聽作彤。

GLSurfaceView.Renderer

此接口定義了在GLSurfaceView中繪制圖形所需的方法。你必須提供一個類實現(xiàn)這個接口创葡,并且創(chuàng)建一個實例灿渴,然后使用GLSurfaceView.setRenderer()添加到你的GLSurfaceView上骚露。

GLSurfaceView.Renderer接口需要您實現(xiàn)以下方法:

  • onSurfaceCreated():在創(chuàng)建GLSurfaceView時缚窿,系統(tǒng)會調(diào)用此方法一次滨攻。在這個方法執(zhí)行僅需要執(zhí)行一次的操作光绕,例如設置OpenGL環(huán)境參數(shù)或初始化OpenGL圖形對象诞帐。
  • onDrawFrame():系統(tǒng)在每次重繪GLSurfaceView時調(diào)用此方法。這個方法主要用來繪制(和重繪)圖形愕鼓。
  • onSurfaceChanged():當GLSurfaceView 形狀發(fā)生變化時調(diào)用此方法菇晃。包括GLSurfaceView的大小或者設備屏幕方向發(fā)生改變磺送。例如:當設備由縱向更改為橫向時會調(diào)用此方法。使用這個方法響應GLSurfaceView容器的更改崇呵。

OpenGL ES packages

一旦你使用GLSurfaceViewGLSurfaceView.Renderer創(chuàng)建OpenGL ES容器后域慷,你就可以使用下面的類調(diào)用OpenGLAPI

OpenGL ES 1.0/1.1 API Packages

OpenGL ES 2.0 API Class

  • android.opengl.GLES20 - 這個包提供OpenGL ES 2.0的接口付材。從Android 2.2 (API level 8)開始可用

OpenGL ES 3.0/3.1 API Packages

如果您想立即開始使用OpenGL ES構(gòu)建應用程序银萍,請查看使用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" />

添加此聲明會導致Google Play限制您的應用程序安裝在不支持OpenGL ES 2.0的設備上崖咨。如果您的應用程序只能用于支持OpenGL ES 3.0的設備,您還可以在清單中指定:

對于OpenGL ES 3.0:

<!-- Tell the system this app requires OpenGL ES 3.0. -->
<uses-feature android:glEsVersion="0x00030000" android:required="true" />

對于OpenGL ES 3.1:

<!-- Tell the system this app requires OpenGL ES 3.1. -->
<uses-feature android:glEsVersion="0x00030001" android:required="true" />

注意: OpenGL ES 3.x API向后兼容2.0API,這意味著您可以更靈活地在應用程序中實現(xiàn)OpenGL ES推穷。通過在清單中聲明OpenGL ES 2.0 API作為要求类咧,您可以將該API版本用作默認值痕惋,在運行時檢查3.x API的可用性值戳,如果設備支持則使用OpenGL ES 3.x堕虹。有關(guān)檢查設備支持的OpenGL ES版本的更多信息,請參閱檢查OpenGL ES版本

  • 紋理壓縮要求 - 如果您的應用程序使用紋理壓縮格式禀崖,則必須使用<supports-gl-texture>在清單文件中聲明應用程序支持的格式波附。有關(guān)可用紋理壓縮格式的詳細信息掸屡,請參閱紋理壓縮支持仅财。
    對于不支持任何一種你在清單文件中聲明的紋理壓縮格式的設備碗淌,Google play會對該用戶隱藏你的應用。
    在清單中聲明紋理壓縮要求會使用不支持至少一種聲明壓縮類型的設備的用戶隱藏應用程序磅废。有關(guān)Google Play如何過濾用于紋理壓縮的詳細信息拯勉,請參Google Play的紋理壓縮過濾關(guān)于<supports-gl-texture>的文檔宫峦。

映射繪制對象的坐標

在安卓設備上現(xiàn)實圖形的一個基本問題是它們的屏幕大小和形狀都可能不同导绷。OpenGL默認情況下采用方形妥曲,均勻的坐標系統(tǒng)枚碗,可以將這些圖形坐標繪制到普通的非方形屏幕上肮雨,就好像它是完美的正方形一樣怨规。


image

圖1:默認的OpenGL坐標系統(tǒng)(左)映射到典型的安卓設備屏幕(右)

上圖顯示了左側(cè)OpenGL框架的統(tǒng)一坐標系統(tǒng)波丰,以及這些坐標如何實際映射到右側(cè)橫向的典型設備屏幕掰烟。要解決此問題纫骑,您可以應用OpenGL投影模式和攝像機視圖來轉(zhuǎn)換坐標先馆,以便您的圖形對象在任何顯示上都具有正確的比例躺彬。
為了應用投影和攝像機視圖,您可以創(chuàng)建投影矩陣和攝像機視圖矩陣铣减,并將它們應用于OpenGL渲染管道徙歼。投影矩陣重新計算圖形的坐標魄梯,以便它們正確映射到Android設備屏幕酿秸。攝像機視圖矩陣創(chuàng)建一個從特定視角變換的渲染對象辣苏。

OpenGL ES 1.0中的投影和相機視圖

ES 1.0 API中稀蟋,您可以通過創(chuàng)建每個矩陣然后將它們添加到OpenGL環(huán)境來應用投影和攝像機視圖呐赡。

  1. 投影矩陣 -
    使用設備屏幕的幾何圖形創(chuàng)建投影矩陣链嘀,以便重新計算對象坐標按照正確的比例繪制它們怀泊。以下示例代碼演示了如何修改GLSurfaceView.Renderer實現(xiàn)的onSurfaceChanged()方法霹琼,以根據(jù)屏幕的寬高比創(chuàng)建投影矩陣枣申,并將其應用于OpenGL渲染環(huán)境糯而。
override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
    gl.apply {
        glViewport(0, 0, width, height)

        // make adjustments for screen ratio
        val ratio: Float = width.toFloat() / height.toFloat()

        glMatrixMode(GL10.GL_PROJECTION)            // set matrix to projection mode
        glLoadIdentity()                            // reset the matrix to its default state
        glFrustumf(-ratio, ratio, -1f, 1f, 3f, 7f)  // apply the projection matrix
    }
}
  1. 相機變換矩陣 - 使用投影矩陣調(diào)整坐標系后熄驼,還必須應用攝像機視圖。以下示例代碼顯示如何修改GLSurfaceView.Renderer實現(xiàn)的onDrawFrame()方法以應用模型視圖并使用GLU.gluLookAt()實用程序去創(chuàng)建一個攝像機位置的模擬查看轉(zhuǎn)換携悯。
override fun onDrawFrame(gl: GL10) {
    ...
    gl.apply {
        // Set GL_MODELVIEW transformation mode
        glMatrixMode(GL10.GL_MODELVIEW)
        glLoadIdentity()                     // reset the matrix to its default state
    }

    // When using GL_MODELVIEW, you must set the camera view
    GLU.gluLookAt(gl, 0f, 0f, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
    ...
}

OpenGL ES 2.0及更高版本中的投影和相機視圖

ES 2.03.0 API中使用投影和攝像機視圖憔鬼,首先將矩陣成員添加到圖形對象的頂點著色器轴或。添加此矩陣成員后照雁,您可以生成投影并且將投影和相機視圖矩陣應用于你的對象饺蚊。

  1. 將矩陣添加到頂點著色器 - 創(chuàng)建一個投影矩陣變量污呼,并將其包含為著色器位置的乘數(shù)燕酷。在以下示例頂點著色器代碼中悟狱,包含的uMVPMatrix成員允許您將投影和camera viewing矩陣應用于使用此著色器的對象的坐標堰氓。
private val 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"

注意: 上面的示例在頂點著色器中定義了一個變換矩陣成員,您可以在其中應用projection矩陣和camera view矩陣囤攀。根據(jù)您的應用需求焚挠,您可能希望在頂點著色器中定義單獨的投影矩陣和camera viewing矩陣成員蝌衔,以便您可以單獨更改它們。

  1. 訪問著色器矩陣 - 在頂點著色器中創(chuàng)建鉤子以應用投影和攝像機視圖后曹锨,您可以訪問該變量以應用投影和camera viewing矩陣沛简。以下代碼顯示如何修改GLSurfaceView.Renderer實現(xiàn)的onSurfaceCreated()方法以訪問上面頂??點著色器中定義的矩陣變量椒楣。
override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
    ...
    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix")
    ...
}
  1. 創(chuàng)建投影和camera viewing矩陣 - 生成要應用于圖形對象的投影和查看矩陣。以下示例代碼顯示如何修改GLSurfaceView.Renderer實現(xiàn)的onSurfaceCreated()onSurfaceChanged()方法凤壁,以根據(jù)設備的屏幕寬高比創(chuàng)建camera view矩陣和投影矩陣拧抖。
override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
    ...
    // Create a camera view matrix
    Matrix.setLookAtM(mVMatrix, 0, 0f, 0f, -3f, 0f, 0f, 0f, 0f, 1.0f, 0.0f)
}

override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
    GLES20.glViewport(0, 0, width, height)

    val ratio: Float = width.toFloat() / height.toFloat()

    // create a projection matrix from device screen geometry
    Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1f, 1f, 3f, 7f)
}
  1. 應用投影和camera viewing矩陣 - 要應用投影和攝像機視圖變換唧席,請將矩陣相乘淌哟,然后將它們設置為頂點著色器徒仓。以下示例代碼顯示如何修改GLSurfaceView.Renderer實現(xiàn)的onDrawFrame()方法掉弛,以組合在上面的代碼中創(chuàng)建的投影矩陣和camera view殃饿,然后將其應用于要由OpenGL渲染的圖形對象乎芳。
override fun onDrawFrame(gl: GL10) {
    ...
    // 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
    ...
}

有關(guān)如何使用OpenGL ES 2.0應用投影和攝像機視圖的完整示例奈惑,請參閱使用OpenGL ES類顯示圖形携取。

Shape faces and winding

在OpenGL中雷滋,形狀的面是由三維空間中的三個或更多個點定義的表面晤斩。一組三個或更多個三維點(在OpenGL中稱為頂點)具有正面和背面澳泵。你怎么知道哪個面朝前兔辅,哪個面朝后维苔?好問題介时。答案與纏繞或者定義形狀的點的方向有關(guān)沸柔。


image

圖 1. 坐標列表的圖示褐澎,該列表展示逆時針繪圖順序会钝。

在該示例中,三角形點的定義順序使得它們以逆時針方向繪制乱凿。繪制這些坐標的順序定義了形狀的纏繞方向顽素。默認情況下咽弦,在OpenGL中徒蟆,逆時針繪制的面是正面。圖1中所示的三角形您看到的是三角形的正面(由OpenGL解釋)型型,另一面是背面。
為什么知道形狀的哪個面是正面很重要闹蒜?答案與OpenGL的常用功能有關(guān)寺枉,稱為面部剔除抑淫。面部剔除是OpenGL環(huán)境的一個選項,它允許渲染管道忽略(不計算或繪制)形狀的背面姥闪,從而節(jié)省時間始苇、內(nèi)存和處理周期:

gl.apply {
    // enable face culling feature 
    glEnable(GL10.GL_CULL_FACE)
    // specify which faces to not draw
    glCullFace(GL10.GL_BACK)
}

如果您嘗試使用面部剔除功能而不知道形狀的哪一側(cè)是正面和背面,那么您的OpenGL圖形看起來會有點薄筐喳,或者可能根本不會顯示催式。所以,始終以逆時針的順序定義OpenGL形狀的坐標

注意:可以將OpenGL環(huán)境設置為將順時針面作為正面避归,但這樣做需要更多代碼荣月,并且當您向經(jīng)驗豐富的OpenGL開發(fā)人員尋求幫助時可能會使他們感到困惑。所以不要這樣做梳毙。

OpenGL 版本和設備兼容性

Android 1.0開始支持OpenGL ES1.0和1.1的規(guī)范哺窄。Android框架從2.2(lv8)開始支持OpenGL ES 2.0的API規(guī)范。大多數(shù)Android設備都支持OpenGL ES 2.0账锹,建議新開發(fā)的使用OpenGL的應用程序使用OpenGL2.0開發(fā)萌业。對于提供了OpenGL ES 3.0 API 實現(xiàn)的設備,Android 4.3(lv 18)以及更高的版本支持OpenGL ES 3.0 API奸柬。有關(guān)支持特定 OpenGL ES 版本的設備的比例信息咽白,請參閱OpenGL ES平臺版本

使用OpenGL ES 1.0 / 1.1 API進行圖形編程與使用2.0及更高版本有很大不同鸟缕。 API的1.x版本具有更多便利方法和固定圖形管道晶框,而OpenGL ES 2.0和3.0 API通過使用OpenGL著色器提供更直接的管道控制。 您應該仔細考慮圖形要求懂从,并選擇最適合您應用的API版本授段。 有關(guān)更多信息,請參閱選擇OpenGL API版本番甩。

OpenGL ES 3.0 API提供了比2.0 API更多的功能和更好的性能侵贵,并且也向后兼容。 這意味著您可以編寫針對OpenGL ES 2.0的應用程序缘薛,并有條件地包含OpenGL ES 3.0圖形功能(如果可用)窍育。 有關(guān)檢查3.0 API可用性的更多信息,請參閱檢查OpenGL ES版本

紋理壓縮支持

紋理壓縮可以減少內(nèi)存需求和更有效地利用內(nèi)存帶寬來顯著提高OpenGL應用程序的性能宴胧。 Android框架提供對ETC1壓縮格式的支持漱抓,作為標準功能,包括ETC1Util實用程序類和etc1tool壓縮工具(位于Android SDK中:<sdk>/tools/)恕齐。 有關(guān)使用紋理壓縮的Android應用程序的示例乞娄,請參閱Android SDK中的CompressedTextureActivity代碼示例(<sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/)。

注意:大多數(shù)Android設備都支持ETC1格式,但不保證可用仪或。要檢查設備是否支持ETC1格式确镊,請調(diào)用ETC1Util.isETC1Supported()方法。

注意:ETC1紋理壓縮格式不支持具有透明度(alpha通道)的紋理范删。如果您的應用程序需要具有透明度的紋理蕾域,則應調(diào)查目標設備上其他可用的紋理壓縮格式。

OpenGL ES 3.0 API 可用的一定支持ETC2/EAC紋理壓縮格式到旦。這種紋理格式提供出色的壓縮比和高視覺質(zhì)量束铭,格式還支持透明度(alpha通道)

除了ETC格式之外,Android設備還支持基于GPU芯片組和OpenGL實現(xiàn)的紋理壓縮厢绝。 您應該調(diào)查要定位的設備上的紋理壓縮支持契沫,以確定應用程序應支持的壓縮類型。 為了確定給定設備支持哪種紋理格式昔汉,您必須查詢設備并查看OpenGL擴展名懈万,該名稱用于標識設備支持的紋理壓縮格式(以及其他OpenGL功能)。 一些常用的紋理壓縮格式如下:

  • ATITC (ATC) - ATI紋理壓縮(ATITC或ATC)可在各種設備上使用靶病,并支持對帶有和不帶alpha通道的RGB紋理進行固定速率壓縮会通。該格式可以由幾個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),并且不太廣泛可用煤辨。 該格式支持具有4位alpha或8位alpha通道的RGB紋理裳涛。 這些格式由以下OpenGL擴展名表示:

    • GL_EXT_texture_compression_s3tc
      有些設備僅支持DXT1格式變化;此有限支持由以下OpenGL擴展名表示:
    • GL_EXT_texture_compression_dxt1
  • 3DC - 3DC紋理壓縮(3DC)是一種不太廣泛使用的格式,支持帶有Alpha通道的RGB紋理众辨。此格式由以下OpenGL擴展名表示:

    • GL_AMD_compressed_3DC_texture

警告:并非所有設備都支持這些紋理壓縮格式端三。對這些格式的支持因制造商和設備而異。有關(guān)如何確定特定設備上的紋理壓縮格式的信息鹃彻,請參閱下一節(jié)郊闯。

注意:確定應用程序支持的紋理壓縮格式后,請確保使用<supports-gl-texture>在清單中聲明它們蛛株。使用此聲明可以通過Google Play等外部服務進行過濾团赁,以便您的應用僅安裝在支持應用所需格式的設備上。有關(guān)詳細信息谨履,請參閱OpenGL清單聲明欢摄。

確定OpenGL擴展

在支持OpenGL ES API的擴展方面,OpenGL的實現(xiàn)因Android設備而異屉符。這些擴展包括紋理壓縮剧浸,但通常還包括OpenGL功能集的其他擴展锹引。

確定特定設備支持哪種紋理壓縮格式和其他OpenGL擴展:

  1. 在目標設備上運行以下代碼以確定支持的紋理壓縮格式:
var extensions = gl.glGetString(GL10.GL_EXTENSIONS)

警告:此調(diào)用的結(jié)果因設備型號而異矗钟!您必須在多個目標設備上運行此調(diào)用唆香,以確定通常支持的壓縮類型。

  1. 查看此方法的輸出以確定設備支持哪些OpenGL擴展吨艇。

Android擴展包(AEP)

AEP確保您的應用程序支持OpenGL 3.1規(guī)范中描述的核心集之上和之外的標準化OpenGL擴展集躬它。將這些擴展包裝在一起可以促進跨設備的一致功能集,同時允許開發(fā)人員充分利用最新的移動GPU設備东涡。
AEP還改進了片段著色器中對圖像冯吓、著色器存儲緩沖區(qū)和原子計數(shù)器的支持。
為了使您的應用能夠使用AEP疮跑,應用的清單必須聲明需要AEP组贺。此外,平臺版本必須支持它祖娘。
在清單中聲明AEP要求如下:

<uses feature android:name="android.hardware.opengles.aep"
              android:required="true" />

要驗證平臺版本是否支持AEP失尖,請使用hasSystemFeature(String)方法,并傳入FEATURE_OPENGLES_EXTENSION_PACK作為參數(shù)渐苏。以下代碼段顯示了如何執(zhí)行此操作的示例:

var deviceSupportsAEP: Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)

如果方法返回true掀潮,則支持AEP。
有關(guān)AEP的更多信息琼富,請訪問Khronos OpenGL ES Registry的頁面仪吧。

檢查OpenGL ES版本

Android設備上有幾個版本的OpenGL ES。您可以在清單中指定應用程序所需的API的最低版本鞠眉,但您可能還希望同時利用較新API中的功能薯鼠。例如,OpenGL ES 3.0 API向后兼容API的2.0版本械蹋,因此您可能希望編寫應用程序以使其使用OpenGL ES 3.0功能人断,但如果3.0 API不可用,則可以回退到2.0朝蜘。
在使用高于應用程序清單中所需最低版本的OpenGL ES功能之前恶迈,應用程序應檢查設備上可用API的版本。您可以通過以下兩種方式之一完成此操作:

  1. 嘗試創(chuàng)建更高級別的OpenGL ES上下文(EGLContext)并檢查結(jié)果谱醇。
  2. 創(chuàng)建最低支持的OpenGL ES上下文并檢查版本值暇仲。
    以下示例代碼演示了如何通過創(chuàng)建EGLContext并檢查結(jié)果來檢查可用的OpenGL ES版本。此示例顯示如何檢查OpenGL ES 3.0版本:
private const val EGL_CONTEXT_CLIENT_VERSION = 0x3098
private const val glVersion = 3.0
private class ContextFactory : GLSurfaceView.EGLContextFactory {

    override fun createContext(egl: EGL10, display: EGLDisplay, eglConfig: EGLConfig): EGLContext {

        Log.w(TAG, "creating OpenGL ES $glVersion context")
        return egl.eglCreateContext(
                display,
                eglConfig,
                EGL10.EGL_NO_CONTEXT,
                intArrayOf(EGL_CONTEXT_CLIENT_VERSION, glVersion.toInt(), EGL10.EGL_NONE)
        ) // returns null if 3.0 is not supported
    }
}

如果上面顯示的createContext()方法返回null副渴,那么您的代碼應該創(chuàng)建一個OpenGL ES 2.0上下文奈附,然后僅使用該API。

以下代碼示例演示如何通過首先創(chuàng)建最小支持的上下文煮剧,然后檢查版本字符串來檢查OpenGL ES版本:

// Create a minimum supported OpenGL ES context, then check:
gl.glGetString(GL10.GL_VERSION).also {
    Log.w(TAG, "Version: $it")
}
 // The version format is displayed as: "OpenGL ES <major>.<minor>"
 // followed by optional content provided by the implementation.

使用此方法斥滤,如果您發(fā)現(xiàn)設備支持更高級別的API版本将鸵,則必須銷毀最低OpenGL ES上下文并使用更高的可用API版本創(chuàng)建新上下文。

選擇OpenGL API版本

OpenGL ES 1.0 API版本(和1.1擴展)佑颇,版本2.0和版本3.0都提供高性能圖形界面顶掉,用于創(chuàng)建3D游戲,可視化和用戶界面挑胸。 OpenGL ES 2.0和3.0的圖形編程大致相似痒筒,版本3.0代表具有附加功能的2.0 API的超集。 OpenGL ES 1.0/1.1 API與OpenGL ES 2.0和3.0的編程有很大不同茬贵,因此在開始使用這些API進行開發(fā)之前簿透,開發(fā)人員應仔細考慮以下因素:

  • 性能 - 通常,OpenGL ES 2.0和3.0提供比ES 1.0/1.1 API更快的圖形性能解藻。但是老充,由于硬件制造商對OpenGL ES圖形管道的實現(xiàn)存在差異,性能差異可能因運行OpenGL應用程序的Android設備而異螟左。
  • 設備兼容性 - 開發(fā)人員應考慮客戶可用的設備類型啡浊,Android版本和OpenGL ES版本。有關(guān)跨設備的OpenGL兼容性的更多信息路狮,請參閱OpenGL版本和設備兼容性部分虫啥。
  • 編碼方便性 - OpenGL ES 1.0/1.1 API提供了固定的功能管道和便利功能,這些功能在OpenGL ES 2.0或3.0 API中不可用奄妨。不熟悉OpenGL ES的開發(fā)人員可以更快涂籽,更方便地找到1.0/1.1版的編碼。
  • 圖形控制 - OpenGL ES 2.0和3.0 API通過使用著色器提供完全可編程的管道砸抛,從而提供更高程度的控制评雌。通過更直接地控制圖形處理管道,開發(fā)人員可以創(chuàng)建使用1.0/1.1 API非常難以生成的效果直焙。
  • 紋理支持 - OpenGL ES 3.0 API對紋理壓縮具有最佳支持景东,因為它保證了ETC2壓縮格式的可用性,該格式支持透明度奔誓。 1.x和2.0 API實現(xiàn)通常包括對ETC1的支持斤吐,但是這種紋理格式不支持透明度,因此您通常必須提供您所定位的設備支持的其他壓縮格式的資源厨喂。 有關(guān)更多信息和措,請參閱紋理壓縮支持。

雖然性能蜕煌,兼容性派阱,便利性,控制和其他因素可能會影響您的決策斜纪,但您應該根據(jù)您認為為用戶提供的最佳體驗選擇OpenGL API版本贫母。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末文兑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腺劣,更是在濱河造成了極大的恐慌绿贞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誓酒,死亡現(xiàn)場離奇詭異樟蠕,居然都是意外死亡贮聂,警方通過查閱死者的電腦和手機靠柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吓懈,“玉大人歼冰,你說我怎么就攤上這事〕芫” “怎么了隔嫡?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甘穿。 經(jīng)常有香客問我腮恩,道長,這世上最難降的妖魔是什么温兼? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任秸滴,我火速辦了婚禮,結(jié)果婚禮上募判,老公的妹妹穿的比我還像新娘荡含。我一直安慰自己,他們只是感情好届垫,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布释液。 她就那樣靜靜地躺著,像睡著了一般装处。 火紅的嫁衣襯著肌膚如雪误债。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天妄迁,我揣著相機與錄音寝蹈,去河邊找鬼。 笑死判族,一個胖子當著我的面吹牛躺盛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形帮,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼槽惫,長吁一口氣:“原來是場噩夢啊……” “哼周叮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起界斜,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤仿耽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后各薇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项贺,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年峭判,在試婚紗的時候發(fā)現(xiàn)自己被綠了开缎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡林螃,死狀恐怖奕删,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疗认,我是刑警寧澤完残,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站横漏,受9級特大地震影響谨设,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缎浇,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一扎拣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧华畏,春花似錦鹏秋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仑乌,卻和暖如春百拓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晰甚。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工衙传, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厕九。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓蓖捶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扁远。 傳聞我的和親對象是個殘疾皇子俊鱼,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容