Android EGL 实践
本项目为
SurfaceView
和TextureView
封装了 EGL 环境管理以及 Render 线程,可以和GLSurfaceView
一样使用 OpenGLES 进行渲染。并尝试使用 OpenGLES 绘制了一个三角形验证正确性。
GitHub:https://github.com/carverZhong/AndroidEGL.
一、EGL 原理
EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用如下:
- 与设备的原生窗口系统通信。
- 查询绘图表面的可用类型和配置。
- 创建绘图表面。
- 在OpenGL ES 和其他图形渲染API之间同步渲染。
- 管理纹理贴图等渲染资源。
EGL 的架构图如下:
Display 是对实际显示设备的抽象。代码中对应
EGLDisplay
。Surface 是对用来存储图像的内存区域 FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。代码中对应
EGLSurface
。Context存储 OpenGL ES 绘图的一些状态信息。代码中对应
EGLContext
。
二、EGL 实践
1.EGL 环境创建
EGL 环境创建主要是操作 EGLDisplay
、EGLSurface
和 EGLContext
。一般步骤如下:
使用
eglGetDisplay(EGL_DEFAULT_DISPLAY)
获取 EGLDisplay,并调用eglInitialize
方法执行初始化,建立起与本地窗口系统的连接。调用
eglChooseConfig
方法,确定渲染表面的配置信息。创建
EGLContext
:eglCreateContext
。使用
ANativeWindow
创建EGLSurface
。绑定上下文:
eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_)
交换缓冲:
eglSwapBuffers(eglDisplay_, eglSurface_)
,执行后即可看到渲染的内容。退出时需要释放EGL环境。
2.代码实现
实现思路:在Java层封装了NativeRenderer
类,用于处理与Native层的交互以及兼容SurfaceView
和TextureView
,并使用了一个HandlerThread
来做渲染线程。借助Choreographer
将每帧的回调传递到了Native,实现类似于View.onDraw
方法。
从SurfaceView
和TextureView
获取的 Surface 非常重要,从 Surface 获取 ANativeWindow
才能完成这两个 View 与 EGL 环境的绑定。具体参考:EGLSurface 和 OpenGL ES。
EGLHelper
参考了 GLSurfaceView.EglHelper
的实现,完成了 EGL 环境创建。
参考文档:OpenGL ES 共享上下文实现多线程渲染 - 掘金。
最新文章
- iOS新手引导页的实现,源码。
- word-spacing汉字不起作用的解决方法
- 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。
- DevExtreme 学习应用[2]
- 找出数组中从未出现的最小正整数java实现
- 第一个Sprint冲刺第三天
- nova分析(9)—— nova-novncproxy
- iOS学习之UIControl
- [POJ] 1274 The Perfect Stall(二分图最大匹配)
- Grub禁用UUID
- SpringMVC中文件的上传(上传到服务器)和下载问题(一)
- hadoop 2.x 简单实现wordCount
- 教你在浏览器里做出EXCEL的效果
- Project Euler 75: Singular integer right triangles
- 步步为营103-ZTree 二级联动
- svn图标的含义
- bootstrap添加遮罩层loadingmask
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
- Ng第九课:神经网络的学习(Neural Networks: Learning)
- Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 问题分析
热门文章
- java的访问权限protected和default
- linux常见命令chgrp/chown/chmod
- LyScript 获取上一条与下一条指令
- 15分钟搭建RocketMQ源码调试环境
- Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)
- Linux使用netstat查看网络状态
- 年度开源盛会 ApacheCon 首发中文盛宴来临,欢迎报名!
- GoogleTest环境配置以及应用
- Redis 哨兵机制
- OpenCV CMake VSCode Windows 平台下运行配置及其解决方案