Android 第一个OpenGL ES程序
Android 第一个OpenGL ES程序
在你的Android应用中用OpenGL ES绘制图形,首先需要有一个容器,最直接的方法是实现GLSurfaceView
和 GLSurfaceView.Renderer
。
前者是一个放置图形的View容器,后者用来控制在这个View中如何进行绘制。
GLSurfaceView只是一种选择,比较适合于全屏绘制图形或者近似全屏绘制,其他可以选择的还有 TextureView
和SurfaceView
。
本文展示一个最基本的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 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>
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程序相关推荐
- 使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境
传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备 笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器 ...
- Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)
第一篇 Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜) 第二篇 Android Camera使用OpenGL ES 2.0和T ...
- android平台下OpenGL ES 3.0给图片添加黑白滤镜
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
- android平台下OpenGL ES 3.0绘制圆点、直线和三角形
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
- android平台下OpenGL ES 3.0从零开始
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
- 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绘 ...
- android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
- android平台下OpenGL ES 3.0绘制立方体的几种方式
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...
最新文章
- 平民架构的春天——UCloud数据方舟实战记
- 程序员/设计师能用上的 75 份速查表(转)
- LATEX论文排版学习资源汇总
- JAVA引用和垃圾回收
- java之String
- 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击
- C语言 __TIME__ - C语言零基础入门教程
- 连接真机开发安卓(Android)移动app MUI框架——混合式开发(二) 带你项目开发(最新版)
- 编译的警告:隐式声明与内建函数 ‘malloc’ 不兼容
- c语言学生教务管理系统,c语言教务管理系统.doc
- cad隐藏图层命令快捷键_99%的人没用过CAD图层这个功能!
- python数列_Python斐波拉契数列
- [车联网安全自学篇] Android安全之Android so文件分析「详细版」
- android10及以上通话录音
- 北斗导航 | ARAIM算法初探:使用精密单点定位(PPP)技术的ARAIM:解分离
- 拥有奇瑞QQ冰淇淋·桃欢喜才懂的幸福
- IP欺骗种类有哪些?
- Unity游戏开发日记(一):独自开发2d横板游戏:Small man(MainMenu主界面)基本构建
- 【扒开】关于赢驴准心劫持浏览器首页的病毒类行径
- 基于 51 单片机室内灯光控制系统
热门文章
- 职场警示录:怎样和“小人”和睦相处
- 【技术贴】安装sql server 2005后不能连接服务器,没有studio express以及安
- 设计模式之工厂模式(下篇)
- 巧用PHP中__get()魔术方法
- 《JavaScript高级程序设计》Chapter 5 引用类型
- Javascript闭包概念剖析
- EPUB.js 解决图片裁剪问题(缩放问题)
- 增加 addDataScheme(file) 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略...
- yii2事务运用举例
- Vuex State模块化