本文目录

一. OpenGL ES是什么?

二. OpenGL ES的版本

三. EGL是什么?

四. 需要知道的两个方法

五. 在Android中使用OpenGL ES的步骤

六. 例子1:简单的程序+修改背景颜色

OpenGL ES是什么?

OpenGL(Open Graphics Library): 是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),使简单的图形构建出复杂的三维景象。

OpenGL ES(OpenGl for Embedded System):是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,简单来说就是OpenGL在移动端的阉割版。

9c940f333081

image.png

OpenGL ES 的版本

OpenGL ES版本

Android版本

描述

OpenGL ES1.0

Android 1.0+

OpenGL ES 1.x是针对固定硬件管线(Fixed Pipeline)的,通过它内建的functions来设置诸如灯光、vertexes(图形的顶点数)、颜色和camera。

OpenGL ES2.0

Android 2.2(API 8)+

OpenGL ES 2.x是针对可编程硬件管线(Programmable Pipeline)的,不兼容OpenGL ES 1.x,需要自己动手编写任何功能。2.0相比于1.0更具灵活性,功能也更强大。可以自定义顶点和像素计算,可以让表现方式更加准确。

OpenGL ES3.0

Android 4.3(API 18)+

向下兼容OpenGL ES 2.x,是OpenGL ES2.0的扩展,支持许多新的渲染技术、优化和显示质量改进,包括引入了纹理相关的新功能,对着色语言进行了重大更新和支持着色器新功能的API特性,引入了与几何形状规范和图元渲染控制相关的新功能,引入了新的缓冲区对象,增添了许多与屏幕外渲染到帧缓冲区对象相关的新功能。

OpenGL ES3.x

Android 5.0 (API 21)+

向下兼容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支持这个API规范。

EGL是什么?

EGL (Embedded Graphics Library):EGL 是连接 OpenGL ES 和本地窗口系统的接口,由于OpenGL ES是跨平台的,引入EGL就是为了屏蔽不同平台上的区别。

另外,EGL定义了控制 Displays、Contexts 以及 Surfaces 的统一的平台接口,但一般情况在 Android 平台上开发 OpenGL ES 应用,无需直接使用javax.microedition.khronos.egl 包中的类按照EGL步骤来使用OpenGL ES绘制图形,因为在Android平台中提供了一个android.opengl 包,GLSurfaceView类提供了对Display、Surface 和 Context 的管理,大大简化了 OpenGL ES 的程序框架,对应大部分 OpenGL ES开发,只需调用一个方法来设置 OpenGLView 需要的GLSurfaceView.Renderer 即可。

9c940f333081

EGL

EGL提供如下机制:

与设备的原生窗口系统通信

查询绘图表面的可用类型和配置

创建绘图表面

在OpenGL ES 和其他图形渲染API之间同步渲染

管理纹理贴图等渲染资源

为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。

需要知道的两个方法

GLSurfaceView:渲染表面类(android.opengl.GLSurfaceView),自动负责管理EGL执行步骤,但用户需要确定针对渲染表面 OpenGL ES 的版本,即调用 setEGLContextClientVersion(int version) 方法。随后调用 setRenderer() 方法来为OpenGLES配置渲染表面。此外还有其他的 setEGL* 方法去配置上下文环境,例如渲染表面的 RGB 颜色分量的位深。

GLSurfaceView.Renderer:渲染器类(android.opengl.GLSurfaceView.Renderer),GLSurfaceView 需要通过渲染器对象完成实际的渲染操作,自定义渲染器对象需要继承 Renderer 接口类,并实现三个方法:onSurfaceCreated()、onSurfaceChanged()和onDrawFrame()。

在Android中使用OpenGL ES的步骤:

创建GLSurfaceView组件,使用 Activity 来显示 GLSurfaceView 组件。

为 GLSurfaceView 配置渲染类GLSurfaceView.Renderer,实现GLSurfaceView.Renderer接口并重写3个方法。

onSurfaceCreated():当Surface被第一次创建或从其他Activity切换回来都会调用此方法,方法中还可以初始化OpenGLES图形(背景色)。

onSurfaceChanged():在Surface被创建后,每次Surface尺寸变化,还有屏幕横竖切换都会调用此方法。

onDrawFrame():每绘制一帧都会调用此方法,在这个方法中必须绘制点什么,即使只是清空屏幕。因为如果什么都没画,会导致屏幕不断闪烁。重点:此方法是绘制图形的主要执行点。

调用GLSurfaceView组件的setRenderer()方法指定Renderer对象,该Renderer对象会完成GLSurfaceView里的3D图形的绘制。

例子1:简单的程序+修改背景颜色 OpenGLESVersion

创建GLSurfaceView实例,检查设备版本,Activity生命周期,配置上下文。

