鲲鹏it教育android课件-30.opengl基础应用下es导引_第1页
鲲鹏it教育android课件-30.opengl基础应用下es导引_第2页
鲲鹏it教育android课件-30.opengl基础应用下es导引_第3页
鲲鹏it教育android课件-30.opengl基础应用下es导引_第4页
鲲鹏it教育android课件-30.opengl基础应用下es导引_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AndroidOpenglES编译(2011-8-这里打算写几篇关于Android上的openGLES导引文章。对于不同的设备,OpenGL不总是正确的。如果你认为我这里了你的资料,而又忘记的名字添加到者中,个将到OpenGL资料。例如:资料。OpenGLES观GLSurfaceViewAndroid1.5APIOpenGLESOpenGLESAndroidViewOpenGLES提供易于使用的排错工具,OpenGLESAPI的调用和检查错误。OpenGLESPublicvoidsetRender(GLSurfaceView.Render请阅读GLSurfaceView来获得的帮助publicvoidonSurfacCreated(GL10gl,EGLConfigpublicvoidonDrawFrame(GL10PublicvoidonSuraceChanged(GL10gl,intwidth,intheight)许Z-缓冲等。请阅读GLSurfaceView.Renderer来获得的帮助把这些都穿连到packagese.jayway.opengl.tutorial;importandroid.app.Activity;importimportpublicclassTutorialPartIextendsActivity/**Calledwhentheactivityisfirstcreated.*/publicvoidonCreate(BundlesavedInstanceState){GLSurfaceViewview=newGLSurfaceView(this);view.setRenderer(newOpenGLRenderer());}}packageimportjavax.microedition.khronos.egl.EGLConfig;importimportimportpublicclassOpenGLRendererimplementsRenderer(non-*microedition.khronos.opengles.GL10,publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig)//设置那个颜色到黑色(rgbagl.glClearColor(0.0f,0.0f,0.0f, //OpenGLgl.glShadeModel(GL10.GL_SMOOTH);//OpenGLgl.glClearDepthf(1.0f);//OpenGLgl.glEnable(GL10.GL_DEPTH_TEST);//OpenGLgl.glDepthFunc(GL10.GL_LEQUAL);//OpenGL//真是细微的计gl.glHint(GL10.GL__CORRECTION_HINT,//OpenGL}(non-publicvoidonDrawFrame(GL10gl)gl.glClear(GL10.GL_COLOR_BUFFER_BIT|//OpenGL}(non-microedition.khronos.opengles.GL10,int,publicvoidonSurfaceChanged(GL10gl,intwidth,intheight)gl.glViewport(0,0,width,height);//OpenGLgl.glMatrixMode(GL10.GL_PROJECTION);//OpenGLgl.glLoadIdentity();//OpenGLGLU.glu(gl,(float)width/(float)height,0.1f,100.0f);gl.glMatrixMode(GL10.GL_MODELVIEW);//OpenGLgl.glLoadIdentity();//OpenGL}}全屏显publicvoidonCreate(BundlesavedInstanceState){this.requestWindowFeature(Window.FEATURE_NO_TITLE);//WindowManager.LayoutParams.FLAG_FULLSCREEN);//}建立顶点要在Androidprivatefloatvertices[]=- 1.0f, //0,-1.0f,-1.0f, //1,1.0f,-1.0f, //2, 1.0f, //3,44ByteBuffervbb=ByteBuffer.allocateDirect(vertices.length*4);FloatBuffervertexBuffer=vbb.asFloatBuffer();了浮点是4字节,用顶点数乘以它来获得正确的缓冲尺寸作。因此,在我们这个顶点的例子中,需要告诉OpenGLES准备好了用我们建立的顶点缓冲gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//OpenGLgl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);//OpenGL在使用完后一定了它//顶点缓gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);//OpenGL边3DES面顺序的关glFrontFace来改变gl.glFrontFace(GL10.GL_CCW);//OpenGLgl.glEnable(GL10.GL_CULL_FACE);//OpenGLgl.glCullFace(GL10.GL_BACK);//OpenGL多边形privateshort[]indices={0,1,2,0,2,3//短整数(short)2。ByteBufferibbByteBuffer.allocateDirect(indices.length*2);ShortBufferindexBuffer=ibb.asShortBuffer();了短整数占两个字节,所以用顶点数乘以2是字节缓冲的正确尺寸演播器,是要在屏幕上观察效果的时候了。有两个函数用来画图须确定使用哪一个。这两个, voidglDrawArrays(intmode,intfirst,intcount)//OpenGLdocsglDrawArraysverticesBuffer voidglDrawElements(intmode,intcount,inttype,//OpenGLdocsBufferglDrawElements所以这些方法统统讨论一遍。什么是演播的原始风格v0,v1,v2,v2,v1,v3v2,v3,v4,GL_TRIANGLE_STRIP,v0,v1,v2,v0,v2,v0,v3,v4,packageimportjava.nio.ByteBuffer;importjava.nio.ByteOrder;importjava.nio.FloatBuffer;importimportjavax.microedition.khronos.opengles.GL10;publicclassSquare{privatefloatvertices[]=- 1.0f, 0,-1.0f,-1.0f, 1,1.0f,-1.0f, 2, 1.0f, 3,privateshort[]indices={0,1,2,0,2,3privateFloatBufferprivateShortBufferpublicSquare()//一个浮点数有节,因此需要用顶点数乘以4。vertexBuffer=vbb.asFloatBuffer();indexBuffer=ibb.asShortBuffer();}@parampublicvoiddraw(GL10gl)gl.glFrontFace(GL10.GL_CCW);//OpenGLgl.glEnable(GL10.GL_CULL_FACE);//OpenGL//什么样的遮蔽面被删除(指定背面)gl.glCullFace(GL10.GL_BACK);//OpenGLgl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//OpenGLgl.glVertexPointer(3,GL10.GL_FLOAT,0,//OpenGL}

gl.glDrawElements(GL10.GL_TRIANGLES,indices.length,//OpenGLGL10.GL_UNSIGNED_SHORT,indexBuffer);//顶点缓冲gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);//OpenGL//面遴选gl.glDisable(GL10.GL_CULL_FACE);//OpenGL}在OpenGLRenderer类中,须要初始化这个方块Squaresquare=newpublicvoidonDrawFrame(GL10gl)gl.glClear(GL10.GL_COLOR_BUFFER_BIT|//OpenGLsquare.draw(gl);//(NEW}OpenGLES0,0,0OpenGLES前移动画图位置稍许进入到屏幕内部几步:4gl.glTranslatef(0,0,-4);//OpenGL在随后的各节中讲解各种不同的变换OpenGLES//用同一性矩阵替换当前矩阵(画图点返回坐标原点gl.glLoadIdentity();//OpenGLOpenGL旋转变换还可以环绕这个中心旋转这比例变换用这种纸笔方式的形象化解释稍微有点OpenGL正方向望向原点时,逆时针旋转被作为正方向旋转。在开始时,如果没做任何变换,坐标轴的是:X轴变 voidglTranslatef(floatx,floaty,floatz)//OpenGL加了{x:3,y:2}。简单地{x:-2,y:1}{x:3,y:2}{x:-2+3,y:1+2}={x:1,y:3}3维情况下也是相同的,如果我们定位一个点:{x:1,y:2,z:0}3个单位,就应该加{x:0,y:0,z:-3}{x:1,y:1,z:-3}在上一节的例子中,我们移动正方形进入屏幕4个单位,正好能够看到整个正方//4单位.gl.glTranslatef(0,0,4);OpenGLdocs.食指是XZ3Dx,y,z旋 voidglRotatef(floatangle,floatx,floaty,floatz)//OpenGLdocs.旋转值是OpenGL做多从旋转时,顺序是重要x,y,z)glRotatef(angle,x,y,z)glRotatef(-angle,x,y,z)。但是,如果你做了几次旋转,如下:gl.glRotatef(90f,1.0f,0.0f,0.0f);//OpenGLgl.glRotatef(90f,0.0f,1.0f,0.0f);//OpenGLdocs.gl.glRotatef(90f,0.0f,0.0f,1.0f);//OpenGLgl.glRotatef(90f,-1.0f,0.0f,0.0f);//OpenGLdocs.gl.glRotatef(90f,0.0f,-1.0f,0.0f);//OpenGLdocs.gl.glRotatef(90f,0.0f,0.0f,-1.0f);//OpenGLgl.glRotatef(90f,0.0f,0.0f,-1.0f);//OpenGLdocs.gl.glRotatef(90f,0.0f,-1.0f,0.0f);//OpenGLdocs.gl.glRotatef(90f,-1.0f,0.0f,0.0f);//OpenGL多个旋转,顺序是重要的如果从轴的正位置向原点看过去,正角度是逆时针旋转角变换与旋比例 voidglScalef(floatx,floaty,floatz)//OpenGLgl.glScalef(2f,2f,2f2平移变换与比例变换(Translate&20.5。gl.glTranslatef(2,0,0);//OpenGLdocs.gl.glScalef(0.5f,0.5f,0.5f);//OpenGLdocs.你首先变换比例为0.5,然后再平移变换2单位,结果将是仅移动了一个单位的gl.glScalef(0.5f,0.5f,0.5f);//OpenGLdocs.gl.glTranslatef(2,0,0);//OpenGLdocs.装载单位坐标系,压入与弹出矩的变换总是一个变换的基础上进行。你需要能重置网栅坐标的位置。 voidglLoadIdentity()//OpenGLdocs.glLoadIdentityglLoadMatrix1000010000100001 voidglPushMatrix()//OpenGLglPushMatrixglPushMatrix voidglPopMatrix()//OpenGLglPushMatrixglLoadIdentity为了使用新知识做一些事情,我们给出三个方块,分别称为A,B,C。使用比例变换,B小于A50%,C小于B50%AB针绕ACBpublicvoidonDrawFrame(GL10gl)gl.glClear(GL10.GL_COLOR_BUFFER_BIT|//用一致性(单位)10gl.glTranslatef(0,0,-//方块//逆时针旋转方块Agl.glRotatef(angle,0,0,1);//画方块A//方块//在平移之前先旋转方块B,使它围绕Agl.glRotatef(-angle,0,0,//平移方块Bgl.glTranslatef(2,0,0);//比例变换它到方块A50%gl.glScalef(.5f,.5f,//画方块B//方块//产生围绕Bgl.glRotatef(-angle,0,0,gl.glTranslatef(2,0,//变换比例到方块B50%gl.glScalef(.5f,.5f,.5f);gl.glRotatef(angle*10,0,0,//画方块C//恢复C//恢复B}publicclassOpenGLRendererimplementsRenderer{privateSquaresquare;privatefloatangle;//Don'tforgettoadd添加色一般而言,色彩色不需要解释的。OpenGLRGBA(红,绿,栏,透明度)的色彩模型。头三个量本身就可以理解,第四个是,就是在固体实际应该的颜色。如果想要了解关于颜色的信息,请参考:RGBcolormodel-Wikipedia,thefree0..1,0#001255(#FF)。网栅最容易的方法是顶点,这里打算使用两种不同的顶点方平面平面实际是很容易的,就是告诉OpenGLES在打算演播时使用OpenGLES色后,直到这个颜色被改变之前,OpenGLES都是用这个颜色进行着OpenGLESOpenGLES 1,1,1alpha1。这些值表示不透明的FlatColoredSquareDrawgl.glColor4f(0.5f,0.5f,1.0f,1.0f);//我这里通常使用如上的注释0x8080FFFF用于可读性。这使得在回忆代码Drawpublicvoiddraw(GL10gl){gl.glColor4f(0.5f,0.5f,1.0f,1.0f);FlatColoredSquareSquarepublicclassOpenGLRendererimplementsRenderer{privateFlatColoredSquareflatSquare;//CHANGEDpublicOpenGLRenderer()flatSquare=newFlatColoredSquare();//}publicvoidonDrawFrame(GL10gl)flatSquare.draw(gl);//了这里的改}编译和运行这个应用,建会看到一个平面为蓝色的大方块。为了比较平滑方块,我们向上移动这个平面方块。publicvoidonDrawFrame(GL10gl){71.5gl.glTranslatef(0,1.5f,-}注意,用平面不需要告诉OpenGLES打开或关闭。OpenGLES使用平面平滑在给每一个顶点分配颜色时,就可以获得平滑。OpenGLES将解释顶点之间的颜色,并且获得一种平滑的颜色效果。也像平面OpenGLESOpenGLESSmoothColoredSquareSquarepublicclassSmoothColoredSquarefloat[]colors=0红1绿2蓝3紫(1f,0f,0f,1f1.0f,1.0f,0.0fpublicSmoothColoredSquare()4字节,颜色(RGBA)*4ByteBuffercbb=ByteBuffer.allocateDirect(colors.length*4);colorBuffer=cbb.asFloatBuffer();}privateFloatBufferOpenGLpublicvoiddraw(GL10gl)gl.glVertexPointer(3,GL10.GL_FLOAT,0,

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//NEWLINE//颜色缓冲的位置和格gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer);//NEWgl.glDrawElements(GL10.GL_TRIANGLES,GL10.GL_UNSIGNED_SHORT,//颜色缓}publicclassOpenGLRendererimplementsRenderer{privateFlatColoredSquareflatSquare;privateSmoothColoredSquaresmoothSquare;//NEWLINEpublicOpenGLRenderer()flatSquare=newsmoothSquare=newSmoothColoredSquare();//NEW}publicvoidonDrawFrame(GL10gl)gl.glTranslatef(0,-3f,}3D2D从第二讲的源码开始,展示平面和立方体,然后它们的相关元素的注释。Meshpackagese.jayway.opengl.tutorial.mesh;publicclassMesh{}从前一个例子中增们的绘画功能//顶点缓privateFloatBufferverticesBuffer=//索引缓冲privateShortBufferindicesBuffer=//索引数privateintnumOfIndices=-//平面颜privatefloat[]rgba=newfloat[]{1.0f,1.0f,1.0f,//平滑颜privateFloatBuffercolorBuffer=publicvoiddraw(GL10gl)//逆时针旋//允许表面遮//那些表面在遮盖时要删除(背面//在演播期间允许顶点缓冲写//指定定点数组坐标演播时的数据格式和位gl.glVertexPointer(3,GL10.GL_FLOAT,0,//设置平面颜gl.glColor4f(rgba[0],rgba[1],rgba[2],//平滑颜if(colorBuffer!=null)//允许演播时使用颜色数组缓//缓冲位gl.glColorPointer(4,GL10.GL_FLOAT,0,}gl.glDrawElements(GL10.GL_TRIANGLES,numOfIndices,GL10.GL_UNSIGNED_SHORT,indicesBuffer);//顶点缓冲//表面遮}而且与我们一些章节中看到的十分相像。protectedvoidsetVertices(float[]vertices)//浮点占4字节,因而,顶点数乘以verticesBuffer=vbb.asFloatBuffer();}protectedvoidsetIndices(short[]indices)//短整数占2字节,因而顶点数乘以indicesBuffer=ibb.asShortBuffer();numOfIndices=indices.length;}protectedvoidsetColor(floatred,floatgreen,floatblue,floatalpha){//设置平面颜色rgba[0]=red;rgba[1]green;rgba[2]=blue;rgba[3]=}protectedvoidsetColors(float[]colors)//浮点占4字ByteBuffercbb=ByteBuffer.allocateDirect(colors.length*4);colorBuffer=cbb.asFloatBuffer();}//Translateparams.publicfloatx=0;publicfloaty=0;publicfloatz=0;//Rotateparams.publicfloatrx=0;publicfloatry=0;publicfloatrz=gl.glTranslatef(x,y,z);gl.glRotatef(rx,1,0,gl.glRotatef(ry,0,1,gl.glRotatef(rz,0,0,平面到此,我们应该统一术语,宽度是X轴上的长度,深度是Z轴上的长度,而高度则是Y用的。如果你在X,Y上建立了一个平面,而且Z并不都是0,比如给定Z一个随机的范围从-0.1到0.1,这在游戏中将得到可用于地平面的图形,如果在配以一所以,正好需要把它们成两个三角形。//段public//确定的平面尺寸,然而却仍然仅有一个分publicPlane(floatwidth,float//全部参数设置publicPlane(floatwidth,floatheight,intwidthSegments,int4packagese.jayway.opengl.tutorial.mesh;publicclassPlaneextendsMesh{publicPlane(){this(1,1,1,1);}publicPlane(floatwidth,floatheight){this(width,height,1,1);}publicPlane(floatwidth,floatheight,intwidthSegments,intheightSegments){float[]vertices=newfloat[(widthSegments+1)*(heightSegments+1)*3];short[]indices=newshort[(widthSegments+1)*(heightSegments+1)*6];floatxOffset=width/-2;floatyOffset=height/-floatxWidth=width/(widthSegments);floatyHeight=height/(heightSegments);intcurrentVertex=0;intcurrentIndex=shortw=(short)(widthSegments+for(inty=0;y<heightSegments+1;y++){for(intx=0;x<widthSegments+1;x++){vertices[currentVertex]=xOffset+x*xWidth;vertices[currentVertex+1]=yOffset+y*yHeight;vertices[currentVertex+2]=0;currentVertex+=intn=y*(widthSegments+1)+if(y<heightSegments&&x<widthSegments)//Faceindices[currentIndex]=(short)n;indices[currentIndex+1]=(short)(n+1);indices[currentIndex+2]=(short)(n+//Faceindices[currentIndex+3]=(short)(n+1);indices[currentIndex+4]=(short)(n+1+w);indices[currentIndex+5]=(short)(n+1+w-1);currentIndex+=}}}}}立方体下一步就是建立一个立方体给出一个你仅可以设置高宽和深的立方体,publicCube(floatwidth,floatheight,floatpackagese.jayway.opengl.tutorial.mesh;publicclassCubeextendsMesh{publicCube(floatwidth,floatheight,floatdepth) /=height/= /=vertices[]={---0--1-2--3--4-56-7indices[]=3,1,2,}}publicCube(floatwidth,floatheight,floatintwidthSegments,intheightSegments,intOpenGLRendererpublicOpenGLRenderer()//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论