传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229

传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/leverage_1229

传送门☞GoF23种设计模式☞转载请注明☞http://blog.csdn.net/leverage_1229

为了能够在Android应用程序中使用OpenGL ES绘制图形,你必须创建一个视图作为容器。而更直接的做法是从GLSurfaceView和 GLSurfaceView.Renderer各派生一个实现类。GLSurfaceView作为使用OpenGL绘制的容器,GLSurfaceView.Renderer将用于控制绘图的动作。对这些类的更多信息,请参阅OpenGL ES开发人员指南。

使用GLSurfaceView几乎是整合OpenGL ES到你的应用中的唯一方式。对于一个需要全屏或近乎屏幕图形视图,它是一个合理的选择。如果开发人员只是期望借助OpenGL ES在某个布局中一小部分绘图,则应该考虑使用TextureView。如果觉得自己是“大牛”,完全可以使用SurfaceView建立一个OpenGL ES视图,但这样做需要编写相当多的额外的代码。
这一节将介绍如何在一个简单应用的activity中完成一个最小的GLSurfaceView和GLSurfaceView.Renderer的实现。
一、在Manifest文件中声明使用OpenGL ES
为了能够使用OpenGL ES 2.0 API,你必须在manifest文件中添加以下声明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

如果你的应用需要使用纹理压缩功能,还要声明设备需要支持什么样的压缩格式:

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。
二、为OpenGL ES图形创建一个Activity
这个Activity跟任何其他的应用程序中的Activity一样,也有一个用户界面。唯一的区别是在它的布局文件中存放的视图不是TextView、Button和ListView,而是一个GLSurfaceView。
下面的代码演示了使用GLSurfaceView作为主视图的Acitivity的核心代码:

public class OpenGLES20 extends Activity {private GLSurfaceView mGLView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentViewmGLView = new MyGLSurfaceView(this);setContentView(mGLView);}
}

注:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以请确保你的Android项目的运行目标的API等级不低于8或更高。
三、构造一个GLSurfaceView对象
事实上GLSurfaceView并没有提供很多功能,实际上绘制对象的任务都在GLSurfaceView.Renderer中进行。所以GLSurfaceView中代码也非常少,甚至可以直接使用GLSurfaceView。但最好别这样做,因为你需要扩展这个类来响应触摸事件。
通常在当前Activity中以内部类的方式创建GLSurfaceView,这样实现起来非常快,核心代码如下:

class MyGLSurfaceView extends GLSurfaceView {public MyGLSurfaceView(Context context){super(context);// 设置渲染对象,用于控制在GLSurfaceView中的绘制工作setRenderer(new MyRenderer());}
}

当使用OpenGL ES 2.0时,你必须在GLSurfaceView构造器中调用另外一个方法,它指定了你将要使用2.0版的API:

// 创建一个OpenGL ES 2.0 context
setEGLContextClientVersion(2);

注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明。有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。
另一个可以添加到你的GLSurfaceView中可选操作是设置渲染模式为仅当绘制数据发生改变时才绘制view。该渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。

// 只有在绘制数据改变时才绘制view
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

该设置可以防止GLSurfaceView帧重绘,直到调用requestRender()方法。这样的绘制机制更高效。
四、构造一个Renderer类
Renderer类负责控制在GLSurfaceView中绘制任务,并提供三个回调方法供Android系统调用,用来计算在GLSurfaceView中绘制什么以及如何绘制。
1.onSurfaceCreated():仅调用一次,用于设置view的OpenGL ES环境。
2.onDrawFrame():每次重绘view时调用。
3.onSurfaceChanged():当view的几何形状发生变化时调用,比如设备从竖屏变为横屏。
下面是一个OpenGL ES renderer的最基本的实现,仅在GLSurfaceView上画了一个灰色的背景:

public class MyGL20Renderer implements GLSurfaceView.Renderer {public void onSurfaceCreated(GL10 unused, EGLConfig config) {// 设置背景色GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);}public void onDrawFrame(GL10 unused) {// 重绘背景色GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);}public void onSurfaceChanged(GL10 unused, int width, int height) {GLES20.glViewport(0, 0, width, height);}
}

以上就是所有要做的东西!上面的代码示例创建了一个简单的Android应用,它使用OpenGL显示了一个灰色的屏幕。虽然这段代码并没有做什么有趣的事情,但是通过创建这些类,已经为你使用OpenGL绘制图形奠定了基础。
注:当你使用OpengGLES 2.0 API时,可以不用去明白这些方法们为什么都有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。
如果你对OpenGL ES API很熟悉,你现在应该能够在应用程序中建立一个OpenGL ES环境并开始绘制图形了。然而,如果你想要学习更多的相关知识,那么就请继续关注下一节吧。

使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境相关推荐

