Android OpenGL ES 2.0绘图:搭建OpenGL ES环境

移动开发 Android
这一节将介绍如何在一个简单应用的activity中完成一个最小的GLSurfaceView和GLSurfaceView.Renderer的实现。使用GLSurfaceView几乎是整合OpenGL ES到你的应用中的唯一方式。对于一个需要全屏或近乎屏幕图形视图,它是一个合理的选择。

为了能够在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文件中添加以下声明:

  1. [html] view plaincopyprint? 

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

  1. [html] view plaincopyprint? 

更多关于纹理压缩格式的信息,请参阅OpenGL开发人员指南。

二、为OpenGL ES图形创建一个Activity

这个Activity跟任何其他的应用程序中的Activity一样,也有一个用户界面。唯一的区别是在它的布局文件中存放的视图不是TextView、Button和ListView,而是一个GLSurfaceView。

下面的代码演示了使用GLSurfaceView作为主视图的Acitivity的核心代码:

  1. [java] view plaincopyprint? 
  2. public class OpenGLES20 extends Activity { 
  3. private GLSurfaceView mGLView; 
  4. @Override 
  5. public void onCreate(Bundle savedInstanceState) { 
  6. super.onCreate(savedInstanceState); 
  7. // 创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView 
  8. mGLView = new MyGLSurfaceView(this); 
  9. setContentView(mGLView); 
  10. public class OpenGLES20 extends Activity { 
  11. private GLSurfaceView mGLView; 
  12. @Override 
  13. public void onCreate(Bundle savedInstanceState) { 
  14. super.onCreate(savedInstanceState); 
  15. // 创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView 
  16. mGLView = new MyGLSurfaceView(this); 
  17. setContentView(mGLView); 

注:OpenGL ES 2.0需要Android2.2 (API Level 8) 及以上版本,所以请确保你的Android项目的运行目标的API等级不低于8或更高。

三、构造一个GLSurfaceView对象

事实上GLSurfaceView并没有提供很多功能,实际上绘制对象的任务都在GLSurfaceView.Renderer中进行。所以 GLSurfaceView中代码也非常少,甚至可以直接使用GLSurfaceView。但***别这样做,因为你需要扩展这个类来响应触摸事件。

通常在当前Activity中以内部类的方式创建GLSurfaceView,这样实现起来非常快,核心代码如下

  1. [java] view plaincopyprint? 
  2.   class MyGLSurfaceView extends GLSurfaceView { 
  3.   public MyGLSurfaceView(Context context){ 
  4.   super(context); 
  5.   // 设置渲染对象,用于控制在GLSurfaceView中的绘制工作 
  6.   setRenderer(new MyRenderer()); 
  7.   } 
  8.   } 
  9.   class MyGLSurfaceView extends GLSurfaceView { 
  10.   public MyGLSurfaceView(Context context){ 
  11.   super(context); 
  12.   // 设置渲染对象,用于控制在GLSurfaceView中的绘制工作 
  13.   setRenderer(new MyRenderer()); 
  14.   } 
  15.   } 

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

  1. [java] view plaincopyprint? 
  2. // 创建一个OpenGL ES 2.0 context 
  3. setEGLContextClientVersion(2); 
  4. // 创建一个OpenGL ES 2.0 context 
  5. setEGLContextClientVersion(2); 
  6. 注:如果你使用的是OpenGL ES 2.0的API,那么请确保在Manifest文件中作出相关API版本声明。有关更多信息,请参见在Manifest文件中声明使用OpenGL ES。 
  7. 另一个可以添加到你的GLSurfaceView中可选操作是设置渲染模式为仅当绘制数据发生改变时才绘制view。该渲染模式常量是GLSurfaceView.RENDERMODE_WHEN_DIRTY。 
  8. [java] view plaincopyprint? 
  9. // 只有在绘制数据改变时才绘制view 
  10. setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
  11. // 只有在绘制数据改变时才绘制view 
  12. 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上画了一个灰色的背景:

 以上就是所有要做的东西!上面的代码示例创建了一个简单的Android应用,它使用OpenGL显示了一个灰色的屏幕。虽然这段代码并没有做什么有趣的事情,但是通过创建这些类,已经为你使用OpenGL绘制图形奠定了基础。

注:当你使用OpengGLES 2.0 API时,可以不用去明白这些方法们为什么都有一个GL10参数。其实这样做的目的是让Android框架能够简单的兼容OpenGL ES的各版本。

如果你对OpenGL ES API很熟悉,你现在应该能够在应用程序中建立一个OpenGL ES环境并开始绘制图形了。然而,如果你想要学习更多的相关知识,那么就请继续关注下一节吧。

原文链接

责任编辑:闫佳明 来源: bbs.9ria
相关推荐

2014-04-29 14:27:59

OpenGL ES 2Android绘制纹理

2014-04-29 14:49:37

OpenGL ES 2Android应用投影

2014-04-24 11:16:00

OpenGL ES 2入门

2014-04-24 13:26:24

OpenGL ES2.iOSiPhone

2014-04-24 14:00:35

OpenGL ES 2编程

2014-04-24 13:35:11

OpenGL ES2.iOSAndroid

2014-04-29 14:05:02

OpenGL ESAndroid添加动作

2013-04-26 10:26:08

2013-07-05 14:45:05

AndroidOpenGL ES开发

2013-09-02 15:46:06

OpenGLWindows

2014-04-29 13:58:11

OpenGL ESAndroid响应触屏事件

2017-07-19 15:25:16

iOS开发ARKitOpen GL

2010-02-14 15:27:25

2017-07-04 12:26:14

ARARKit

2013-09-26 13:43:13

iOS开发OpenGL ES教程图元

2017-07-06 15:02:53

OpenGL ES架构GPU

2013-09-26 14:09:31

iOS开发OpenGL ES教程绘制矩形

2014-04-29 14:08:40

OpenGL ESAndroid应用投影

2014-06-18 10:34:41

Android字体渲染器OpenGL ES

2014-07-16 15:49:13

AndroidOpenGL 4.4
点赞
收藏

51CTO技术栈公众号