
声明博主已经一年多没有更新新代码了回归后将创建OpenGL专栏前端时间基本搭建完了一个分享创作类软件后续也会把整个项目放出来希望大家一起学习成长~一、Activity文件MainActivity package com.example.opengl import android.app.ActivityManager import android.content.Context import android.content.pm.ConfigurationInfo import android.opengl.GLSurfaceView import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.Menu import renderer.FirstOpenGLProjectRenderer import tool.DialogUtils class MainActivity : AppCompatActivity() { // 添加一个GLSurfaceView实例 -- 初始化OpenGL private lateinit var glSurfaceView: GLSurfaceView // 记住GLSurfaceView是否处于有效状态 private var rendererSet:Boolean false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化glSurfaceView glSurfaceView GLSurfaceView(this) /** 检查系统是否实际支持OpenGL ES 2.0 **/ // 一 Android ActivityManager的一个引用 -- 用它获取设备配置信息 val activityManager:ActivityManager getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager // 二 取出reqGlEsVersion变量检查OpenGL ES 版本号 -- 版本号为0x20000或后续版本 就可以使用OpenGL ES 2.0的API val configurationInfo:ConfigurationInfo activityManager.deviceConfigurationInfo val supportsEs2:Boolean configurationInfo.reqGlEsVersion 0x20000 /** 为OpenGL ES 2.0配置渲染表面 **/ if (supportsEs2) { val dialogUtil DialogUtils(this, this) dialogUtil.showSelfTipDialog(结果提示弹窗, This device supports OpenGL ES 2.0.) // 请求一个OpenGL ES 2.O 兼容的上下文 -- 配置surface视图 glSurfaceView.setEGLContextClientVersion(2) // 分配我们的渲染器 -- 传进自定义Renderer类的一个新实例 glSurfaceView.setRenderer(FirstOpenGLProjectRenderer()) // 记住渲染器renderer已经设置过了 rendererSet true }else{ val dialogUtil DialogUtils(this, this) dialogUtil.showSelfTipDialog(结果提示弹窗, This device does not support OpenGL ES 2.0.) return } /** 添加另外一个调用把GLSurfaceView加入到这个activity中并把它显示到屏幕上 替换旧的调用 setContentView(R.layout.activity_main) **/ setContentView(glSurfaceView) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { return super.onCreateOptionsMenu(menu) } /** 处理Android Activity生命周期的事件 -- 否则如果用户切换到另外一个应用应用就会崩溃 有了他们这个surface视图才能正确暂停并继续后台渲染线程同时释放和续用OpenGL上下文 * **/ override fun onPause() { super.onPause() if (rendererSet){ glSurfaceView.onPause() } } override fun onResume() { super.onResume() if (rendererSet){ glSurfaceView.onResume() } } }二、渲染器类文件FirstOpenGLProjectRendererpackage renderer import android.opengl.GLES20.* import android.opengl.GLSurfaceView import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 class FirstOpenGLProjectRenderer: GLSurfaceView.Renderer { override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) { /** 设置清空屏幕用的颜色 * 前三个参数分别对应红色、绿色和蓝色 * 最后一个参数对应一个特殊的分量 -- 阿尔法alpha用来表示半透明度或透明度 * 通过把第一个分量设为1其余设为0我们把红色设置为最大强度当屏幕被清空时它就会显示红色 * **/ glClearColor(1.0f,0.0f,0.0f,0.0f) } override fun onSurfaceChanged(p0: GL10?, width: Int, height: Int) { /** 设置OpenGL视图填充整个屏幕 * 设置视口尺寸告诉OpenGL可以用来渲染的surface的大小 * **/ glViewport(0,0,width,height) } override fun onDrawFrame(p0: GL10?) { /** 清除渲染屏幕 * 擦除屏幕上的所有颜色并用之前glClearColor()调用定义的颜色填充整个屏幕 * **/ glClear(GL_COLOR_BUFFER_BIT) } }三、运行结果