现在的位置: 首页 > 综合 > 正文

Android 中的 OpenGL 简单入门(上)

2013年03月27日 ⁄ 综合 ⁄ 共 4032字 ⁄ 字号 评论关闭

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);
    	
    }

 

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

 

 

 

抱歉!评论已关闭.