07Android程序设计3D动画生成

上传人:汽*** 文档编号:592677559 上传时间:2024-09-21 格式:PPT 页数:41 大小:1.23MB
返回 下载 相关 举报
07Android程序设计3D动画生成_第1页
第1页 / 共41页
07Android程序设计3D动画生成_第2页
第2页 / 共41页
07Android程序设计3D动画生成_第3页
第3页 / 共41页
07Android程序设计3D动画生成_第4页
第4页 / 共41页
07Android程序设计3D动画生成_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《07Android程序设计3D动画生成》由会员分享,可在线阅读,更多相关《07Android程序设计3D动画生成(41页珍藏版)》请在金锄头文库上搜索。

1、OpenGL ESOpenGLES概述OpenGL与OpenGLES概述OpenGL与OpenGLES区别OpenGLES开发框架GLSurfaceViewRenderer3D动画生成第2页OpenGL是由SGI公司开发的一套3D图形软件接口标准,由于具有体系结构简单合理、使用方便、与操作平台无关等优点,OpenGL迅速成为一种3D图形接口的工业标准,并陆续在各种平台上得以实现。作为一个性能优越的图形应用程序设计界面(API)而适合于广泛的计算环境,从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为三维

2、图形应用程序设计界面,OpenGL应用程序具有广泛的移植性。因此,OpenGL已成为目前的三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。(http:/www.opengl.org/)OpenGL 概述第3页OpenGLESOpenGLES是专为内嵌和移动设备设计的一个2D/3D轻量图形库,它是基于OpenGLAPI设计的。OpenGLES1.0版基于OpenGL1.3,而OpenGLES1.1则是基于OpenGL1.5的。现在主要由KhronosGroup(http:/www.khronos.org/)来负责管理OpenGLES的开发维护。Android平台在sdk2

3、.0之前支持OpenGLES1.1,而在2.0以后的版本则支持OpenGLES2.0。OpenGL ES概述第4页之所以会推出OpenGL-ES版本,主要是应对嵌入式环境和应用的要求。嵌入式设备一般工作于较恶劣的环境,包括:温度、湿度、振动、冲击、酸碱腐蚀等。例如:中国的酸雨气候就给很多室外电子设备带来了新的难题,中东地区的风沙也使得美军必须采用更先进的非IT技术来保护他们的电子设备。需要人机界面的嵌入式应用,由于受环境受环境因素的影响,一般不能提供有缘电源,在有限的电能限制下工作,如何以更低的功耗完成人机交互界面,成为OpenGL必须要面对的问题,进而推出了OpenGL-ES标准。应该说在高

4、效完成2D/3D界面的同时,达到了降低功耗的效果。OpenGL与OpenGL ES区别第5页特别说明,在OpenGL发展到1.3版本时,OpenGLAPI不再采用纯软件的形势进行运算,开始与硬件图形芯片结合,出现了OpenGL硬加速的实现形式。例如:很多显示芯片厂商开始推出支持OpenGL硬加速的芯片,并与软件公司合作,实现OpenGL硬加速。很多PC机的游戏会有加速软件,如实况足球,但目前这类基于PC加速软件还是通过软件形式进行优化,即优化了3D渲染引擎。OpenGL硬加速的优点在于,使CPU从繁重的图形运算工作中解脱出来,将运算重点集中于非界面应用,即嵌入式操作系统中优先级较高,但与界面无

5、关的应用。GPU(图形处理器)与CPU(中央处理器)的分工合作,带来的就是高效率。OpenGL与OpenGL ES区别第6页当然,事物均具有两面性,OpenGL-ES硬加速也有缺点,即增加了设备成本。这方面主要取决于其应用是否需要强劲的性能,即对人机交互界面的更高性能的追求。OpenGLES相对OpenGL删减了一切低效能的操作方式,有高性能的决不留低效能的:没有double型数据类型,但加入了高性能的定点小数数据类型;没有glBegin/glEnd/glVertex,只能用glDrawArrays等。没有实时将非压缩图片数据转成压缩贴图的功能,程序必须直接提供压缩好的贴图;OpenGL与Op