  1. 使用Android OpenGL ES 2.0绘图之三:绘制形状

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 在定义好待绘制的形状之后,就要开始绘制它们了.使用OpenGL ES 2.0绘制形状可 ...

  2. 从0到1搭建一个自己的cli脚手架

    从0到1搭建一个自己的脚手架 源码地址 什么是脚手架 顾名思义,脚手架就是帮助我们配置一些环境.工具,能够让我们方便的直接开始开发,专注于我们的业务,不用花时间去配置开发环境.例如常见的vue-cli ...

  3. 如何从0到1搭建一个个人网站

    前言 如何从0到1搭建一个可以外网访问的项目? 我就用自己的服务器给大家举例,怎么从0到1搭建一个学生和新手可以用来面试的项目,老手也可以回忆一下自己逝去的青春. 服务器在激活的时候会让你选系统,这个 ...

  4. 从0到1搭建一个个人网站超详细教程

    前言 如何从0到1搭建一个可以外网访问的项目? 我就用自己的服务器给大家举例,怎么从0到1搭建一个学生和新手可以用来面试的项目,老手也可以回忆一下自己逝去的青春. 服务器在激活的时候会让你选系统,这个 ...

  5. 从0开始如何搭建一个网络游戏-超级详细文档

    2019独角兽企业重金招聘Python工程师标准>>> 下面介绍从0开始如何搭建一个网络游戏的全过程,希望帮到有需要的人. 搭建的过程会有遇到很多问题,我也在搭建的过程中把遇到的问题 ...

  6. 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  7. 使用Android OpenGL ES 2.0绘图之二:定义形状

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  8. OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

    上节回顾 上一节学习了如何从一张原始图片中,获取生成纹理所需要的信息,然后根据这些信息,通过OpenGL ES API在GPU内存中生成了一张纹理,并且还介绍了纹理属性,知道了如何通过纹理坐标将纹理映 ...

  9. OPENGL ES 2.0 知识串讲 (8) ——OPENGL ES 详解II(传入绘制信息)

    上节回顾 上一节讲述了如何通过 OpenGL ES 给 GPU 关联一套可以使用的 shader,这 一套 shader 是被放在一个 program 中当作一个整体供 GPU 使用的.那么 GPU ...

最新文章

  1. [NIO-1]缓冲区
  2. iview admin npm install报错_聊聊NPM镜像那些险象环生的坑
  3. python 实现倒排索引,建立简单的搜索引擎
  4. VOFM例程开发实现定价增强
  5. BI Content、Metadata Repository
  6. QT的QTreeWidgetItem类的使用
  7. Serverless对研发效能的变革和创新
  8. 【Java】Eclipse输入命令行参数的方法
  9. hdu 1025 Constructing Roads In JGShining's Kingdom
  10. 不花钱、不买服务器可以搭建个人博客吗?快进来,给你安排!
  11. client mysql 逗号_Mysql-Client编码问题
  12. 路由器 android 打印机,谷歌关闭云打印服务,安卓和Chrome办公用户要慌了
  13. ubuntu之修改登陆密码
  14. pyspark对应的scala代码PythonRDD对象
  15. 2022年2月份谷哥学术资源分享下载列表 20/20
  16. 计算机英语听力速记...,2019计算机考研英语听力速记技巧才是王道
  17. PhpSpreadsheet VS Box\Spout读取excel性能对比
  18. 微信小程序使用Echarts 实现世界地图(其它地图同理)
  19. Vue回炉重造之封装防刷新考试倒计时组件
  20. 什么是反向 DNS?使用场景是什么?如何反向DNS查找,怎样配置?

热门文章

  1. 计算机一级考试系统改革,以等级考试为导向的大学计算机改革
  2. php判断get和post请求,PHP:6种GET和POST请求发送方法
  3. Some thoughts on dfs
  4. python实践项目(十一)
  5. java21天打卡day20-集合
  6. 7年,我从功能测试到测试开发,写给即将进入或者正在做测试的你...
  7. deletefile失败 代码5怎么办_Go语言高级窍门与技巧,看完你也能写出高质量代码...
  8. python3.3psutil模块安装_详解Python3.6安装psutil模块和功能简介
  9. MySQL大表关联如何优化_MySQL 对于大表(千万级),要怎么优化呢?
  10. Linux系统mongdb还原数据库,MongoDB备份与恢复