收藏 分享(赏)

android-opengl开发基础.ppt

上传人:无敌 文档编号:306771 上传时间:2018-03-27 格式:PPT 页数:37 大小:593.52KB
下载 相关 举报
android-opengl开发基础.ppt_第1页
第1页 / 共37页
android-opengl开发基础.ppt_第2页
第2页 / 共37页
android-opengl开发基础.ppt_第3页
第3页 / 共37页
android-opengl开发基础.ppt_第4页
第4页 / 共37页
android-opengl开发基础.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、第10章 Adroid OpenGL开发基础,本章学习目标,了解OpenGL历史,发展背景,特点,现状掌握android中的OpenGL引擎-Open GL ES掌握OpenGL ES核心包类GLSurfaceView掌握OpenGL ES图形图像的绘制掌握OpenGL ES 3D图形图像的绘制掌握OpenGL ES纹理映射了解OpenGL ES光照事件与色彩组合,10.1 OpenGL简介,OpenGL简介OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程接口规范,它应用于三维(二维)图象OpenGL 是行业领域中最为广泛接纳的 2D/3D 图形 API

2、, 自其诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS2之间进行移植在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,能够适应不同应用,10.1 OpenGL简介,10.1.1 OpenGL发展历程1992年7月,SGI公司发布了OpenGL的1.0版本,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用2003年7月28日,SGI和ARB公布了OpenGL 1.

3、5。OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”2008年8月初Khronos工作组在Siggraph 2008大会上宣布了OpenGL 3.0图形接口规范,GLSL1.30 shader语言和其他新增功能将再次为未来开放3D接口发展指明方向2010年7月26日发布OpenGL 4.1和OpenGL Shading Language 4.10,10.1 OpenGL简介,10.1.2 OpenGL的特点及功能建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)

4、以及复杂曲线和曲面绘制函数变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色,10.1 OpenGL

5、简介,10.1.2 OpenGL的特点及功能纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节位图显示和图象增强:图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)等特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果双缓存动画(Double Buffering):双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面,10.1 OpenGL简介,10.1.3 OpenGL的现状Open GL仍然是唯一能够取代微软对3D

6、图形技术的完全控制的API,仍然具有一定的生命力游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持,10.1 OpenGL简介,10.1.4 android中的OpenGL引擎Open GL ES介绍,10.1 OpenGL简介,10.1.4 android中的OpenGL引擎Open GL ES介绍android中移植了部分OpenGL接口OpenGL ES是Khronos公司根据OpenGL规范进行裁

7、剪后形成的一套标准,它专门用于嵌入系统(Embedded System,所以叫OpenGL ES)和其他处理器功能不是很强大如:手机、PDA等设备的3D图形处理目前,android支持OpenGL ES 1.0,相当于OpenGL 1.3android 3D图形系统也分为java框架和本地代码两部分,本地代码主要实现OpenGL接口库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,android.opengl包提供了OpenGL系统和Android GUI系统之间的联系,10.2 OpenGL ES开发框架,Androi

8、d平台提供的OpenGL ES API核心包类-GLSurfaceView设置GLSurfaceView只需自定义一个GLSurfaceView.Renderer类,定义了一个统一图形绘制接口,它包含如下三个接口函数public void onSurfaceCreated(GL10 gl, EGLConfig config)在窗口创建的过程中,会调用该方法,因此,可以在该函数中进行一些初始化工作。比如,设置背景色等public void onDrawFrame(GL10 gl)对当前view进行实际绘图操作public void onSurfaceChanged(GL10 gl, intwid

9、th, int height) 在窗口发生变化时调用的函数,如果设备支持屏幕横向和纵向切换,这个方法将发生在横向纵向切换时,此时可以重新设置绘制的纵横比率,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形基本元素顶点(Vertex),下面代码定义了四个顶点数组,为了提高性能,通常将这些数组存放到Buffer类中,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形基本元素OpenGL ES提供一个称为“管道Pipeline”的机制将它们传给OpenGL ES库,这个管道定义了一些“开关”来控制OpenGL

10、ES支持的某些功能,缺省情况这些功能是关闭的,如果需要使用OpenGL ES的这些功能,需要明确告知“管道”打开所需功能下面一段代码告诉OpenGL ES库打开上面定义的vertexBuffer以便传入顶点坐标Buffer,使用完某个功能后,要关闭这个功能以免影响后续操作,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形基本元素边(Edge)定义为两个顶点之间的线段在OpenGL中,通常无需直接定义一个边,而是通过顶点定义一个面,从而由面定义了其所对应的三条边。可以通过修改边的两个顶点来更改一条边面(Face)指一个三角形,由三个顶点和三条边构成,

11、对一个面所做的变化影响到连接面的所有顶点和边、面和多边形多边形(Polygon)由多个面(三角形)拼接而成,在3D空间中,多边形不一定在同一个平面上,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形Render(渲染)public void glDrawArrays(int mode, int first, int count)方法使用定义的顶点数组进行绘制public void glDrawElements(int mode, int count, int type, Buffer indices)方法可以基于新的顶点顺序进行绘制,新顶点顺序由i