6、enGL ES区别第7页OpenGLES1.x为固定渲染管线(Fixed_Function)而设计。子版本包括:1.0,1.1。1.0从OpenGL1.3裁减而来;1.1从OpenGL_1.5裁减而来。1.1向下兼容1.0。经研究,1.1因为更先进,而且相比1.0增加的特性也都很有用,所以基本上不用考虑1.0了。1.1和1.0的变化不算很大OpenGLES2.x为可编程渲染管线(Programmable)而设计。目前只有2.0这一个子版本,从OpenGL2.0裁减而来。和1.x的区别是可以支持vertex和pixelshader,因此能够实现更多的特效。另外2.0就不再支持1.x里面的固定管线

7、功能了,也就是说2.x并不向下兼容1.x。OpenGL ES 1.x和OpenGL ES 2.x第8页OpenGLES开发包android.opengl.*;OpenGLES视图GLSurfaceView/OpenGL视图Renderer/渲染器Android OpenGL ES开发框架第9页Renderer接口onSurfaceCreated(GL10gl,EGLConfigconfig)onSurfaceChanged(GL10gl,intwidth,intheight)onDrawFrame(GL10gl)Android OpenGL ES开发框架第10页OpenGLOpenGL ES小

8、结第11页GLSurfaceViewRendereronSurfaceCreatedonSurfaceChangedonDrawFrame基本图形生成l通过OpenGL来完成2D多边形的绘制。坐标系、点、线、三角形、四边形、顶点数组l为多边形添加颜色。颜色数组、着色模式l变换操作。平移、旋转、缩放课程目标第13页坐标系、点、顶点3D图像的最小单位称为点(point)或者顶点(vertex)。它们代表三维空间中的一个点并用来建造更复杂的物体。多边形就是由点构成,而物体是由多个多边形组成。尽管通常OpenGL支持多种多边形,但OpenGLES只支持三边形(即三角形)。2D多边形第14页三角形由不在

9、同一直线上的三条线段首尾顺次连接所组成的封闭图形叫做三角形。(0,1,0)/上顶点(0,0,0)/直角处顶点(1,0,0)/右边顶点2D多边形第15页在OpenGL中绘制2D多边形常用的函数以及常量:glEnableClientState/glDisableClientState:状态开关glVertexPointer:设置顶点数据glDrawArrays:绘制函数GL_VERTEX_ARRAY:顶点数组GL_BYTE/GL_SHORT/GL_FIXED/GL_FLOAT:顶点数据的类型GL_LINES:线GL_TRIANGLES:三角形GL_TRIANGLE_STRIP:三角形带2D多边形第

10、16页OpenGLES只支持RGBA颜色模式,即我们通过定义红,绿,蓝以及alpha元素来定义颜色,alpha值定义了颜色之后物体的透视(明)程度。颜色数组和顶点数组一样,由每一个顶点的颜色数据组成。着色模式在OpenGLES中,我们可以为整体物体设计一个单一的颜色,称之为“单一着色”;也可以用多种颜色混合渲染,而颜色之间过渡很平滑,称之为“平滑着色”。颜色第17页常用函数及常量glColor4f:设置单一颜色glColorPointer:设置颜色数组GL_COLOR_ARRAY:颜色数组(通过状态开关函数glDisableClientState来操作)GL_COLOR_BUFFER_BIT:

11、颜色缓存颜色第18页OpenGLES有三种不同类型的变换,它们分别是:转移(Translate):在3D空间中移动物体旋转(Rotate):绕X,Y,或者Z轴进行旋转缩放(Scale):改变物体的大小变换第19页常用函数及常量glTranslatef:平移glRotatef:旋转glScalef:缩放变换第20页2D图形图形元件点、线三角形顶点数组颜色单一着色平滑着色变换平移旋转缩放小结第21页光照和明暗阴影模型GL_FLAT(恒定)、GL_SMOOTH(光滑)光效三要素环境元素(ambientcomponent)漫反射元素(diffusecomponent)镜面反射元素(specularco

12、mponent)光源的属性位置、方向、角度顶点法线课程目标第23页GL_FLAT将指定三角形上的每个像素都同等对待。多边形上的每个像素都具有相同的颜色,阴影等。在这种方式下,物体看上去极为不真实。GL_SMOOTH模式,它使用了一种平滑快速的阴影算法,称为Gouraud算法。OpenGLES默认为GL_SMOOTH模式。阴影模型第24页在OpenGLES中,光由三个元素组成,分别是环境元素(ambientcomponent),漫反射元素(diffusecomponent)和镜面反射元素(specularcomponent)。我们使用颜色来设定光线元素。我们可以指定各光线元素的颜色和相对强度,比

13、如:明亮的白色光定义为白色(1.0,1.0,1.0,1.0),而暗白色可能定义为灰色(0.3,0.3,0.31.0)。你还可以通过改变红,绿,蓝元素的百分比来调整色偏。光效三要素第25页环境光没有明显的光源。其光线折射于许多物体,因此无法确定其来源。环境元素平均作用于场景中的所有物体的所有面。/环境光的颜色FloatBufferlight0Ambient=FloatBuffer.wrap(newfloat0.1f,0.1f,0.1f,1.0f);/设置环境光gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,light0Ambient);环境光第26页在Op

14、enGLES中可以设定的第二个光线元素是漫反射元素(diffusecomponent)。在现实世界里,漫反射光线是诸如穿透光纤或从一堵白墙反射的光线。漫反射光线是发散的,因而参数较柔和的光,一般不会像直射光一样产生光斑。漫反射元素定义了比较平均的定向光源,在物体面向光线的一面具有光泽。FloatBufferlight0Diffuse=FloatBuffer.wrap(newfloat0.7f,0.7f,0.7f,1.0f);gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,light0Diffuse);漫反射光第27页镜面反射元素定义了光线直接照射并反射到

15、观察者从而形成了物体上的“热点”或光泽。光点的大小取决于一些因素,但是如果你看到如上图黄球所示一个区域明显的光斑,那通常就是来自于一个或多个光源的镜面反射部分。这种类型的光是十分直接的,它们会以热点和光晕的形式反射到观察者的眼中。如果你想产生聚光灯的效果,那么应该设置一个很大的镜面反射元素值及很小的漫反射和环境元素值(还需要定义其他一些参数,等下会有介绍)。FloatBufferlight0Specular=FloatBuffer.wrap(newfloat0.7f,0.7f,0.7f,1.0f);gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_SPECULAR,lig

16、ht0Specular);镜面反射第28页位置(GL_POSITION):3D空间中光源的位置。方向(GL_SPOT_DIRECTION):由x,y,z向量来确定光线的方向。角度(GL_SPOT_CUTOFF):指定GL_SPOT_CUTOFF值时,它定义了中心线两边的角度,所以如果你指定截止角时,它必须小于180度。如果你的定义为45度,那么实际上你创建了一个总角度为90度的点光源。这意味着你可设定的GL_SPOT_CUTOFF的最大值为180度。光源的属性第29页法线:一个垂直于指定多边形表面的向量(或直线)。使用GL_SMOOTH渲染,所以OpenGLES需要知道顶点法线(vertexn

17、ormal)而不是表面法线,一个复杂的物体顶点很多,所以计算量也就很大。顶点法线第30页/允许设置法线数组gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);/设置法线数组gl.glNormalPointer(GL10.GL_FLOAT,0,normals);/开启颜色材质gl.glEnable(GL10.GL_COLOR_MATERIAL);设置顶点法线第31页阴影模型GL_FLATGL_SMOOTH小结第32页光效环境元素散射元素高光元素位置方向角度顶点法线在OpenGLES中,光由三个元素组成,分别是环境元素(ambientcomponent),漫反

