GLSurfaceView介绍
简介
- SDK 中的 android.opengl.GLSurfaceView 类提供如下功能:
- 在 OpenGL ES 和 View 系统之间建立联系;
- 使得 OpenGL ES 可以工作在 Activity 生命周期中;
- 可选择合适的 frame buffer 像素格式;
- 创建并管理一个单独的渲染线程,可以实现平滑的动画;
- 提供 debugging 工具和 API。
一个简单的 GLSurfaceView 应用
package com.example.android.apis.graphics;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class ClearActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
}
这个程序功能很简单,每帧绘制时将屏幕设置成黑色。但它是一个完整的工作在 Activity 生命周期中的 OpenGL 程序。当 activity 暂停时,它暂停渲染;当 activity 继续时,它继续渲染。可以将这个程序用作非交互式的 demo 程序。 可以在 ClearRenderer.onDrawFrame() 接口中增加 OpenGL 调用做很多的绘制。
GLSurfaceView.Render 接口有三个方法:
- onSurfaceCreated():该方法在渲染开始前调用,OpenGL ES 的绘制上下文被重建 时也会被调用。当 activity 暂停时绘制上下文会丢失,当 activity 继续 时,绘制上下文会被重建。另外,创建长期存在的 OpenGL 资源(如 texture)往往也在这里进行。
- onSurfaceChanged():当 surface 的尺寸发生改变时该方法被调用。往往在 这里设置 viewport。若你的 camera 是固定的,也可以在这里设置camera。
- onDrawFrame():每帧都通过该方法进行绘制。绘制时通常先调用 glClear 函数来清空 framebuffer,然后在调用 OpenGL ES 的起它的接口进行绘制。
输入如何处理
若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可 以获取输入事件。下面有个例子:
package com.google.android.ClearTest;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;
public class ClearActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new ClearGLSurfaceView(this);
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
private GLSurfaceView mGLView;
}
class ClearGLSurfaceView extends GLSurfaceView {
public ClearGLSurfaceView(Context context) {
super(context);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}
public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable(){
public void run() {
mRenderer.setColor(event.getX() / getWidth(),
event.getY() / getHeight(), 1.0f);
}});
return true;
}
ClearRenderer mRenderer;
}
class ClearRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// Do nothing special.
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
public void onDrawFrame(GL10 gl) {
gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}
public void setColor(float r, float g, float b) {
mRed = r;
mGreen = g;
mBlue = b;
}
private float mRed;
private float mGreen;
private float mBlue;
}
这个应用在每一帧中清空屏幕。当 tap 屏幕时,改变屏幕的颜色。这里在 ClearGLSurfaceView.onTouchEvent() 中使用了 queueEvent()。queueEvent() 方法用于在 UI 线程和渲染线程间通信。也可以用起它的 Java 线程通信技术, 如 synchronized 方法,但 queueEvent 最简单的线程通信方法。
其他的 GLSurfaceView 例子
在 Android SDK 的 API Demo例子程序中还有很多例子:
- GLSurfaceView
- Kube
- Translucent GLSurfaceView:透明背景
- Textured Triangle:纹理贴图
- Sprite Text:在 texture 上写文本并显示在 3D 场景中
- Touch Rotate:旋转 3D 对象
选择一个 Surface
GLSurfaceView 提供了接口可选择 surface 的类型。默认情况下, GLSurfaceView 会使用一个 16 位 RGB frame buffer,带 16 位深度。你也可 以根据自己的需要进行选择,比如在 Translucent GLSurfaceView 例子里, 需要一个 Alpha 通道来实现透明。GLSurfaceView 提供了 setEGLSurfaceChooser()方法来选择 surface。
选择一个 RGB (565)的16位 framebuffer,接口如下:
setEGLConfigChooser(boolean needDepth)
若要定制 red, green, blue, alpha 和 depth,则用如下接口:
setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)
使用自己实现的 EGLConfigChooser,用如下的接口:
setEGLConfigChooser(EGLConfigChooser configChooser)
持续型渲染模式 & 通知型渲染模式
大多数 3D 应用,如游戏、模拟等都是持续型渲染的动画,还有些 3D 应用是反 应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。对于这 种应用,持续渲染屏幕是浪费时间。若开发反应式的应用,可以调用下面的方法
GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
停止持续渲染。当调用
GLSurfaceView.requestRender()时,程序再渲染屏幕。
调试
GLSurfaceView.setDebugFlags() 方法可以激活 log 或者错误检测,它们可以 帮助调试 OpenGL ES 调用。具体使用时,在 GLSurfaceView 的构造函数中, 调用 setRender() 之前调用 GLSurfaceView.setDebugFlags()就可以了。下面 是个例子:
public ClearGLSurfaceView(Context context) {
super(context);
// Turn on error-checking and logging
setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
mRenderer = new ClearRenderer();
setRenderer(mRenderer);
}
分享到:
相关推荐
Android视频水印,学习过程记录,搭建最基本的OpenGLES框架,为绘制做准备。
介绍GLSurfaceView的3个简单的小demo,新手入门可以参考下
通过实例介绍android平台上通过GLSurfaceView来进行3D开发,开发一些很炫的UI界面空间
主要介绍了Android基于OpenGL的GLSurfaceView创建一个Activity实现方法,结合实例形式分析了Android中OpenGL图形操作类GLSurfaceView的功能、用法及相关使用技巧,需要的朋友可以参考下
介绍OpenGL es的例子,主要是纹理的使用,更好的支持jpg格式,对png格式不是很理想
主要介绍了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法,结合实例形式分析了Android基于OpenGL的图形绘制技巧,需要的朋友可以参考下
1方案介绍 在实际应用中,经常遇到OpenGL ES渲染性能达不到要求,图像卡顿等GG问题。这时,在不改变平台选型的情况下,选择一个好的方案实现OpenGL渲染很重要。应用程序中使用OpenGL ES共有方案 使用GLSurfaceView...
在GLSurfaceView上使用OpenGL ES绘制一个简单的三角形和正方形,初步介绍OpenGL ES的使用方法
介绍 在介绍性项目中,展示了如何在 Android 应用程序中设置和编写一个非常基本的 OpenGL ES 2.0 上下文。 整个课程使用的语言是Java。 实际代码很简单,所以让我在这里稍微解释一下。 主活动.java 此类是向用户...
上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要的特效,但是,你可能已经意识到了,我们的游戏一般都需要进行碰撞检测,比如前面的火柴棍小人,我们需要检测子弹和敌人...
主要介绍了android实现自动滚动的Gallary控件效果,涉及Android中Gallary控件的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本项目是一款基于安卓的小游戏,采用GlSurfaceView实现,画质精细,游戏玩法类似于小时候游戏机上玩的冒险岛不过没有武器和怪物,只有地雷火堆和鸡腿。试玩了一下还算流畅。感兴趣的可以自己下载研究一下。javaapk...
Opengl2ex2扩展了GLsurfaceView来设置所有内容。 同样,使用Lessonone渲染器。OpenGL 3.0范例旨在帮助您开始使用OpenGL 3.0,但不提供任何深度介绍。 HelloOpenGLES30是Google从2.0开始的基本框架示例,已更新为...
本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下: ...2. 开发工具(OpenGL和OpenGL ES)介绍 OpenGL:Open Graphics Library,开放的图形库接口,跨编程语言,跨平台的编程接口
7.3 glsurfaceview:从2008年开始,事情变得简单了 7.4 glgame:实现游戏接口 7.5 绘制一个红色的三角形 7.5.1 定义视口 7.5.2 定义投影矩阵 7.5.3 指定三角形 7.5.4 综合示例 7.6 指定每个顶点的...
7.3 GLSurfaceView:从2008年开始, 事情变得简单了 225 7.4 GLGame:实现游戏接口 228 7.5 绘制一个红色的三角形 235 7.5.1 定义视口 235 7.5.2 定义投影矩阵 235 7.5.3 指定三角形 238 7.5.4 综合...