1.OpenGL 和OpenGL ES
OpenGL(Open Graphics Library)是一種用於渲染2D和3D圖形的跨平臺程式設計介面。OpenGL提供了一套標準的函數和介面,使開發人員能夠在各種作業系統上建立高效能的圖形應用程式,這些作業系統包括Windows、Linux、macOS和一些嵌入式系統。OpenGL ES(OpenGL for Embedded Systems)是OpenGL的嵌入式系統版本,專門設計用於移動裝置、嵌入式系統和其他資源受限的環境。與標準的OpenGL相比,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是一個介面,代表渲染器,影象的繪製就是由它控制的,它裡面有三個方法需要實現: