Android 第一个OpenGL ES程序

  在你的Android应用中用OpenGL ES绘制图形,首先需要有一个容器,最直接的方法是实现GLSurfaceView 和  GLSurfaceView.Renderer

  前者是一个放置图形的View容器,后者用来控制在这个View中如何进行绘制。

  GLSurfaceView只是一种选择,比较适合于全屏绘制图形或者近似全屏绘制,其他可以选择的还有 TextureViewSurfaceView

  

  本文展示一个最基本的Android OpenGL ES绘制Demo。

1.在Manifest中添加声明

  为了使用OpenGL ES 2.0 API,需要添加如下声明:

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

  OpenGL ES 2.0 requires Android 2.2 (API Level 8) or higher,所以需要确认系统版本。

2.创建Activity

  在Activity的布局中,需要加入GLSurfaceView来放置绘制的图形。

  一个最简单的版本如下:

public class OpenGLES20 extends Activity {private GLSurfaceView mGLView;@Overridepublic 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);}
}

3.创建GLSurfaceView

  GLSurfaceView是一个特殊的组件,你可以在其中绘制OpenGL ES图形。

  你需要扩展这个类,在它的构造方法中设置渲染器:

class MyGLSurfaceView extends GLSurfaceView {public MyGLSurfaceView(Context context){super(context);// Set the Renderer for drawing on the GLSurfaceViewsetRenderer(new MyRenderer());}
}

  如果使用OpenGL ES 2.0,还需要加一句声明:

// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);

  还有一个可选的设置是,把渲染模式改为 GLSurfaceView.RENDERMODE_WHEN_DIRTY ,这样仅在你的数据有变化时重新进行渲染。

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

  除非你调用requestRender(),这个设置会阻止帧被重画,有些情况下这样效率更高。

4.建立一个Renderer类

  Renderer类(渲染器类),即 GLSurfaceView.Renderer的实现类,它控制了与它相关联的 GLSurfaceView 上绘制什么。

  其中有三个主要的回调方法:

  • onSurfaceCreated() - Called once to set up the view's OpenGL ES environment.
  • onDrawFrame() - Called for each redraw of the view.
  • onSurfaceChanged() - Called if the geometry of the view changes, for example when the device's screen orientation changes.

  

  一个简单的实现例子:

public class MyGL20Renderer implements GLSurfaceView.Renderer {public void onSurfaceCreated(GL10 unused, EGLConfig config) {// Set the background frame colorGLES20.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);}
}

程序例子

  一个简单的程序例子,并没有绘制什么,只是设置了背景色,为了展示方便,GLSurfaceView类和渲染器类都作为Acitivity的内部类写出。

  首先在Manifest中加上声明:

Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.helloopengles"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15" /><!-- Tell the system this app requires OpenGL ES 2.0. --><uses-featureandroid:glEsVersion="0x00020000"android:required="true" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".HelloOpenGLESActivity"android:label="@string/title_activity_hello_open_gles" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

Activity

package com.example.helloopengles;import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;import android.app.Activity;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;public class HelloOpenGLESActivity extends Activity
{private GLSurfaceView mGLView;@Overridepublic 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);}class MyGLSurfaceView extends GLSurfaceView{public MyGLSurfaceView(Context context){super(context);try{// Create an OpenGL ES 2.0 contextsetEGLContextClientVersion(2);// Set the Renderer for drawing on the GLSurfaceViewsetRenderer(new MyRenderer());// Render the view only when there is a change in the drawing// data
                setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);// 注意上面语句的顺序,反了可能会出错
}catch (Exception e){e.printStackTrace();}}}public class MyRenderer implements GLSurfaceView.Renderer{public void onSurfaceCreated(GL10 unused, EGLConfig config){// Set the background frame colorGLES20.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);}}}

参考资料

  Training: Building an OpenGL ES Environment

  http://developer.android.com/training/graphics/opengl/environment.html

  OpenGL ES Developer Guide:

  http://developer.android.com/guide/topics/graphics/opengl.html

Android 第一个OpenGL ES程序相关推荐

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

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

  2. 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法

    一.前期基础储备 笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器 ...

  3. Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)

    第一篇 Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜) 第二篇 Android Camera使用OpenGL ES 2.0和T ...

  4. android平台下OpenGL ES 3.0给图片添加黑白滤镜

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  5. android平台下OpenGL ES 3.0绘制圆点、直线和三角形

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  6. android平台下OpenGL ES 3.0从零开始

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  7. android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  8. android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  9. android平台下OpenGL ES 3.0绘制立方体的几种方式

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

最新文章

  1. 平民架构的春天——UCloud数据方舟实战记
  2. 程序员/设计师能用上的 75 份速查表(转)
  3. LATEX论文排版学习资源汇总
  4. JAVA引用和垃圾回收
  5. java之String
  6. 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击
  7. C语言 __TIME__ - C语言零基础入门教程
  8. 连接真机开发安卓(Android)移动app MUI框架——混合式开发(二) 带你项目开发(最新版)
  9. 编译的警告:隐式声明与内建函数 ‘malloc’ 不兼容
  10. c语言学生教务管理系统,c语言教务管理系统.doc
  11. cad隐藏图层命令快捷键_99%的人没用过CAD图层这个功能!
  12. python数列_Python斐波拉契数列
  13. [车联网安全自学篇] Android安全之Android so文件分析「详细版」
  14. android10及以上通话录音
  15. 北斗导航 | ARAIM算法初探:使用精密单点定位(PPP)技术的ARAIM:解分离
  16. 拥有奇瑞QQ冰淇淋·桃欢喜才懂的幸福
  17. IP欺骗种类有哪些?
  18. Unity游戏开发日记(一):独自开发2d横板游戏:Small man(MainMenu主界面)基本构建
  19. 【扒开】关于赢驴准心劫持浏览器首页的病毒类行径
  20. 基于 51 单片机室内灯光控制系统

热门文章

  1. 职场警示录:怎样和“小人”和睦相处
  2. 【技术贴】安装sql server 2005后不能连接服务器,没有studio express以及安
  3. 设计模式之工厂模式(下篇)
  4. 巧用PHP中__get()魔术方法
  5. 《JavaScript高级程序设计》Chapter 5 引用类型
  6. Javascript闭包概念剖析
  7. EPUB.js 解决图片裁剪问题(缩放问题)
  8. 增加 addDataScheme(file) 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略...
  9. yii2事务运用举例
  10. Vuex State模块化