【Android Developers Training】 62. 搭建一个OpenGL ES环境
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/graphics/opengl/environment.html
要在你的应用中使用OpenGL ES绘制图像,你必须为它们创建一个视图容器。一个比较直接的方法是同时实现一个GLSurfaceView和一个GLSurfaceView.Renderer。GLSurfaceView是那些用OpenGL所绘制的图形的视图容器,而GLSurfaceView.Renderer则用来控制在该视图中绘制的内容。关于这两个类的更多信息,你可以阅读:OpenGL ES开发手册。
使用GLSurfaceView只是一种将你的应用与OpenGL ES合并起来的方法。对于一个全屏的或者接近全屏的图形视图,使用它是一个理想的选择。开发者如果希望把OpenGL ES的图形融合在布局的一小部门里面,那么可以考虑使用TextureView。对于自己动手开发的开发者来说(DIY),还可以通过使用SurfaceView来搭建一个OpenGL ES视图,但这将需要编写更多的代码。
在这节课中,我们将解释如何在一个简单地应用activity中完成GLSurfaceView和GLSurfaceView.Renderer的最小实现。
一). 在配置文件中声明使用OpenGL ES
为了让你的应用能够使用OpenGL ES 2.0接口,你必须将下列声明添加到配置文件当中:
<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
使用OpenGL ES的安卓应用就像其它类型的应用有自己的用户接口一样,也拥有多个activity。主要的区别就在于acitivity布局上的不同。在许多应用中你可能会使用TextView,Button和ListView,在使用OpenGL ES的应用中,你也需要添加一个GLSurfaceView。
下面的代码展示了使用一个GLSurfaceView的最小化实现。它作为主视图:
public class OpenGLES20Activity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
Note:
OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本的系统,所以确保你的Android项目的API版本满足该要求。
三). 构建一个GLSurfaceView对象
一个GLSurfaceView是一个特定的视图,在视图中你可以绘制OpenGL ES图形。不过它自己所做的事情并不多。对于绘制对象的控制实际上是由你在该视图中配置的GLSurfaceView.Renderer所负责的。事实上,这个对象的代码非常简短,你可能会希望跳过继承它,并且只创建一个未经修改的GLSurfaceView实例,不过请不要这么做。你需要继承该类来捕捉触控事件,这方面知识在Responding to Touch Events(该系列课程的最后一节课)中会做进一步的介绍。
GLSurfaceView的核心代码是很小的,所以对于一个快速地实现,通常可以在acitvity中创建一个内部类并使用它:
class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context){
super(context);
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(new MyRenderer());
}
}
当使用OpenGL ES 2.0时,你必须对你的GLSurfaceView构造函数添加另一个调用,以此来指明你希望使用的是2.0版本的接口:
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
Note:
如果你在使用OpenGL ES 2.0版本的接口,确保在你的应用配置文件中也进行了相关声明。这在之前的章节中已经讨论过了。
另一个对于GLSurfaceView实现的可选选项,是将渲染模式设置为:GLSurfaceView.RENDERMODE_WHEN_DIRTY,其含义是:仅在你的绘画数据发生变化时才在视图中进行绘画操作:
// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
这一配置将防止GLSurfaceView框架被重新绘制,直到你调用了requestRender(),这将让应用的性能及效率得到提高。
四). 构建一个渲染类
GLSurfaceView.Renderer类的实现,或者说在一个应用中使用OpenGL ES来进行渲染,正是事情变得有趣的地方。该类会控制和其相关联的GLSurfaceView,决定在上面画什么。一共有三个渲染器的方法被Android系统调用,以此来明确要在GLSurfaceView上画什么以及如何画:
- onSurfaceCreated() - 调用一次,用来配置视图的OpenGL ES环境。
- onDrawFrame() - 每次重画视图时被调用。
- onSurfaceChanged() - 如果视图的几何形态发生变化时会被调用,例如当设备的屏幕方向发生改变时。
下面是一个非常基本的OpenGL ES渲染器的实现,作用仅仅是在GLSurfaceView中画一个灰色的背景:
public class MyGLRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
就仅仅是这样!上面的代码创建了一个简单地应用程序,它在使用OpenGL显示一个灰色的屏幕。虽然它的代码做的事情并不怎么有趣,但是通过创建这些类,你已经为使用OpenGL绘制图形有了基本的认识和铺垫。
Note:
你可能想知道为什么这些方法有一个GL10的参数,在你明明使用的是OpenGL ES 2.0的接口的时候。这是因为这些方法在2.0接口中被简单地重用了,以此来保持Android框架尽量简单。
如果你对OpenGL ES接口很熟悉,那么你现在就可以在你的应用中部署一个OpenGL ES的环境并绘制图形。然而, 如果你希望获取更多的帮助来学会使用OpenGL,那么请继续学习下一节课程获取更多的知识。
【Android Developers Training】 62. 搭建一个OpenGL ES环境的更多相关文章
- 【Android Developers Training】 61. 序言:使用OpenGL ES显示图像
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android 中建立一个OpenGL ES的开发环境
转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 1. 创建一个Android项目工程
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 105. 显示一个位置地址
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 96. 运行一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 95. 创建一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- window 远程在Linux(centOS7.0)上安装JDK以及配置环境变量
本人是在windows 7 上安装了虚拟机,虚拟机安装的是linux(centOS7.0)系统现在在Windows 上安装SecureCRT 远程虚拟机的linux系统,安装JDK以及配置环境变量. ...
- MyBatis_Generator插件的安装以及简单使用
MyBatis_Generator_1.3.1.zip 1 下载安装包 安装包名称:MyBatis_Generator_1.3.1.zip 2 在Eclipse上进行安装 l ...
- 探讨SQL Server并发处理存在就更新七种解决方案
前言 本节我们来讲讲并发中最常见的情况存在即更新,在并发中若未存在行记录则插入,此时未处理好极容易出现插入重复键情况,本文我们来介绍对并发中存在就更新行记录的七种方案并且我们来综合分析最合适的解决方案 ...
- linux新学篇
[学会使用快捷键] Ctrl + C:这个是用来终止当前命令的快捷键,当然你也可以输入一大串字符,不想让它运行直接Ctrl + C,光标就会跳入下一行. Tab: 这个键是最有用的键了,也是笔者敲击概 ...
- 自研框架wap.js实践
示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心 方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法. ...
- 运行容器的最佳实践 - 每天5分钟玩转 Docker 容器技术(24)
按用途容器大致可分为两类:服务类容器和工具类的容器. 1. 服务类容器以 daemon 的形式运行,对外提供服务.比如 web server,数据库等.通过 -d 以后台方式启动这类容器是非常合适的. ...
- 初入计算机图形学——BVH结构的实现
摘要: 本人水平有限,若有错误也请指正~ 光线追踪作为全局光照解决方案的一个重要思想,其与场景大量三角形的求交效率高低直接影响最终算法的速度,典型的一些渲染器都采用二叉树来将场景进行划分,最近自己实现 ...
- ReactNative学习之css样式使用
前言: 前面学习了html,今天学习一下css的基本使用,看下html与css之间是如何结合来编写前端网页的. CSS 是什么? CSS 是 Cascading Style Sheets(级联样式表) ...
- 侯捷STL学习(四)--allocator和容器时间的实现关系
第十一节 分配器 分配器的好坏影响到容器的性能 operator new()里面调用malloc D:\Program Files (x86)\Microsoft Visual Studio 12.0 ...
- php注册登录源代码
php注册登录源代码 链接数据库<?php$conn=mysql_connect('localhost','root','');mysql_select_db('ht',$conn);mysql ...