Android 中的 OpenGL 简单入门(上)

来源:互联网 发布:js 删除一个tr 编辑:程序博客网 时间:2024/06/06 00:15

OpenGL(open graphics library)  

            Open GL 于 Open GL ES 之间的关系,,OpenGL ES 是专为内嵌和移动设备设计的一个2D/3D的一个轻量级图形库,,它是基于OpenGL API设计的,,,是OpenGL三维图形API的子集,针对手机,PDA和游戏主机等嵌入式设备设计的。。。在这里只介绍OpenGL 的一个简单入门,,因为OpenGL内容太丰富了,,,有兴趣的可深入研究。。。

           1,基本框架搭建

             Android中为我们提供了GLSurfaceView来非常好的现实OpenGL试图,而GLSurfaceView中则包含了一个专门用于渲染3D的接口,,Renderer,,所以这里我们先来构建一个子集的Renderer类

public class MyRenderer implements Renderer{            }//在MyRenderer中我们必须实现3个Renderer定义的3个方法,,,,public void onDrawFrame(GL10 gl){    }public void onSurfaceChanged(GL10 gl,int width,int lenght){     }public void onSurfaceCreated(GL10 gl,EGLConfig config){    }

 

当窗口被创建需要调用onSurfaceCreated,所以我们可以在里面对OpenGL做一些初始化工作,例如:

 

//告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);//黑色背景gl.glClearColor(0,0,0,0);//启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);

其中,glHint告诉OpenGL我们希望进行最好的透视修正,,这样可能稍微影响性能,但会使我们的试图效果看起来质量更高一点,,glClearColor设置清楚屏幕所用的颜色,色彩值的范围从0.0f-1.0f,,,0.0f代表最黑的情况,,这可能和我们以前所使用颜色取值范围不太一样。。方法中的4个参数分别(red ,green,,blue,,alpha),,范围都是0.1f到1.0f。。。(0,0,0,0)也就是黑色,,(1,1,1,1)也就是白色。。glShadeModel用于启动smooth shading(阴影平滑)。阴影平滑通过对多变型精细的混合色彩,并对外部光进行平滑。。

 

接下来我们还需要做的是一个最重要的步骤是关于depth buffer (深度缓存)的,将深度缓存摄像为屏幕后面的层,,它不断的对物体进入屏幕内部的深度进行跟踪。它的排序决定哪个物体先画,这样我们就不会将一个圆形后面的正方形画到圆形的线面去,,,深度缓存是OpenGL十分重要的部分,,

 

//设置深度缓存 gl.glClearDepthf(1.0f); //启动深度测试 gl.glEnable(GL10.GL_DEPTH_TEST); //所作深度测试的类型 gl.glDepthFunc(GL10.GL_LEQUAL);


 

当窗口的大小发生改变时会调用onSurfaceChanged方法,但是,不管窗口的大小是否已经改变,他在程序开始时至少会运行一次,,所以我们在该方法中设置OpenGL场景的大小,这里将OpenGL场景设置成他显示所在的窗口的大小,,,

 

//设置OpenGL场景的大小 gl.glViewport(0,0,width,height); //设置投影矩阵 gl.glMatrixMode(GL10.GL_PROJECTION);           //指明接下来的代码将影响 projection matrix(投影矩阵),投影矩阵是负责给场景增加透视的 //重置投影矩阵 gl.glLoadIdentity();                         //调用之后为场景设置透视图 //设置视口的大小 gl.glFrustumf(-ratio,ratio,-1,1,1,10);           //前面4个参数用于确定窗口的大小,后面两个参数分别是在场景中所能绘制深度的起点和终点 //最后,,,所有的绘图操作都在onDrawFrame方法中进行,在绘图之前,需要将屏幕清楚成前面所指定的颜色,清楚深度缓存并且重置场景,然后就可以进行绘图了//,, //清楚屏幕和深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);gl.glLoadIdentity();


 


 最后只需要调用GLSurfaceView类得setRenderer方法将我们自己的Renderer类设置为默认的Renderer即可

 

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


这些都是最基本得内容,但也是最重要的,,接着我们就可以在这个框架上面来进行开发了。。。

 

2,多边形

            在openGL中绘制的任何模型都会被分解为三角形和四边形这两种简单的图形,因此我们首先要用openGL来绘制一个三角形和一个四边形,我们现在只需要在MyRenderer中的onDrawFrame中添加绘制代码即可,但是,我们在这之前需要了解一下openGL中的坐标系,当调glLoadIdentity()之后,实际上市将当前点移动到了屏幕中心,X轴从左到右,Y轴从下到上,Z轴从里到外,,跟我们应用程序中坐标系还有最大的一个区别是,他的中心点,也就是0.0f点是在屏幕中心的,,,在我们android应用中layout的0.0f点是在屏幕的左上角。。

            我们都知道三角形由3个顶点组成,所以需要先定义出三角形和四边形的顶点坐标,这里的三角形不再处于2D平面中,而是在3D空间中,所以每一个坐标点都是有(x,y,z)构成,比如一个三角形的顶点数组如下:

 

int one = 0x10000;//三角形三个顶点private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{                       0,one,0,                 //上顶点                       -one,-one,0,          //左下点                       one,-one,0});         //右下点

 

四边形的顶点数组当然就是由4个顶点组成的了,,这里需要在左边绘制一个三角形,在右边绘制一个四边形,,所以需要用glTranslatef(X,Y,Z)将当前的重点移至要绘制三角形的位置,,

 

gl.glTranslatef(-1.5f,0.0f,-6.0f);             //沿着X轴左移1.5个单位,,Y轴不动,最后Z轴向内移动6.0f个单位。。。。。。

 

现在已经移动到了屏幕的作伴部分,并将试图推入屏幕背后足够的距离以便可以看见全部的场景,这里需要注意的是屏幕内移动的单位必须小于通过glFrustumf方法所设置的最远距离,否则显示不出来,,。。。我们为openGL设置一个顶点数组,所以需要告诉openGL要设置顶点这个功能:

 

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//gl.glVertexPointer(int size,int type,int stride,Buffer pointer)设置顶点数据,,size用于描述顶点的尺寸,type描述了顶点的类型,stride描述了补偿,pointer是顶点缓存,也就是我们创建///的顶点数组gl.glVertexPointer(3,GL10.GL_FIXED,0,triggerBuffer);


 

接下来我们就可以通过glDrawArrays(int mode,int first,int count)方法将这些顶点绘制出来,参数mode描述了绘制的模式,我们使用GL_TRIANGLES来表示绘制三角形,后面两个参数分别是开始位置和要绘制的顶点计数

gl.glDrawArrays(GL10,GL_TRIANGLES,0,3);

三角形绘制完成,,,四边形同理。。。。。

 

 

public void onDrawFrame(GL10 gl){        //清楚屏幕和深度缓存        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        //重置当前的模型观察矩阵        gl.glLoadIdentity();        //左移1.5单位,并移入屏幕6.0f        gl.glTranslatef(-1.5f, 0.0f, -6.0f);        //允许设置顶点        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);        //设置三角形        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);        //绘制三角形        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);        //重置当前的模型观察矩阵        gl.glLoadIdentity();        //右移1.5单位,并移入屏幕6.0f        gl.glTranslatef(-1.5f, 0.0f, -6.0f);        //设置和绘制四边形        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);        //取消顶点设置        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);        }


 

!!! 今天太瞌睡了,,关于图形着色和旋转,以及纹理贴下次描述

 

 

 

原创粉丝点击