18、射元素(diffusecomponent)和镜面反射元素(specularcomponent)。光效三要素第33页什么是颜色?我们看得见的光被称为光的可见频谱。根据不同的波长我们可以感知到不同的颜色。在可见光谱的一端是低波长高频率的紫色和蓝色,而在另一端是低频率高波长的橘色和红色。电磁波在这个范围之外,因此不是“可见光”,我们只关心可见光谱。颜色第34页材质我们通常通过定义材质的反射光来定义OpenGLES中的材质,正如现实世界中一样。如果一个材质定义为反射红光,那么在正常的白光下,它将显示红色。在OpenGL中(至少在使用光滑着色处理和光效时),材质是没有颜色的。OpenGL具有分别定义材质

19、是怎样反射OpenGL光效三要素(环境,漫反射和镜面反射)的能力。另外,它还具有指定材质自发光(emissive)属性的能力,关于这点我们稍后再讨论。OpenGL 材质第35页指定材质要在要在OpenGL创建一个材质,我们需要一次或多次创建一个材质,我们需要一次或多次调用调用 glMaterialf() 或者或者 glMaterialfv()。于各属性或元于各属性或元素需要分别通过这些调用了指定,所以我们通常必须多素需要分别通过这些调用了指定,所以我们通常必须多次调用这些函数以完全定义材质。所有未定义的元素或次调用这些函数以完全定义材质。所有未定义的元素或属性默认值为属性默认值为0,或者以颜色

20、来说为黑色。,或者以颜色来说为黑色。传递给传递给 glMaterialf() 或者或者 glMaterialfv() 的第一个的第一个参数总是用于指定是否材质影响多边形的前,后或两者参数总是用于指定是否材质影响多边形的前,后或两者的的GL_ENUM。在。在OpenGL ES中第一个参数只能为中第一个参数只能为GL_FRONT_AND_BACK。第二个参数是指示正在设。第二个参数是指示正在设定材质的哪个元素或属性的定材质的哪个元素或属性的 GL_ENUM。指定材质第36页环境元素和漫反射元素当讨论OpenGL的材质时,我们需要同时讨论环境光和漫反射光,这是因为这两个元素是一起工作从而决定物体被感

21、知的颜色的。环境元素(GL_AMBIENT)漫反射元素(GL_DIFFUSE)环境元素和漫反射元素(GL_AMBIENT_AND_DIFFUSE)环境元素和漫反射元素第37页镜面反射元素还可以单独设置场景中镜面反射元素的反射方式,从而控制镜面反射“热点”的亮度。一个叫GL_SHININESS的参数与材质的镜面反射元素一起定义了镜面反射热点的大小。如果你设定了材质的GL_SPECULAR值,你还应该定义其反光度。反光度越高,镜面反射反射越小,所以默认值0.0几乎完全淹没了漫反射光。镜面反射使三角形边缘突出,镜面反射通常在我们的游戏中经常使用的低面片的物体上表现不佳。在常规OpenGL中,有一个称

22、为着色器(shader)的机制可以用来为低面片物体产生较为理想的结果,但是只有OpenGLES2.0,有shader功能。镜面反射元素第38页通过设定自发光元素,使得材质看上去会发射我们指定的颜色。它并不是真正在发光。例如,其周边物体并不会被发射的光线影响。如果你希望一个物体像灯泡一样发光照亮其他物体,你需要将自发光元素和与物体同一位置处的实际光源结合起来。但是自发光元素可以使物体漂亮地发光。自发光元素影响整个材质,因此GL_EMISSION的值将与落入物体指定区域的任何类型的光相叠加。自发光第39页颜色小结第40页材质的属性glMaterialfglMaterialfv环境元素散射元素高光元素自发光41谢谢!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号