【Android开发学习09】Android OpenGL ES 基础

来源:互联网 发布:java方法命名规范to 编辑:程序博客网 时间:2024/05/12 12:55

其实,我个人学习Android最主要的目的是学习在此平台下的3D效果的开发。所以,我们开始进入主题吧。


OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。

官方主页为: http://cn.khronos.org/opengles


在Android中搭建一个3D开发的基本框架:

一、导入opengl es库:

import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;



二、加入渲染支持:

在Android中,GLSurfaceView包含了一个专门用于渲染3D的接口Renderer,来显示OpenGL视图:

1、导入支持库:

import android.opengl.GLSurfaceView;import android.opengl.GLSurfaceView.Renderer;

2、创建一个GLRender类实现Renderer接口:

public class GLRender implements Renderer{}

3、实现GLRender类中的3个抽象方法:

public void onDrawFrame(GL10 gl)public void onSurfaceChanged(GL10 gl, int width, int height)public void onSurfaceCreated(GL10 gl, EGLConfig config)

onSurfaceCreated 在窗口被创建时被调用,需要做一些必要的初始化工作:
public void onSurfaceCreated(GL10 gl, EGLConfig config){// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 黑色背景,设置清除屏幕时所用的颜色-->> (R, G, B, A) 取值: 0.0f-1.0f 。gl.glClearColor(0, 0, 0, 0);// 设置深度缓存 -->> 决定哪个物体先画。gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所作深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);} 
onSurfaceChanged 当窗口大小发生改变时被调用,不管窗口的大小是否已经改变,在程序开始时至少运行一次。
   在这个里面,我们要设置OpenGL的场景大小:

public void onSurfaceChanged(GL10 gl, int width, int height){float ratio = (float) width / height;//设置OpenGL场景的大小gl.glViewport(0, 0, width, height);//设置投影矩阵 -->> 增加透视.gl.glMatrixMode(GL10.GL_PROJECTION);//重置投影矩阵 -->> 恢复成原始状态.gl.glLoadIdentity();// 设置视口的大小 -->> 前4个参数确定窗口的大小,后2个参数分别是在场景中所能绘制深度的起点和终点。gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);// 选择模型观察矩阵gl.glMatrixMode(GL10.GL_MODELVIEW);// 重置模型观察矩阵gl.glLoadIdentity();}
onDrawFrame 在窗口内进行绘图操作。 在绘图之前,需要将屏幕清楚成前面指定的颜色,清楚深度缓存并且重置场景,
   然后就可以绘图了:

public void onDrawFrame(GL10 gl){// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);// 重置当前的模型观察矩阵gl.glLoadIdentity();// 具体的绘图操作开始 。。。  }


三、在主程序调用我们写好的接口:
   调用GLSurfaceView类的setRenderer方法将我们自己构建的GLRender类设置为默认的Renderer,
   然后,通过setContentView方法使Activity显示一个GLSurfaceView即可。

Renderer render = new GLRender();GLSurfaceView glView = new GLSurfaceView(this);glView.setRenderer(render);setContentView(glView);


到这里,我们的基本框架就搭建好了。







原创粉丝点击