创建Renderer类,实现渲染方法。

效果展示。

1.创建GLSurfaceView实例

我们通过 GLSurfaceView 来初始化 OpenGLES,如配置显示设备 Display 以及在后台线程中渲染。在此之前,我们需要对设备的进行版本检查,以及在 Android Activity 生命周期的维护、渲染请求方式进行配置。最后才会配置这个 Surface 视图和传入自定义 Renderer 类。

public class VersionActivity extends AppCompatActivity {

private GLSurfaceView surfaceView;

private boolean rendererSet = false;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//检查OpenGl ES版本

final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();

//获取版本号

int VersionNum = configurationInfo.reqGlEsVersion;

//输出196608 16进制=0x30000 3.0版本

if (VersionNum >= 196608) {

Toast.makeText(this, "OpenGLES version is 3.0 or more", Toast.LENGTH_SHORT).show();

rendererSet = true;

//执行3.0版本的方法

}

//输出131072 16进制=0x20000 2.0版本

else if (VersionNum >= 131072 && VersionNum < 196608) {

Toast.makeText(this, "OpenGLES version is 2.0", Toast.LENGTH_SHORT).show();

rendererSet = true;

//执行2.0版本的方法, 配置ES 2.0的上下文

surfaceView = new GLSurfaceView(this);

//确定针对渲染表面 OpenGL ES 的版本

surfaceView.setEGLContextClientVersion(2);

//1.连续刷新频率不停渲染,0.按请求来渲染

surfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

surfaceView.setRenderer(new GLES20Renderer());

setContentView(surfaceView);

} else {

Toast.makeText(this, "Current devices do not support OpenGLES", Toast.LENGTH_SHORT).show();

return;

}

}

@Override

protected void onPause() {

super.onPause();

if (rendererSet) {

surfaceView.onPause();

}

}

@Override

protected void onResume() {

super.onResume();

if (rendererSet) {

surfaceView.onResume();

}

}

}

注意:渲染线程方式setRenderMode:

1.RENDERMODE_CONTINUOUSLY按设备刷新频率不断地渲染。

0.RENDERMODE_WHEN_DIRTY按请求方式来渲染。

2.创建Renderer类

在GLSurfaceView中传入了一个自定义Renderer类,那么Renderer是一个渲染器,他需要重写3个方法来实现渲染的整个过程。

public class GLES20Renderer implements GLSurfaceView.Renderer {

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

//第一次创建或切换回来都会调用此方法

GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1);

}

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

//每次Surface尺寸变化,比如屏幕横竖切换都会调用此方法

GLES20.glViewport(0, 0, width, height);

}

@Override

public void onDrawFrame(GL10 gl) {

//每绘制一帧都会调用此方法

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

}

}

onSurfaceCreated:其中的glClearColor是设置清空屏幕用的颜色,四个参数:红绿蓝透明,都是float类型,最大值为1,最小值为0。

onSurfaceChanged:其中的glViewport是设置视口的尺寸,告诉OpenGLES用来显示Surface的大小。

onDrawFrame:其中的glClear(GL_COLOR_BUFFER_BIT)表示清空屏幕,并会用glClearColor再次填充整个屏幕。

问:参数中的GL10是什么?

GL10是OpenGLES 1.0的API遗留下来的。但是要编写使用OpenGLES1.0的渲染器,就用这个参数。但是对于OpenGLES2.0就直接通过静态方法GLES20来直接获取。OpenGLES3.0也是直接使用GLES30。

3.结果

当运行这个Activity的时候,会看到屏幕渲染上了一层蓝色背景色,这也就是我们在onSurfaceCreated中设置的glClearColor方法。

9c940f333081

运行效果图

总结

这虽然是学习OpenGLES20的第一课,只学习了GLSurfaceView和Renderer渲染器,但有了整个程序的大体框架,是最接下来的学习有着大大的帮助。

参考文献

为什么要使用OpenGL ES

通常来说,计算机系统中 CPU、GPU 是协同工作的。CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。所以,尽可能让 CPU 和 GPU 各司其职发挥作用是提高渲染效率的关键。

正如我们之前提到过,OpenGL 正是给我们提供了访问 GPU 的能力,不仅如此,它还引入了缓存(Buffer)这个概念,大大提高了处理效率。

从一个内存区域复制到另一个内存区域的速度是相对较慢的,并且在内存复制的过程中,CPU 和 GPU 都不能处理这区域内存,避免引起错误。此外,CPU / GPU 执行计算的速度是很快的,而内存的访问是相对较慢的,这也导致处理器的性能处于次优状态,这种状态叫做 数据饥饿,简单来说就是空有一身本事却无用武之地。

