Android 中建立一个OpenGL ES的开发环境
转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html
负责人:zhangql
原文链接:http://docs.eoeandroid.com/training/graphics/opengl/environment.html
要用OpenGl ES在应用程序中绘制图像,首先你要创建与之对应的视图容器。当中最直接的方法就是使用
GLSurfaceView和GLSurfaceView.Renderer接口。GLSurfaceView是OpenGL所绘制的图形的视图容器,而GLSurfaceView.Renderer控制在视图上所绘制的图像。想获取更多关于这两个类的信息,请参考OpenGl ES开发指南。
GLSurfaceView只是把OpenGL ES图像组合到应用程序的其中一种方法,但对于绘制全屏或接近全屏的图形来说,它是一个很好的选择。开发者如果想把OpenGL ES图像组合成布局中的一小部分,可以查看TextureView。事实上,独立开发者也可以在SurfaceView上创建OpenGL ES视图,但这需要写更多额外的代码。
这节课将介绍如何在应用程序中最低限度地实现GLSurfaceView和GLSurfaceView.Renderer。
在Manifest声明OpenGL ES的使用 Declare OpenGL ES Use in the Manifest
要在应用程序中使用 OpenGL ES 2.0 API,你必须在Manifest添加以下的声明:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
如果你的应用程序中使用到了纹理压缩,你必须声明应用程序所支持的压缩格式,以便提醒不支持这些格式的设备不会尝试运行你的应用程序:
1 2 |
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" /> |
想获取更多关于纹理压缩格式的信息,请参考OpenGl ES开发指南。
创建OpenGL ES的Activity Create an Activity for OpenGL ES Graphics
Android使用到OpenGL ES的应用程序和其他的应用程序的activities一样,都有一个用户界面。当中最大的不同就是,在activity的布局中你使用了什么控件,在很多应用中,你可能会使用TextView,Button和ListView,在使用了OpenGL ES的应用程序,你还可以添加GLSurfaceView。
下面的示例代码中,呈现了一个Activity使用GLSurfaceView作为主视图的最低实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class OpenGLES20 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); } } |
备注:OpenGL ES 2.0需要Android2.2(API 8)以上使用,请确定你的Android工程的API设置正确。
创建GLSurfaceView对象 Build a GLSurfaceView Object
GLSurfaceView是一个可以绘制OpenGL ES图像的专门视图,它本身没有处理功能,所绘制的图像都是由你所设置的GLSurfaceView.Renderer来控制的。事实上,该对象的代码很简单,你可能宁愿自己创建一个没有定义好的GLSurfaceView实例,而不去继承它,但是千万不要这样做。你需要继承这个类,才能捕获触摸事件,这些将会在Responding_to_Touch_Events |触摸响应这节课中有介绍到。
GLSurfaceView的必要代码是很少的,为了一个快速的实现,最常见的做法是在activity中创建一个内部类:
1 2 3 4 5 6 7 8 9 |
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构造器中添加多一句代码,以声明你是使用OpenGL ES 2.0的API:
1 2 |
// Create an OpenGL ES 2.0 context setEGLContextClientVersion(2); |
备注:如果你使用的是OpenGL ES 2.0的API,请确认你已经在应用程序的manifest进行了声明。更多的信息,请参考在Manifest声明OpenGL ES的使用 Declare OpenGL ES Use in the Manifest
使用GLSurfaceView.RENDERMODE_WHEN_DIRTY可以设定GLSurfaceView实现的渲染模式:当应用程序的图数据发生变化时,才绘制试图。该设置是可选的,设置如下:
1 2 |
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); |
该设置可以防止GLSurfaceView图像被重新绘制,直到你调用了equestRender()方法,这在样例应用程序中更体现了其的价值。
创建渲染器类 Build a Renderer Class
GLSurfaceView.Renderer类或渲染器的实现,使得使用了OpenGL的应用程序开始变成一个有趣的事情。这个类控制与之关联的东西可以被绘制在GLSurfaceView。渲染器中提供了三种方法给Android系统调用,以控制什么可以,以及怎样绘制在GLSurfaceView上。
* onSurfaceCreated() - 设置视图的OpenGL ES环境,只需调用一次
* onDrawFrame() - 重新绘制每个视图时调用
* onSurfaceChanged() - 视图的几何发现变化时调用,例如,设备的屏幕的方向发生变化
下面是对于OpenGL ES渲染器一个很基本的实现,只在GLSurfaceView上绘制了一个灰色的背景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MyGL20Renderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Set the background frame color GLES20.glClearColor(0.5f, 0.5f, 0.5f, 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绘制图像的基础。
在使用OpengGL ES 2.0的API时,也许你会很奇怪这些方法中为什么会包含有GL10参数,这是因为这些方法的签名是重用了2.0的API,以保证Android框架的代码更加简单。
如果你对OpenGL ES的API已经熟悉,你已经可以在你的应用程序中建立OpenGL ES环境并且绘制图形了。但是,如果你还需要更多的帮助来开始OpenGL,你可以继续下节课的学习,以获取更多的提示。
Android 中建立一个OpenGL ES的开发环境的更多相关文章
- 如何用Docker建立一个Node.js的开发环境
建立一个文件夹 用管理员身份打开powershell. 在文件夹下面运行npm init, 根据提示填入信息,以便产生一个package.json文件. 在文件中加入需要的dependencies ...
- 【Android Developers Training】 62. 搭建一个OpenGL ES环境
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 在Android中使用OpenGL ES进行开发第(三)节:绘制图形
一.前期基础知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGLES绘制2D ...
- 在Android中使用OpenGL ES进行开发第(二)节:定义图形
一.前期基础知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGLES绘制2D ...
- 在Android中使用OpenGL ES进行开发第(一)节:概念先行
一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制 ...
- EGL接口介绍-----Android OpenGL ES底层开发
引自:http://www.cnitblog.com/zouzheng/archive/2011/05/30/74326.html EGL 是 OpenGL ES 和底层 Native 平台视窗系统之 ...
- OpenGL ES应用开发实践指南:iOS卷
<OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...
- Mac中创建一个OpenGL项目
配置: OS X10.10 + Xcode 6.0 一.基本步骤 新建一个命令窗口项目 更改目标设备版本号为 OS X 8.0 添加库文件 GLUT.framework 和 OpenGL.framew ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
随机推荐
- wpa_supplicant软件架构分析
wpa_supplicant软件架构分析 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bi ...
- ssh 安装
一 ssh 1.查看ssh服务的状态 输入以下命令: sudo service sshd status 如果出现 Loaded: error (Reason: No such file or dire ...
- Block 块
代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定 ...
- Centos 安装 p7zip,即Linux下的7z
Centos 无法直接通过yum安装7z,我们一般通过repoforge,rpmforge的软件包进行安装,你只需要下载一个对应的包,直接安装就可以 p7zip-9.20.1-1.el4.rf.i38 ...
- C#判断字符串为空
string str = null; if (string.IsNullOrWhiteSpace(str)) { MessageBox.Show("字符串为null"); } if ...
- EF6 在原有数据库中使用 CodeFirst 总复习(三、重建迁移)
本来原来学的时候,挺顺利的,没想到再次使用,还是遇到很多问题,导致更新失败,所以,只能重建迁移,免得看着乱乱的. 一.删除迁移,将数据恢复到(一)结束状态 1.删除文件夹 2.删除表 3.删除列 4. ...
- java数据结构和算法------选择排序
package iYou.neugle.sort; public class Select_sort { public static void SelectSort(double[] array) { ...
- 2014103《JAVA程序设计》第一周学习总结
本周,在刻苦看了三天课本之后,终于对JAVA这门课程有了一定的认识.了解了JAVA的前世今生,JAVA的三大平台:Java SE.Java EE与Java ME.其中Java SE又可分为四个主要的部 ...
- html5+ plus和phoneGap、cordova的比较
偶遇大神言论,摘录 phonegap出的早,自然用的人多.phonegap自己的定位是混合开发hybrid,用原生+js:HBuilder的定位是纯js搞定一切.5+ 和 phonegap在能力.性能 ...
- 如何分离数据库 (SQL Server Management Studio)
在 SQL Server Management Studio 对象资源管理器中,连接到 SQL Server 数据库引擎的实例上,再展开该实例. 展开“数据库”,并选择要分离的用户数据库的名称. 分离 ...