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

下载本文档

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

文档简介

androidopengles什么是OpenGLOpenGLESOpenGLforEmbeddedSystem)OpenGLOpenGLESOpenGL标准,以适应如,PDA或其它消费者移动终端的显示系统。KhronosGroupOpenGLESOpenGL与OpenGLES的关系OpenGLES是基于桌面版本OpenGLOpenGLES1.0基于OpenGL1.32003OpenGLES 基于OpenGL1.5,2004OpenGLES2.0基于 在2007年发OpenGL2.0向下兼容OpenGL1.5 而OpenGLES2.0和OpenGLES1.x不兼容,是两种完全不同的实现。OpenGLES管道(Pipeline)OpenGLES1.x的工序是固定的,称为Fix-FunctionPipeline,可以想象一个带有很多控制开关的机器,尽管加工的工序是OpenGLES2.0允许提供编程来控制一些重要的工序,一些“繁琐”的工序比如栅格化等仍然是固定的。(这些开关被就是state,注意应该尽量少的改变state,以免影响性能)管道“工序”TransformationStageRasterizationOpenGLES支持的基本图形为点Point,线Line,Triangle,其它所有图形都是通过这几种基本几何图形组合而成Rasterizer来生成像素信息,称为”Fragments“。对于Fragment在经过TextureProcessingColorSumFog等处理并将最终处理结果存放在内存中(称为FrameBuffer)。OpenGL2.0ProgrammableOpenGLESAPI命名习定义的常量都以GL_为前缀。比如OpenGLES指令以gl开头,比如某些OpenGL3f4f结尾,34代表参数的个数,f代表参数类型为浮点数,如gl.glColor4f,i,x代表int如gl.glColor4x对应以v结尾的OpenGLES(Vector),如8-bit整数对应到byte类型,16-bit对应到short类型,32-bit整数(包括GLFixed)int32-bit浮点数对应到float类GL_TRUE,GL_FALSE对应到booleanC字符串((char*))对应到JavaUTF-8创建简单的opengles

