Android OpenGL ES入門

2023-12-05 21:00:48

1.OpenGL 和OpenGL ES

  OpenGL(Open Graphics Library)是一種用於渲染2D和3D圖形的跨平臺程式設計介面。OpenGL提供了一套標準的函數和介面,使開發人員能夠在各種作業系統上建立高效能的圖形應用程式,這些作業系統包括Windows、Linux、macOS和一些嵌入式系統。OpenGL ES(OpenGL for Embedded Systems)是OpenGL的嵌入式系統版本,專門設計用於移動裝置、嵌入式系統和其他資源受限的環境。與標準的OpenGL相比,OpenGL ES經過精簡和優化,以適應移動裝置和嵌入式系統的硬體和效能要求。

  它的應用場景如下:

  1. 遊戲開發:移動遊戲通常需要高效能的圖形渲染,以呈現複雜的場景、光影效果和3D模型。OpenGL ES是移動遊戲開發的主要工具之一,許多流行的移動遊戲都使用它來實現圖形渲染。
  2. 圖形化使用者介面GUI:移動應用程式的使用者介面通常包含複雜的圖形元素,如按鈕、滾軸、圖示等。OpenGL ES可用於建立流暢、響應迅速的使用者介面,同時提供各種視覺效果。
  3. 地圖和導航應用:在需要呈現複雜地圖、導航路徑和地理資訊的應用中,OpenGL ES可以用於實現高效能的地圖渲染。
  4. 娛樂和多媒體應用:通過OpenGL ES,開發者可以建立高質量的娛樂和多媒體應用,包括影象和視訊編輯應用,藝術創作工具等。

2.第一個OpenGL ES應用程式

  這個應用程式的功能非常簡單,它要做的是初始化OpenGL並不停地清空螢幕。初始化OpenGL使用的類是GLSurfaceView,它可以處理OpenGL初始化過程中比較基本的操作,如設定顯示裝置,在後臺執行緒中渲染,渲染是在顯示裝置中一個稱為surface的特定區域完成的。在使用GLSurfaceView的時候,我們要處理好Activity生命週期事件,在Activity暫停的時候要釋放資源,在Activity恢復的時候要重新恢復資源。

  完整的程式碼如下:

package com.example.opengles20

import android.app.ActivityManager
import android.content.Context
import android.opengl.GLSurfaceView
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    private lateinit var glSurfaceView: GLSurfaceView
    var rendererSet=false
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        glSurfaceView= GLSurfaceView(this)
     //檢查裝置是否支援OpenGL ES 2.0 val activityManager
=getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager val configurationInfo=activityManager?.deviceConfigurationInfo val support:Boolean= configurationInfo?.reqGlEsVersion!! >= 0x20000 if(support){//設定渲染表面 glSurfaceView.setEGLContextClientVersion(2) glSurfaceView.setRenderer(MyRenderer()) rendererSet=true } else{ Toast.makeText(this,"這臺裝置不支援OpenGL ES 2.0",Toast.LENGTH_SHORT).show() return } setContentView(glSurfaceView) } override fun onPause() { super.onPause() if(rendererSet){ glSurfaceView.onPause() } } override fun onResume() { super.onResume() if(rendererSet){ glSurfaceView.onResume() } } }
package com.example.opengles20


import android.opengl.GLES20.*
import android.opengl.GLSurfaceView.Renderer
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class MyRenderer:Renderer {
    override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) {
        glClearColor(0.0F,1.0F,0.0F,0.0F)//設定清除所使用的顏色,引數分別代表紅綠藍和透明度
    }

    override fun onSurfaceChanged(p0: GL10?, width: Int, height: Int) {
        glViewport(0,0,width,height)
     //是一個用於設定視口的函數,視口定義了在螢幕上渲染圖形的區域。這個函數通常用於在渲染過程中指定繪圖區域的大小和位置
     //前兩個引數x,y表示視口左下角在螢幕的位置
} override fun onDrawFrame(p0: GL10
?) { glClear(GL_COLOR_BUFFER_BIT)//清除幀緩衝區內容,和glClearColor一起使用 } }

  Renderer是一個介面,代表渲染器,影象的繪製就是由它控制的,它裡面有三個方法需要實現:

  1. onSurfaceCreated:當surface被建立的時候,GLSurfaceView會呼叫這個方法,這發生在應用程式第一次執行的時候,並且當裝置被喚醒或者使用者從其他Activity返回的時候也可能被呼叫,也就是說該方法可能被多次呼叫
  2. onsurfaceChanged:每次surface尺寸發生變化的時候,這個方法會被GLSurfaceView呼叫,橫豎屏切換的時候尺寸會發生變化
  3. onDrawFrame:當繪製一幀時,這個方法會被GLSurfaceView呼叫,在這個方法中,我們一定要繪製一些東西,因為這個方法返回時,渲染緩衝區會被交換並顯示在螢幕上,如果什麼都沒有畫,會看到糟糕的閃爍效果