android 中的openGL使用学习笔记

来源:互联网 发布:linux网络代理服务器 编辑:程序博客网 时间:2024/05/21 15:44

关于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)方法;

未完待续------


原创粉丝点击