基本几何图形定义OpenGLES支持绘制的基本几何图形分为三类:点,线段,三角形。也就是说OpenGLES只能绘制这三种基本几何图2D3D图形都是通过这三种几何图形构造而成的。OpenGLES voidglDrawArrays(intmode,intfirst,intcount)使用VetexBuffer来绘制,顶点的顺序由vertexBuffer中的顺序 voidglDrawElements(intmode,intcount,inttype,Bufferindices),可以重新定义顶点的顺序,顶点的顺序由indicesBuffer指定。mode列表:GL_POINTS绘制独立的点、GL_LINE_STRIP绘制一条线段、GL_LINE_LOOP绘制一条封闭线段(首位相连)、GL_LINES绘制多条线段、GL_TRIANGLES绘制多个三角形(两两不相邻)、GL_TRIANGLE_STRIP绘制多个三角形(两两相邻)、GL_TRIANGLE_FAN以一个点为顶点绘制多个相邻的三角形glEnableClientStateglDisableClientState可以控制的pipeline开关可以有:GL_COLOR_ARRAY颜色),GL_NORMAL_ARRAY法线),GL_TEXTURE_COORD_ARRAY材质GL_VERTEX_ARRAY(顶点),GL_POINT_SIZE_ARRAY_OES等。glColorPointer(intsize,inttype,intstride,Bufferpointer)glVertexPointer(intsize,inttype,intstride,Bufferpointer)glTexCoordPointer(intsize,inttype,intstride,Bufferpointer)glNormalPointer(inttype,intstride,Bufferpointer)OpenGLES内部存放图形数据的BufferCOLOR,DEPTH深度信息)COLOR和DEPTHBuffer。三维坐标系及坐标变换初步OpenGLES图形库最终的结果是在二维平3D物体,这个过程可以分成三个部分:坐标变换,坐标变换通过使用变换矩阵来描述,因此学习3D绘平移,缩放,正侧投影,投影等。在最终绘制到显示器(2D屏幕),需要建立起变换后的坐标和屏幕像间的对应关系,这通常称为“视窗”坐标变换(Viewport)如果我们使用照相机拍照的过程做类比,可以更好的理解3D坐标变换拍照时第一步是架起三角架并把相机的镜头指向需要拍摄的场3D变换为viewingtransforation(平移或是选择mera)如摄影师给架好三角架后给你拍照时,可以要让你调整站立3D绘制就是Modelingtransformation(调整3D绘图则为Projectiontransformation(裁剪投影场景)。NDC),此时你可以使用缩放放大功能显示的部分。对应3D绘图相当于viewporttransformation(可以对最终的图像对于Viewingtransformation(平移,选择相机)和Modeling在OpenGLES使用GL10.GL_MODELVIEW来同时指定viewingmatrixmodeling使用GL10.GL_PROJECTION指定投影变换,OpenGL支持透使用glViewportViewport通用的矩阵变换这里介绍对应指定的坐标系(比如viewmodelprojection或是AndroidOpenGLES14X4IdentityMatrixglMultMatrix*()允许指定任意矩阵和当前矩阵glMatrixMode().OpenGLES可以运行指定GL_PROJECTION,GL_MODELVIEW等坐标系,后续的矩阵操glTranslatef(),glRotatef()方法public voidglTranslatef(floatx,floaty,floatz)用于方法public voidglRotatef(floatangle,floatx,floaty,floatz)用来实现选择坐标变换,单位为角度。(x,y,z)定义旋转的参照矢量方方法public voidglScalef(floatx,floaty,floatz)用于缩放 voidglLoadIdentity() void和 voidglPopMatrix()在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。ViewingModeling(MODELVIEW)变ndroidOpenGLES的GLU包有一个辅助函数gluLookAt提供一个更直观的方法来设置modelview变换矩阵:voidgluLookAt(GL10gl,floateyeX,floateyeY,floateyeZ,floatcenterX,floatcenterY,floatcenterZ,floatupX,floatupY,floatupZ)eyex,eyey,eyeztarx,tary,tarzupx,upy,upz指定观测点方向为“上”的向量。下面代码设置当前Matrix模式为Projection投影矩阵:OpenGLES可以使用两种不同的投影变换:投影(Projection)和正侧投影(OrthographicProjection)。AndroidOpenGLES提供了一个辅助方法glu()可以更简单的来定GLU.glu(GL10gl,floatfovy,floataspect,floatzNear,floatzFar)fovy:定义视锥的viewaspect:zNear:zFar:正侧投影(Orthographic定义3D模型的前面和后面下面代码设置逆时针方法为面的“前面“后面”设置:gl.glEnable(GL10.GL_CULL_FACE);然后明确指FrameBuffer、DepthBufferOpenGLES中的FrameBuffer指的是存1280X1024,如果屏幕支持24位真彩色(RGB),则这个屏幕区域的内存至少需要1024X1280X3个字节。此外如果需要支持(Alpha),4在最终OpenGLES写入这些Buffer时,OpenGLES提供一些MaskColorBufferRGBADepthBuffer等,这些Mask函数可以打开或是关闭某个通道,只有通道打开后,对应的分量才会写入指定Buffer,比如你可以关闭红色通道,这样最后写道ColorBuffer中就不含有红色。OpenGLESDepthBuffer保存了像素与观测点之间的距离信息,在3D图形时,将只绘制可见的面而不去绘制隐藏的面,这个过程叫”Hiddensurfaceremoval”,采用的算法为”ThedepthbufferThedepthbufferalgorithm在OpenGLES3D绘制的过程中这个算法是自动被采用的,但是了解这个算法有助于理解OpenGLES部分API的使用。下面给出了OpenGLESDepthBuffergl.Clear(GL10.GL_DEPTH_BUFFER_BIT)DepthBuffer(1.0)DepthBufferColorBuffer同时进行。gl.glClearDepthf(floatdepth)DepthBuffer是使用的1.0,通常无需改变这个值,gl.glEnable(GL10.GL_DEPTH_TEST)打开depthgl.glDisable(GL10.GL_DEPTH_TEST)关闭depthOpenGL光照模3D效果,给场景中添加光源。如果没有光照,绘出的球看OpenGL光照模型中最终的光照效果可以分为四个组成部分:Emitted(光源)ambient(环境光),diffuse(漫射光)specular(镜面Emittedambient:环境光如果射到某个平面,其反射方向为所有方向。Ambientdiffuse:当一束平行的入射光线射到粗糙的表面时,因面上凹凸不平,向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”方向。diffuse只依赖于光源的方向和法线的方向。specular:一般指物体被光源直射的高亮区域,也可以成为镜面反射区,如金属。specular依赖于光源的方向,法线的方向和视角的方向。设置光照效果SetLightingOpenGLESAPIOpenGLES07OpenGLES平行光源(Parallellightsource),代表由位于无限远处均匀发光体,可以近似控制平行光源。点光源(Spotlightsource)如灯泡就是一个点光源,发出的光可360度,可以为点光源设置光衰减属性(attenuation)或者0号光源:gl.glEnable(GL10.GL_LIGHT0);publicvoidglLightfv(intlight,intpname,FloatBufferpublicvoidglLightfv(intlight,intpname,float[]params,intpublicvoidglLightf(intlight,intpname,floatlight指光源的序号,OpenGLES07共八个光pname:光源参数名称,可以有如下:GL_SPOT_EXPONENT,GL_CONSTANT_ATTENUATION,GL_LINEAR_ATTENUATION,GL_QUADRATIC_ATTENUATION,GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,GL_SPOT_DIRECTION,params参数的值(数组或是Buffer类型)指定光源的位置的参数为GL_POSITION,值为(x,y,z,w)w设0.0,(x,y,z)为平行光的方向。法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切打开法线数组publicvoidglNormal3f(floatnx,floatny,floatnz)为某个顶点设置法线:publicvoidglNormalPointer(inttype,intstride,Bufferpointer)type为Buffer的类型,可以为GL_BYTEGL_FIXED,stride:pointer:设置gl.glEnable(GL10.GL_RESCALE_NORMAL);设置物体材料光GL10.GL_A

温馨提示

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

最新文档

评论

0/150

提交评论