您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Android下Opengl_ES导引1
Android下OpenglES导引ch2zh1@tom.com编译(2011-8-7)-第一部分这里打算写几篇关于Android手机上的openGLES导引文章。对于不同的设备,OpenGLES的理论是相同的,所以,也可以很容易就把这个导引转换到其它平台上。我不能总记得我曾在什么地方找到过特殊信息,所以这里给出的参考文献就引文来讲可能并不总是正确的。如果你认为我这里引用了你的资料,而又忘记把你的名字添加到引用者中,请给我发邮件。在例子代码中,每一个函数都有两个不同的链接。一个链接是链接到Android资料,而后一个将链接到OpenGL资料。例如:gl.glClearColor(0.0f,0.0f,0.0f,0.5f);//OpenGL资料。注:在翻译文档中,不考虑资料的链接,如果想查看原文,请收索《OpenGLESTutorialforAndroid》。现在就让我们开始吧。在这个导引中我将向你展示怎样设置你的OpenGL观察控件,这总是一个最好的开始。设置OpenGLES观察设置OpenGL观察并不困难,而且在Android上它还相当容易。实际上你只需最两件事情就可以了。GLSurfaceViewGLSurfaceView是Android1.5中一个API类,用于辅助编写OpenGLES应用的。提供胶粘代码来连接OpenGLES到Android的View观察系统。提供胶粘代码来使OpenGLES与活动的生命期一同工作。使它易于选择一个适当的帧缓冲像素格式。建立个管理单独的演播线程,使动画效果平滑。提供易于使用的排错工具,跟踪OpenGLESAPI的调用和检查错误。如果你想要快速的开发OpenGLES应用,现在就应该可以开始了。唯一的一个你需要调用的函数是:PublicvoidsetRender(GLSurfaceView.Renderrenderer)请阅读GLSurfaceView来获得更多的帮助。GLSurfaceView.RendererGLSurfaceView.Renderer是一个普通的演播器接口。在你自己的演播器实现中,应该包含所有演播一个帧的调用。有三个函数需要实现://在表面建立时或再建立时调用的函数publicvoidonSurfacCreated(GL10gl,EGLConfigconfig)//画当前帧时调用publicvoidonDrawFrame(GL10gl)//表面尺寸改变时调用PublicvoidonSuraceChanged(GL10gl,intwidth,intheight)onSurfaceCreated在这里通常设置演播期间不改变的所有东西。比如屏幕要清除到的颜色,允许Z-缓冲等。onDrawFrame这里是实际绘画发生的地方。onSurfaceChanged如果你的设备支持水平和垂直翻转,当翻转发生时,这个函数则被调用。在这里你要做的是设置比率的变化。请阅读GLSurfaceView.Renderer来获得更多的帮助。把这些都穿连到一起首先建立一个活动(activity),我们要保持它的清晰和简单。packagese.jayway.opengl.tutorial;importandroid.app.Activity;importandroid.opengl.GLSurfaceView;importandroid.os.Bundle;publicclassTutorialPartIextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);GLSurfaceViewview=newGLSurfaceView(this);view.setRenderer(newOpenGLRenderer());setContentView(view);}}我们的演播器有一小点设置工作要做,代码如下,我们也更详细一点地解释这些代码。packagese.jayway.opengl.tutorial;importjavax.microedition.khronos.egl.EGLConfig;importjavax.microedition.khronos.opengles.GL10;importandroid.opengl.GLU;importandroid.opengl.GLSurfaceView.Renderer;publicclassOpenGLRendererimplementsRenderer{/**(non-Javadoc)**@see*android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(javax.*microedition.khronos.opengles.GL10,javax.microedition.khronos.*egl.EGLConfig)*/publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){//设置北京那个颜色到黑色(rgba).gl.glClearColor(0.0f,0.0f,0.0f,0.5f);//OpenGLdocs.//允许阴影平滑,默认也可以,不是必须的gl.glShadeModel(GL10.GL_SMOOTH);//OpenGLdocs.//深度缓冲设置gl.glClearDepthf(1.0f);//OpenGLdocs.//允许深度检测gl.glEnable(GL10.GL_DEPTH_TEST);//OpenGLdocs.//要做的深度检测类型gl.glDepthFunc(GL10.GL_LEQUAL);//OpenGLdocs.//真是细微的透视计算gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,//OpenGLdocs.GL10.GL_NICEST);}/**(non-Javadoc)**@see*android.opengl.GLSurfaceView.Renderer#onDrawFrame(javax.*microedition.khronos.opengles.GL10)*/publicvoidonDrawFrame(GL10gl){//清除屏幕和深度缓冲gl.glClear(GL10.GL_COLOR_BUFFER_BIT|//OpenGLdocs.GL10.GL_DEPTH_BUFFER_BIT);}/**(non-Javadoc)**@see*android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(javax.*microedition.khronos.opengles.GL10,int,int)*/publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){//设置当前视口到新尺寸gl.glViewport(0,0,width,height);//OpenGLdocs.//选择投影矩阵gl.glMatrixMode(GL10.GL_PROJECTION);//OpenGLdocs.//重置投影矩阵gl.glLoadIdentity();//OpenGLdocs.//计算窗口的外观比率GLU.gluPerspective(gl,45.0f,(float)width/(float)height,0.1f,100.0f);//选择模式观察矩阵gl.glMatrixMode(GL10.GL_MODELVIEW);//OpenGLdocs.//重置模式观察矩阵gl.glLoadIdentity();//OpenGLdocs.}}全屏显示把下面这些行代码加到OpenGLDemo类中,这将设置应用到全屏显示。publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);//(NEW)getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//(NEW)...//前面的代码}这无论在外观和运行上都漂亮得多。如果你编译并运行这个Demo,将会看到一个完美的黑色屏幕。-第二部分前面的第一部分说明了怎样设置GLSurfaceView的所有技术。一定要仔细阅读,这实际上是能够继续下去的重要条件。建立多边形在这一节中我们将首先建立和演播一个多边形。建立3D模式使用较少的元素(顶点,边,表面,和多边形),这些都可以单独处理。顶点(Vertex)顶点(vertex/vertices)是3D模型的最小构建块。一个顶点就是一个点,在这一点上两个或多个边交接。在3D模型中,一个顶点可以在所有相关联的边、面和多边形中共享。顶点也可以是照相机或光源位置的表示。在下图中你可以看到用黄色标注的顶点。要在Android中定义顶点,我们使用浮点数组,把它们放进字节缓冲来获得较好的性能,请看右侧的图像,匹配顶点的代码如下:privatefloatvertices[]={-1.0f,1.0f,0.0f,//0,左上-1.0f,-1.0f,0.0f,//1,坐下1.0f,-1.0f,0.0f,//2,右下1.0f,1.0f,0.0f,//3,右上};//一个浮点是4个字节,因此要用顶点数乘以4。ByteBuffervbb=ByteBuffer.allocateDirect(vertices.length*4);vbb.order(ByteOrder.nativeOrder());FloatBuffervertexBuffer=vbb.asFloatBuffer();vertexBuffer.put(vertices);vertexBuffer.position(0);不要忘了浮点是4字节,用顶点数乘以它来获得正确的缓冲尺寸。OpenGLES在演播时有一种途径使用这些函数。默认情况下,绝大多数这些函数都是不被允许的,所以你必须记住要打开你可能要是用的函数。你也可能需要告诉这些函数所要做的工作。因此,在我们这个顶点的例子中,需要告诉OpenGLES准备好了用我们建立的顶点缓冲来进行工作,我们还需要告诉它缓冲在哪儿。//在演播时允许顶点缓冲写入和使用。gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//OpenGLdocs.//指定顶点数组的位置和格式//演播时使用的坐标gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);//OpenGLdocs.在使用完后一定不要忘了禁止它。//禁止顶点缓冲gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);//OpenGLdocs.边(Edge)边是在两个顶点之间的线段。它们是表面和多边形的边缘线。在3D模型中,便可以在两个邻近表面或多边形之间共享。转换一条边,影响所有相连接的顶点,面和多边形。在OpenGLES中,我们不能定义边,你只能通过给定的顶点定义面,这将至少构建三条边。如果你想要修改一条边,你应该改变产生这条边的两个顶点。在下图中,你可以看到用黄色标注的边。面(Face)面是一个三角形,面就是这三个角顶点和三个边所围成的表面,变换一个面影响所有关联的顶点,边和多边形。顺序的关系在环绕面的时候,重要都是右方向环绕,因为环绕方向定义了面的那一边是正面那一边是背
本文标题:Android下Opengl_ES导引1
链接地址:https://www.777doc.com/doc-3378271 .html