12、ndices指定同样的顶点,可以定义的几何图形可以不同,需要使用mode参数来指明所需绘制的几何图形基本类型,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形Render(渲染)-几何图形基本类型GL_POINTS绘制独立的点GL_LINE_STRIP绘制一系列线段GL_LINE_LOOP同GL_LINE_STRIP,但是线段首尾相连,构成一个封闭曲线GL_LINES顶点两两连接GL_TRIANGLES三个顶点构成一个三角形,组成多个三角形GL_TRIANGLE_STRIP每相邻三个顶点组成一个三角形,由一系列相连三角形组成GL_TRIANGLE_

13、FAN以一个点为所有三角形公共顶点,组成一系列相邻的三角形,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形变换3D图形的变换可以使游戏角色做一些动作,在OpenGL ES中有三个基本的变换函数,glRotatef( )、glTranslatef( )和glScalef( )OpenGL ES中有两套矩阵,都是4*4的GLfloat矩阵,一个是modelview matrix,主要用来对虚拟的3D世界进行变换,我们对虚拟世界的物体进行旋转、转移或尺寸变化,都需要操作这个矩阵OpenGL ES中的另一个矩阵用来创建根据设定的视口对世界坐标进行描述的二

14、维表示,这个矩阵称为projection matrix,大部分时间内,我们不需要接触这个矩阵在任何时刻这两个矩阵只能有一个是激活的,任何与矩阵相关的调用只影响激活矩阵,当调用glLoadIdentity( )时,激活矩阵设置为单元矩阵,其他三个调用则创建一个转移、尺度变换和旋转矩阵,并将创建的矩阵乘以激活矩阵,并将激活矩阵替换为矩阵乘法得到的结果,10.3 OpenGL ES图形绘制基础,10.3.1 OpenGL ES图形绘制元素3D图形变换在大多情况下,只需要在程序开始时设置激活矩阵,在OpenGL ES中通过glMatrixMode(int)方法进行设置,设置为modelview mat

15、rix时参数为GL_MODEVIEW,设置为projection matrix时参数为GL_PROJECTION,10.3 OpenGL ES图形绘制基础,10.3.2 OpenGL ES图形颜色Flat coloring(单色)该方法通知OpenGL使用单一的颜色来进行渲染,指定单一颜色的方法为,缺省的red, green, blue为1,代表白色,这也是为什么前面的例子中显示的图形是白色的原因,10.3 OpenGL ES图形绘制基础,10.3.2 OpenGL ES图形颜色Smooth coloring(平滑颜色过渡)当为每个顶点定义一个颜色时,OpenGL自动为不同顶点颜色之间生成中间

16、过渡颜色(渐变色)与定义正方形顶点类似,首先定义四个顶点的颜色值,而后调用glColorPointer指定颜色过渡。下面代码显示一个颜色平滑过渡的正方形,10.4 OpenGL ES空间图形绘制,空间图形的绘制与前面的平面图形绘制类似,都是通过定义顶点坐标来进行绘制,三角体四个面的顶点坐标定义如下,10.4 OpenGL ES空间图形绘制,三角面(Mesh)Mesh是构成空间形体的基本元素,四面体、椎体、圆柱体都是由Mesh所构成,甚至球体也是由无数的Mesh所构成一个旋转的三角体和立方体在手机中显示效果如图所示,10.5 纹理映射,10.5.1 纹理映射步骤在OpenGL ES中另一个为多边

17、形定义颜色创建材质的方法是将纹理映射到多边形,简单的几何体通过纹理映射的方法比使用材质的复杂几何体的渲染快得多。OpenGL ES中的纹理映射主要遵循几个步骤功能启动:为使用纹理,我们需要打开OpenGL的纹理映射开关以启动我们需要的功能。启动纹理映射函数为glEnable(GL_TEXTURE_2D),这个调用必不可少,如果没有打开,那么就无法将图像映射到多边形上创建纹理:一旦启动了纹理映射,就可以开始创建纹理了。通常纹理是在开始显示3D物体前创建的。OpenGL中的每一个图像都是一个纹理,纹理不能直接显示给用户,除非映射到物体上为创建一个纹理,首先必须通知OpenGL ES生成一个纹理名称

18、,在OpenGL ES中,一个纹理名称是一个int数,用来独一无二的标识一个纹理,生成纹理名称调用glGenTextures( ),10.5 纹理映射,10.5.1 纹理映射步骤OpenGL ES中的纹理映射主要遵循几个步骤绑定纹理:在为纹理生成名称后,在为纹理提供图像数据前,必须绑定纹理,绑定使得指定纹理处于活动状态。一次只能激活一个纹理,活动或被绑定的纹理是绘制多边形时使用的纹理,绑定纹理需要调用glBindTexture( ),因为一般使用二维图像创建纹理,因此第一个参数往往是GL_TEXTURE_2D加载图像:绑定纹理后,就需要加载作为纹理的图像数据,这通过调用GLUtils类的tex

19、Image2D( )实现图像配置:调用glTexParameteri( ),10.5 纹理映射,10.5.2 纹理映射坐标当纹理映射启动后绘图时,必须为OpenGL ES提供其他数据,即多边形顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。纹理左下角为二维平面的原点,高和宽的单位为1,10.5 纹理映射,10.5.2 纹理映射坐标当指定顶点数组中的顶点时,需要在另一个数组中提供纹理坐标,称为纹理坐标数组。每个顶点,需要传递一个坐标(s,t)来指定顶点在纹理坐标中的位置。假设将整个图像映射到由两个三角形组成的正方形上,叠加如下,10.5 纹理映射,10.5.2 纹理映射

20、坐标将此时的纹理坐标转为数组,10.5 纹理映射,10.5.2 纹理映射坐标如果我们希望把某个纹理的局部映射到立方体,可以通过修改纹理坐标数组来实现,下图中的纹理坐标将纹理的中间部分映射到立方体表面上,10.5 纹理映射,10.5.2 纹理映射进阶从上节可见,纹理坐标系统在两个轴上都是从0.0到1.0,如果设置超出此范围的值会怎么样?设纹理坐标数组为,10.5 纹理映射,10.5.3 纹理映射进阶根据视图的设置方式有两种选择平铺,按OpenGL的术语,也叫“重复”。即将同一幅纹理图像在立体面上进行平铺,每一幅图所占坐标范围为1个单位(上图a)。在实现平铺效果时需要在onSurfaceCreat

21、ed中调用 gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT)和 gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT)进行设置箝位,即是简单地将超过1.0的值限制为1.0,任何低于0.0的值限制为0.0,这会引起边沿像素的简单重复,从而产生奇怪的效果(上图b)。实现箝位时需要在onSurfaceCreated中调用 gl.glTexParameterx(GL10.GL_TEXTURE_2D,

22、 GL10.GL_TEXTURE_WRAP_S,GL10. GL_CLAMP_TO_EDGE)和gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10. GL_CLAMP_TO_EDGE)进行设置,10.6 光照和事件,10.6.1 光照模型当光照射到一个物体表面时,会出现三种情形首先,光可以通过物体表面向空间反射,产生反射光其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光最后,部分光将被物体表面吸收而转换为热反射光可以分为三个分量,即环境反射、漫反射和镜面反射环境反射分量假定入射光均匀地从周围环境入射至

23、景物表面并等量地向各方方向反射出去漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光镜面反射光为朝一定方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,10.6 光照和事件,10.6.2 OpenGL ES光组成OpenGL ES光照模型中的几种光分为辐射光(Emitted Light)是最简单的一种光,它直接从物体发出并且不受任何光源影响环境光(Ambient Light)是由光源发出经环境多次散射而无法确定其方向的光漫射光(Diffuse Light)来自一个方向,它垂直于物体时比倾斜时更明亮镜面光(Specular Light)来自特定方向

24、并沿另一个方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射OpenGL ES光照模型中定义的光源可以分别控制、打开或关闭,OpenGL ES最多支持八个光源。OpenGL ES光照模型中最终的光照效果由Emitted, Ambient,Diffuse和Specular四种光叠加而成,10.6 光照和事件,10.6.3 OpenGL ES光源添加实现OpenGL ES光源添加遵循以下几步定义各种光及位置数组类似纹理映射,分别为各种光源及照射位置定义数组调用glLightfv( )设置各种光和光源位置,参数为上面定义的数组调用glEnable( )启用光源,10.7 色彩混合,色

25、彩混合介绍色彩混合可以实现物体透明,例如玻璃、水、窗户等效果alpha是混合的基础,也可以简单理解为透明度,alpha值为0代表完全透明,1代表不透明,指定的值为0到1之间可以调整色彩的透明度当使用混合时,始终要记住两个不同的颜色,一个是源色彩(用来参加运算),一个是目标色彩(已经存在于缓冲区)混合就是进行两个色彩的运算OpenGL ES把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色,10.7 色彩混合,色彩混合介绍色彩运算的数学表达式假设源颜色的四个分量(指红色、绿色、蓝色、alpha值)是(R

26、s, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa), 目标因子为(Dr, Dg, Db, Da)合产生的新颜色可以表示为:(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)如果颜色的某一个分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题,10.7 色彩混合,色彩混合介绍色彩运算的数学表达式假设源颜色的四个分量(指红色、绿色、蓝色、alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(S

27、r, Sg, Sb, Sa), 目标因子为(Dr, Dg, Db, Da)合产生的新颜色可以表示为:(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)如果颜色的某一个分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题,10.7 色彩混合,色彩混合介绍源因子和目标因子可以通过glBlendFunc( )进行设置。glBlendFunc( )有两个参数,第一个参数表示源因子,第二个参数表示目标因子。这两个参数可以是多种值,常用的有下面几种GL_ZERO:表示使用0.0作为因子,相当于不使用这种颜色参与混合运算GL_ONE:表示使用

28、1.0作为因子,相当于完全使用了这种颜色参与混合运算GL_SRC_ALPHA:表示使用源颜色的alpha值作为因子GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子,10.7 色彩混合,色彩混合介绍上面所说的源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体,则绿色是源颜色,红色是目标颜色。绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标颜色对应,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报