针对此,OpenGL 为了提升渲染的性能,为两个内存区域间的数据交换定义了缓存。缓存是指 GPU 能够控制和管理的连续 RAM。程序从 CPU 的内存复制数据到 OpenGL ES 的缓存。通过独占缓存,GPU 能够尽可能以有效的方式读写内存。 这也意味着 GPU 使用缓存中的数据工作的同时,运行在 CPU 中的程序可以继续执行。

android opengl es 2.0 编程指南,Android OpenGL ES 2.0 初次体验相关推荐

  1. java opengl es_OPENGL ES 3.0编程指南

    OPENGL ES 3.0编程指南 OPENGL ES 3.0编程指南\.gitignore, 215, 2017-05-03 __MACOSX __MACOSX\OPENGL ES 3.0编程指南 ...

  2. 【WebGL编程指南】GLSL ES语法基础

    [WebGL之巅]20-GLSL ES着色器语言语法详解 查看原文:[WebGL之巅]20-GLSL ES着色器语言语法详解 对应<WebGL编程指南>第六章 GLSL ES 总览 本章知 ...

  3. 编译《OpenGL ES 3.0 编程指南》书中代码

    2019独角兽企业重金招聘Python工程师标准>>> 之前写过一篇 blog 刚开始编译时,没有编译过去.因而转向了 mingw32 .最近想起来就想再编译一次.于是写篇记录一下. ...

  4. MUSBMHDRC USB 2.0 编程指南解读4

    可选的DMA控制器 MUSBMHDRC 可以选择包含一个多通道 DMA 控制器,最多可配置 8 个通道. 此 DMA 控制器支持两种 DMA 模式,称为 DMA 模式 0 和 1,它可以处理最大 8k ...

  5. android ab 广告,秒针移动广告监测指南(Android版)

    Video类型曝光接口, 当APP中视频广告需要进行曝光监测时, 由APP在视频开始播放时调用该接口. 如传递adView则包含可见曝光监测功能,若不需监测可见曝光需传递"null" ...

  6. Java SE 6.0编程指南_Java SE 6.0 编程指南(附光盘)

    第一篇 起步篇 第1章 初识Java 第2章 基本数据类型--构建Java 大厦的基础 第3章 表达式--描述行为的元素 第4章 流程控制--Java世界的航行舵手 第5章 数组--以不变应万变的哲学 ...

  7. OpenGL ES 苹果编程指南 官方文档翻译01

    OpenGL ES Programming Guide for iOS 文章源地址(英文):https://developer.apple.com/library/ios/#documentation ...

  8. 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!

    导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 音视频的开发,往往是比较难的,而这个比较难 ...

  9. Android应用开发:网络编程-2

    网络编程 Java基础:网络编程 Uri.URL.UriMatcher.ContentUris详解 Android应用开发:网络编程1 Android应用开发:网络编程2 1. 使用HttpClien ...

最新文章

  1. spring-data-jpa Repository的基本知识
  2. openfire安装配置完全教程
  3. 【android】夜间模式简单实现
  4. 用java正则表达式验证字符串(邮箱与网址)
  5. Hash (散列,哈希)
  6. 会说话的代码——书写自表达代码之道
  7. 思科DHCP不同网段通信
  8. mysql(指RDS)验证pureftpd登录
  9. Multisim14丨工具栏图标突然消失丨相关问题
  10. 向日葵远程控制软件。
  11. 像京东等大厂为什么不通过减薪来代替裁员,降低成本?
  12. HDLBits 答案之Exams/ece241 2014 q7b
  13. 服务器显示器超分辨率,不花钱就能让显示器分辨率翻番?不试你就亏了!
  14. linux:shell命令之软硬链接
  15. Afnetworking访问遇到3840_错误
  16. 【网络时间同步】基于马尔科夫随机场最大后验估计和Gardner环的无线传感器网络时间同步算法matlab仿真
  17. Windows7中随意排列图标(自动排列,对齐到网络)
  18. Macsome iTunes Converter for Mac(DRM移除和音乐转换器)3.5.0
  19. 企业数字化转型之道:3L8P转型模型
  20. 关于前后端分离的概念,作用,优缺点

热门文章

  1. MIPS指令集的常用指令分类和相关解释
  2. 简单的手机记事本怎么把内容标记为完成状态?
  3. redis学习-主从-哨兵集群-redis-cluster简单日记
  4. BeaverWorks Summer Institute edX课程推荐
  5. 多线程编程技术开发资料
  6. win7无线连接提示“此计算机当前已连接限制为XXX”解决方法
  7. 传奇h5私服源码+教程
  8. python中if语句判断元素是否存在于列表中——if x: / if x is True: / if x == True: 的区别
  9. 【Linux】文件系统的inode是什么?软硬链接是什么?了解意义
  10. 大话AI技术辅助游戏NPC设计