详解 Android GLSurfaceView 与 Renderer:开启你的 OpenGL ES 之旅

一、 为什么要学习 OpenGL ES?

1.简单介绍 OpenGL ES 是什么?

  • 它是一个图形库的 规范 ,而不是一个具体的库。它定义了一套跨平台的 API,让开发者可以直接与 GPU 对话,从而实现高性能的 2D 和 3D 图形渲染。

2.它与 Android 传统 Canvas 的区别?

  • CPU vs GPU: Canvas API 主要在 CPU 上进行绘制操作(虽然有硬件加速),而 OpenGL ES 是完全为 GPU 设计的,能最大化利用硬件的并行处理能力。
  • 2D vs 3D: Canvas 是一个 2D 图形库,而 OpenGL ES 天生就是为了 3D 世界而生。

3.应用场景

  • 游戏开发、AR/VR、视频/图像处理(抖音滤镜、美颜、视频编辑软件特效)、复杂的数据可视化图表等。

二、 核心概念

在正式编码前,我们必须认识两位新朋友:GLSurfaceView 和 GLSurfaceView.Renderer。

GLSurfaceView

GLSurfaceView 是 Android 系统专门为 OpenGL ES 渲染提供的特殊视图控件,帮开发者处理好了 OpenGL ES 与 Android 视图系统间的所有协调工作。并且拥有自己独立的渲染线程,不会阻塞 Android 的主线程。

1.关键组件

  1. GLThread - 专用渲染线程
  2. EGLContext - OpenGL上下文
  3. Render - 用于实现渲染逻辑
  4. Surface - 实际绘制的画布

2.工作流程

  1. 创建 EGL 显示连接
  2. 初始化 EGL 上下文
  3. 创建 EGL 表面(Surface)
  4. 绑定到 OpenGL ES
  5. 启动渲染循环

GLSurfaceView.Render

Render是实际完成渲染逻辑的地方,主要是告诉OpenGL 画什么 以及怎么画。 必须实现的三个关键方法(这个3个方法都运行在GL线程上):

  1. onSurfaceCreated(): 这个方法在EGL上下文和渲染表面(Surface)成功创建后会被调用,而且只被调用一次。
  2. onSurfaceChanged(width, height):这个方法在当屏幕旋转或尺寸变化时会被调用。而且至少被调用一次,通常在这里设置视口(viewport)。
  3. onDrawFrame():这个方法在每一帧到来时会被调用,这是核心的绘图方法,系统会以一定的频率反复调用它。我们所有的绘制指令都写在这里。

三、 动手实践:创建第一个 OpenGL ES项目

第一步先创建MyGLSurfaceView:

kotlin 复制代码
class MyGlSurfaceView(context: Context?, attrs: AttributeSet?) : GLSurfaceView(context, attrs),GLSurfaceView.Renderer {

    init {
        setEGLContextClientVersion(2)
        setRenderer(this) 
        renderMode = RENDERMODE_WHEN_DIRTY
    }

  
    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES20.glClearColor(1.0f, 0f, 0f, 1f)
    }

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

 
    override fun onDrawFrame(gl: GL10?) {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) 
    }
}

第二步设置到xml文件中

ini 复制代码
<com.jack.audiovideoandroid.opengl.MyGlSurfaceView
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

解释上面代码:

setEGLContextClientVersion(2):设置OpenGL版本。

setRenderer(this):设置Render回调。

renderMode = RENDERMODE_WHEN_DIRTY:设置渲染模式,这里设置的是按需渲染。

GLES20.glViewport(0, 0, width, height):告诉 OpenGL 渲染区域的大小。

GLES20.glClearColor(1.0f, 0f, 0f, 1f):设置清屏颜色为红色。

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) :清除颜色缓冲区,把 onSurfaceCreated 设置的颜色画上去。

运行以上代码,便可以在手机上看到一个全屏的红色窗口。

以上完整代码以及详细解释都在下面这个链接里:github.com/zhaohaiyiti...

到这里我们便完成了第一个简单的OpenGL项目。

在下一篇文章中,我们将踏出更重要的一步:学习着色器(Shader)和顶点数据,亲手在屏幕上绘制出第一个二维图形------三角形! 敬请期待!"

相关推荐
feiyangqingyun16 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
用户20187928316721 小时前
ANR之RenderThread不可中断睡眠state=D
android
煤球王子21 小时前
简单学:Android14中的Bluetooth—PBAP下载
android
小趴菜822721 小时前
安卓接入Max广告源
android
齊家治國平天下21 小时前
Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
android·anr
ZHANG13HAO21 小时前
Android 13.0 Framework 实现应用通知使用权默认开启的技术指南
android
【ql君】qlexcel21 小时前
Android 安卓RIL介绍
android·安卓·ril
写点啥呢21 小时前
android12解决非CarProperty接口深色模式设置后开机无法保持
android·车机·aosp·深色模式·座舱
IT酷盖21 小时前
Android解决隐藏依赖冲突
android·前端·vue.js
努力学习的小廉1 天前
初识MYSQL —— 数据库基础
android·数据库·mysql