关于openGL的介绍网上随便搜搜就有,这里就不再介绍了。本文主要说一下openGL在android中的初步使用。
在andorid中我们需要通过GLSurfaceView来将openGL视图显示在Activity中。而GLSurfaceView需要一个实现了Renderer接口的类来渲染视图。接下来我们就来构建一个自己的Renderer类:
首先,新建一个实现了Renderer接口的类取名MyRenderer,并重写如下方法
//绘制当前屏幕的代码写在此方法中
public void onDrawFrame(GL10 gl)
{}
// 当屏幕大小改变时被调用
public void onSurfaceChanged(GL10 gl, int width, int height)
{}
//当窗口被创建时被调用,进行一些初始化工作
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{}
onSurfaceCreated方法会在窗口被创建时调用,通常我们在此方法中对openGL做一些初始化工作,比如
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
// 设置背景为黑色(rgba)
gl.glClearColor(0, 0, 0, 0);
// 设置深度缓存几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画,
//启用深度缓存可以让 OpenGL知道绘制在场景中的物体的深度关系,这样我们绘制物体时,
//就不会将后面的物体绘制到前面的物体上来。
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方法,我们在此方法中调用gl.glViewport(0, 0, width, height)来设置openGL的场景大小。并通过如下代码来使openGL绘制物体时有透视的效果
float ratio = (float) width / height;
//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
// 设置视口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
在onDrawFrame方法中写绘图所用的具体代码,通在常此方法中先清除屏幕缓存和深度缓存并重置矩阵
//清除深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//重置矩阵
gl.glLoadIdentity();
想要绘图我们还需要通过glVertexPointer(int size,int type,int stride,Buffer pointer)方法来告诉openGL所要绘制的图形的顶点数据,例如绘制一个三角形我们可以定义顶点坐标如下:private float vertex[] = {
0.0f, 1.0f,0.0f, //上顶点
-1.0f,-1.0f,0.0f, //左下点
1.0f,-1.0f,0.0f, //右下点
};
方法中的参数size表示点的维度,type描述顶点的类型,stride描述顶点与顶点间的字节偏移量,pointer是存放顶点坐标数据
的缓存引用,在openGL中为了提高效率,glVertexPointer仅接受与语言无关的本地缓冲区,而不是java浮点数组,
因此我们需要使用java.nio类将浮点数组转换为本地缓冲区。
步骤如下:
ByteBuffer tbb = ByteBuffer.allocateDirect(vertex.length * 4);//4表示每个浮点数占4个字节
tbb.order(ByteOrder.nativeOrder());
TrianBuffer = tbb.asFloatBuffer();
TrianBuffer.put(vertex);
TrianBuffer.position(0);
设置好了顶点数组,我们就可以通过 glDrawArrays(int mod e,int f irst,int count) 函数将这些顶点绘制出来,
mode描述了绘制模式,指定它为GLTRIANGLES来表示绘制三角形:
绘制前需要通过gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);启用顶点数组,绘制完后记得要调用gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);关闭
接下来我们需要在Activity的onCreate方法中将openGL绘制的视图显示出来,步骤如下:
先创建一个GLSurfaceView对象glview,然后调用glview.setRenderer(render);此处的render引用即为我们刚刚所创建的MyRenderer类的实例对象。
最后调用setContentView(glview)方法;
未完待续------