其实,我个人学习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);
到这里,我们的基本框架就搭建好了。