详解 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)和顶点数据,亲手在屏幕上绘制出第一个二维图形------三角形! 敬请期待!"

相关推荐
游戏开发爱好者81 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥1 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓2 小时前
[JDBC]元数据
android
独行soc2 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能2 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿2 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc2 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106323 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview