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

第3.3.4节 创建高级图形之OpenGL(三)

 
阅读更多

Android视图框架对于创建复杂布局非常方便。然而,这种便利是以性能为代价的。当性能至关重要的时候,Android提供了几种更强大的图形处理能力,当然难度也是随之上升了。在本节中,我将介绍:

(1)SurfaceView使用标准的Canvas对象并与单独的渲染进程结合,得到更好的性能;

(2)新得RenderScript框架可以被用于创建独立结构的图形渲染;

(3)OpenGL可用于一些严格的图形工作和游戏。

3、OpenGL可用于一些严格的图形工作和游戏

Android为使用OpenGL ES 1.0和OpenGL ES 2.0标准的硬件渲染图形提供了完全支持。OpenGL API可以通过Java框架和本地开发套件(NDK)来进行调用。Java框架提供了一个简单已用的API,但是却有一个小的性能损失。对于全加速图形支持,以及移植现有代码,NDK提供了最佳的解决方案。不过,这超出了本书的范围。

这里我只做一个java框架的API,初步了解OpenGL。创建OpenGL需要两个类:GLSurfaceView和GLSurface.Render。GLSurfaceView类和SurfaceView类相似,并且可以结合OpenGL渲染图形和Android标准视图框架。这个类提供了单独的渲染线程,可以独立于UI线程生成图形。此外,GLSurfaceView提供了一些调试工具,可以来帮助在渲染代码中追踪错误。

注意:OpenGL,需要一部android设备,模拟器是不可用的。

效果如下图:

一个不停旋转的三角形,当手触摸屏幕的时候,背景颜色会随着手触碰的位置不通而变化。

这里分为三部:

3.1 声明GLSurface.Render方法

public class ExampleRender implements GLSurfaceView.Renderer {

	private float[] mVertics={-2.0f, -2.0f, 0,  2.0f, -2.0f, 0,  0.0f, 2.0f, 0};
	private FloatBuffer mVertexBuffer;
	private float mRed;
	private float mGreen;
	private float mBlue;
	private float mAngle;
	private long mLastFrameTime = 0;
	/**********************************************************
	 * 更新onDrawFrame方法,基于color字段设置视图的颜色并绘制三角形。
	 */
	@Override
	public void onDrawFrame(GL10 gl) {
		// TODO Auto-generated method stub
		gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
		upDateAngle();
		gl.glLoadIdentity();
		gl.glTranslatef(0.0f, 0.0f, -7.0f);
		gl.glRotatef(mAngle, 0.0f, 0.0f, 1.0f);
		gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
		gl.glColor4f(255f, 255f, 255f, 0.0f);
		gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
		gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
		gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
	}
	/***********************************************************
	 * 更新onSurfaceChanged方法来设置映射矩阵。OpenGL假定了一个方形的
	 * 显示,所以你需要改变图形的长度比来匹配屏幕。
	 */
	@Override
	public void onSurfaceChanged(GL10 gl, int width, int height) {
		// TODO Auto-generated method stub
		gl.glViewport(0, 0, width, height);
		gl.glMatrixMode(GL10.GL_PROJECTION);
		gl.glLoadIdentity();
		float ratio = (float)width/height;
		GLU.gluPerspective(gl, 45.0f, ratio, 0.1f, 100.0f);
		gl.glMatrixMode(GL10.GL_MODELVIEW);
		gl.glLoadIdentity();
	}
	/***********************************************************
	 * 初始化方法中的顶点
	 */
	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {
		// TODO Auto-generated method stub
		ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(mVertics.length*4);
		vertexByteBuffer.order(ByteOrder.nativeOrder());
		mVertexBuffer = vertexByteBuffer.asFloatBuffer();
		mVertexBuffer.put(mVertics);
		mVertexBuffer.position(0);
	}	
	private void upDateAngle(){
		long now = System.currentTimeMillis();
		if(mLastFrameTime != 0){
			mAngle += 10*(now - mLastFrameTime)/1000.0;
		}
		mLastFrameTime = now;
	}	
	public void setColor(float red, float green, float blue){
		this.mRed = red;
		this.mGreen = green;
		this.mBlue = blue;
	}
}

这里重载了GLSurfaceView的创建,更改,和onDrawFrame方法,并添加了,更新角度和设置颜色的方法,方便我们使用。

3.2 继承GLSurfaceView方法,setRender为3.1中的ExampleRender

public class ExampleGLSurfaceView extends GLSurfaceView {

	public ExampleRender mRender;
	public ExampleGLSurfaceView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		mRender = new ExampleRender();
		setRenderer(mRender);
	}
	
	/***************************************************
	 * 重写onTouchEvent
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event){
		switch (event.getAction()){
		case MotionEvent.ACTION_DOWN:
		case MotionEvent.ACTION_MOVE:
			final float x = event.getX()/getWidth();
			final float y = event.getY()/getHeight();
			queueEvent(new Runnable(){

				@Override
				public void run() {
					// TODO Auto-generated method stub
					mRender.setColor(x, y, 0.5f);
				}
				
			});
			return true;
		}
		return super.onTouchEvent(event);		
	}
}

这里重写了onTouchEvent方法,实现了手触碰,颜色变化的功能。

3.3 在主界面上显示当前做的View

public class MainActivity extends Activity {

	private ExampleGLSurfaceView mGLView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mGLView = new ExampleGLSurfaceView(this);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(mGLView);
	}

这里是使用了java的框架的API,也只是实现了一个小的功能,OpenGL的功能非常的强大,大家可以参考http://blog.csdn.net/mapdigit/article/details/7526556目录列表来学习。

分享到:
评论

相关推荐

    Android基础教程

    第三部分 高级主题 第7章 互联的世界. 107 7.1 通过意图实现浏览............... 108 7.2 利用视图打开网页............... 111 7.3 JavaScript与Java通信.......... 115 7.4 使用Web服务..... 121 7.5...

    OpenGL_参考手册.rar

    本书第1章是OpenGL入门,第2章对命令和例程进行了简介,第3章集中介绍了各种命令和例程,第4章介绍了定义的常量和相关命令,第5章是OpenGL参考说明,第6章是GLU的参考说明,第7章是GLX的参考说明。 本书在翻译过程...

    Delphi 6集成开发环境

    第3 章 常见组件编程............... 70 3.1 窗体和组件................................................70 3.1.1 概述...............................................70 3.1.2 窗体(Form)......................

    计算机图形学基础-pdf.zip

    第3章用户接口与交互式技术 3.1用户接口设计 3.1.1用户模型 3.1.2显示屏幕的有效利用 3.1.3反馈 3.1.4一致性原则 3.1.5减少记忆量 3.1.6回退和出错处理 3.1.7联机帮助 3.1.8视觉效果设计 3.1.9...

    Android应用开发入门教程(经典版)

    第3章 Android应用层程序的开发方式.......................................................................................................................36 3.1 应用程序开发的结构..........................

    Android 应用开发入门教程(经典版)

    第3 章 Android 应用层程序的开发方式....................................................................................................................... 36 3.1 应用程序开发的结构.......................

    OpenGL 系统开发的源代码

    第3章 坐标变换 3.1 从三维图形到二维图像 3.1.1 三维图形的输出过程 3.1.2 坐标系与坐标变换 3.1.3 矩阵操作 3.2 几何变换 3.2.1 平移变换 3.2.2 旋转变换 3.2.3 缩放变换 3.2.4 变换次序 3.2.5 ...

    OpenGL参考手册

    命令和例程概述 4 2.1 OpenGL处理流程 4 2.1.1 顶点 4 2.1.2...图形 13 2.3.2 坐标转换 13 2.3.3 多边形的镶嵌分块 14 2.3.4 绘制球体、圆柱和圆盘 14 2.3.5 NURBS曲线和曲面 14 2.3.6...

    OpenGL 参考手册

    第3章 命令和例程一览 18 3.1 注释 18 3.2 OpenGL命令 19 3.2.1 图元 19 3.2.2 顶点数组 19 3.2.3 坐标转换 20 3.2.4 着色与光照 20 3.2.5 剪切 21 3.2.6 光栅化 21 3.2.7 像素操作 22 3.2.8 纹理 22 3.2.9 雾 23 ...

    第3章 图形图像编程

    BCB源代码第3章 图形图像编程:3.1颜色拾取器,3.2图像的淡入和淡出,3.3图像特技,3.4不规则图形的动画技术,3.5OpenGL编程

    OpenGL 参考手册1-4章

    第3章 命令和例程一览 18 3.1 注释 18 3.2 OpenGL命令 19 3.2.1 图元 19 3.2.2 顶点数组 19 3.2.3 坐标转换 20 3.2.4 着色与光照 20 3.2.5 剪切 21 3.2.6 光栅化 21 3.2.7 像素操作 22 3.2.8 纹理 22 3.2.9 雾 23 ...

    3D图形编程指南 西北工业大学电子工程系 刘长松 程连冀(译)

     第三章 2D图元光栅处理  3.1 光栅化点  3.2 光栅化线段  3.3 光栅化多边形  3.3.1 光栅化凸多边形  3.3.2 光栅化凹多边形  3.4 内插渲染明暗处理的多边形  3.5 渲染纹理多边形  3.6 反走样  第四章 2D和...

Global site tag (gtag.js) - Google Analytics