`
xuela_net
  • 浏览: 495169 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

传送门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;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 创建一个GLSurfaceView对象,并将其设置为当前Activity的ContentView
        mGLView = 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环境并开始绘制图形了。然而,如果你想要学习更多的相关知识,那么就请继续关注下一节吧。
分享到:
评论

相关推荐

    opengles 2.0教程

    opengles2.0 教程,包括window平台、android平台,其中还包括shader语言教程等

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0使用webgl实现的画点

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    Android OpenGL es 绘图示例

    NULL 博文链接:https://guozhenqian.iteye.com/blog/1924552

    OpenGL.rar_ android OpenGL _Android opengl_OpenGLES_android samp

    android上面实现opengles的一些代码,学习外国网站的代码。里面有些功能不能用。主要是集合了一些简单的绘图等

    android_OpenGL_ES_笔记_4-EGL

    EGL是OpenGL ES与本地Window系统之间的桥梁。EGL创建渲染上下文(Rendering Context)和Surface,Rendering Context是OpenGL ES的状态机,Surface是OpenGL ES绘图的“画布”……

    Android高薪之路:Android程序员面试宝典 李宁

    《Android高薪之路:Android程序员面试宝典》目录: 第1章 Android入门 1 1 关于Android的非技术问题 1 1 1 为什么看好 Android 1 1 2 以前是否从事过Android的工作 做过哪些工作 1 1 3 你做的最复杂的界面是什么 1 ...

    Opengl es三维画图

    编写opengl es 从绘图原理 到三维制图 纹理制作整个过程

    Android编程之OpenGL绘图技巧总结

    本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下: 很久不用OpenGL ES绘图,怕自己忘记了,于是重新复习一遍,顺便原理性的东西总结如下: 1. Android 3D坐标系统 如图: Android的三...

    在ARM Linux上使用OpenGL

    这两天在ARM上跑了一个OpenGL,应该说是OpenGL|ES的软件包,虽然我觉得可能后我不会使用这个软件包,但是还是记录下来以备忘记。 先全局介绍下,首先,什么是OpenGL和OpenGL|ES。OpenGL是一套绘图函数的标准,OpenGL...

    NativeGL_demo:此程序使用android native代码实现EGL,并使用SurfaceView作为OpenGL绘图窗口。即可提高图形渲染性能,又可使用java层定义的图形界面

    这时,在不改变平台选型的情况下,选择一个好的方案实现OpenGL渲染很重要。应用程序中使用OpenGL ES共有方案 使用GLSurfaceView作为绘图窗口,使用GLSurfaceView.Renderer实现OpenGL渲染图形,并通过调用android....

    OpenGL ES绘图迷你太阳系

    android平台下使用OpenGL ES绘制的模拟太阳系(日,地,月)运行的图形。 太阳自转,地球自转并绕太阳公转,月亮自转并绕地球公转。

    OpenGL ES 3D绘图基本概念

    详细信息请参考:http://blog.csdn.net/u013985004/article/details/40303535

    WEBGL1.0中文版

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    WebGL规范1.0(中文)

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    OpenGL 应用开发指南

    OpenGL 应用开发指南,android卷,主要讲解android端的opengl es 二维绘图,3D绘制知识

    WEBGL开发教程

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统...

    webGL高级编程

    WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样...

    Android 4游戏编程入门经典

     2.3.2 创建一个android虚拟设备  2.3.3 运行应用程序  2.3.4 调试应用程序  2.3.5 logcat和ddms  2.3.6 使用adb  2.4 小结 第3章 游戏开发基础  3.1 游戏类型  3.1.1 休闲游戏  3.1.2 益智游戏  3.1.3 ...

Global site tag (gtag.js) - Google Analytics