版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OpenGL与3D应用开发浙大软件学院梁秀波学习目标 了解OpenGL历史,发展背景,特点,现状 掌握Android中的OpenGL引擎-Open GL ES 掌握OpenGL ES核心包类GLSurfaceView 掌握OpenGL ES图形图像的绘制 掌握OpenGL ES 3D图形图像的绘制 掌握OpenGL ES纹理映射 了解OpenGL ES光照事件与色彩组合12.1 OpenGL简介 OpenGL简介qOpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程接口规范,它应用于三维(二维)图形图像编程qOpenGL 是行业领域中最为广泛接纳的 2D/3
2、D 图形 API, 自其诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序qOpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows、Unix、Linux、MacOS、OS2之间进行移植q在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,能够适应不同应用12.1 OpenGL简介 12.1.1 OpenGL发展历程q1992年7月,SGI公司发布了OpenGL的1.0版本,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用q2003年7月28日,SGI和ARB公布了OpenGL 1.5。O
3、penGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”q2008年8月初Khronos工作组在Siggraph 2008大会上宣布了OpenGL 3.0图形接口规范,GLSL1.30 shader语言和其他新增功能将再次为未来开放3D接口发展指明方向q2010年7月26日发布OpenGL 4.1和OpenGL Shading Language 4.1012.1 OpenGL简介 12.1.2 OpenGL的特点及功能q建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以
4、及复杂曲线和曲面绘制函数q变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换q颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)q光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色12.1 Open
5、GL简介 12.1.2 OpenGL的特点及功能q纹理映射(Texture Mapping)。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节q位图显示和图象增强:图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)等特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果q双缓存动画(Double Buffering):双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面12.1 OpenGL简介 12.1.3 OpenGL的现状qOpen GL仍然是唯一能够取代
6、微软对3D图形技术的完全控制的API,仍然具有一定的生命力q游戏开发人员是一个有着独立思想的群体,很多重要的开发人员目前仍然在使用Open GL。因此,硬件开发商正在设法加强对它的支持q开放源码社区(尤其是Mesa项目)一直致力于为任何类型的计算机(无论它们是否使用微软的操作系统)提供Open GL支持12.1 OpenGL简介 12.1.4 Android中的OpenGL引擎qOpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。下图是一个典型的 EGL 系统布局图。12.1 OpenG
7、L简介 12.1.4 Android中的OpenGL引擎 Open GL ES介绍 Android中移植了部分OpenGL接口 OpenGL ES是Khronos公司根据OpenGL规范进行裁剪后形成的一套标准,它专门用于嵌入系统(Embedded System,所以叫OpenGL ES)和其他处理器功能不是很强大的设备(如:手机、PDA等)的3D图形处理 Android 3D图形系统也分为java框架和本地代码两部分,本地代码主要实现OpenGL接口库,在Java框架层,javax.microedition.khronos.opengles是java标准的OpenGL包,Android.op
8、engl包提供了OpenGL系统和Android GUI系统之间的联系12.2 OpenGL ES开发框架 Android平台提供的OpenGL ES API核心包类-GLSurfaceView 设置GLSurfaceView只需自定义一个GLSurfaceView.Renderer类,定义了一个统一图形绘制接口,它包含如下三个接口函数 public void onSurfaceCreated(GL10 gl, EGLConfig config)在窗口创建的过程中,会调用该方法,因此,可以在该函数中进行一些初始化工作。比如,设置背景色等 public void onDrawFrame(GL10
9、 gl)对当前view进行实际绘图操作 public void onSurfaceChanged(GL10 gl, intwidth, int height) 在窗口发生变化时调用的函数,如果设备支持屏幕横向和纵向切换,这个方法将发生在横向纵向切换时,此时可以重新设置绘制的纵横比率12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形基本元素 顶点(Vertex),下面代码定义了四个顶点数组private float vertices = -1.0f, 1.0f, 0.0f, / 0, Top Left -1.0f, -1.0f, 0.0f, / 1,
10、 Bottom Left 1.0f, -1.0f, 0.0f, / 2, Bottom Right 1.0f, 1.0f, 0.0f, / 3, Top Right ;n为了提高性能,通常将这些数组存放到Buffer类中 FloatBuffer vertexBuffer = vbb.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0);12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形基本元素 OpenGL ES提供一个称为“管道Pipeline”的机制将它们传给
11、OpenGL ES库,这个管道定义了一些“开关”来控制OpenGL ES支持的某些功能,缺省情况这些功能是关闭的,如果需要使用OpenGL ES的这些功能,需要明确告知“管道”打开所需功能 下面一段代码告诉OpenGL ES库打开上面定义的vertexBuffer以便传入顶点坐标Buffer,使用完某个功能后,要关闭这个功能以免影响后续操作gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glDisableClientState(GL10.
12、GL_VERTEX_ARRAY);12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形基本元素 边(Edge)定义为两个顶点之间的线段在OpenGL中,通常无需直接定义一个边,而是通过顶点定义一个面,从而由面定义了其所对应的三条边。可以通过修改边的两个顶点来更改一条边 面(Face)指一个三角形,由三个顶点和三条边构成,对一个面所做的变化影响到连接面的所有顶点和边、面和多边形 多边形(Polygon)由多个面(三角形)拼接而成,在3D空间中,多边形不一定在同一个平面上12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元
13、素 3D图形Render(渲染) public void glDrawArrays(int mode, int first, int count)方法使用定义的顶点数组进行绘制 public void glDrawElements(int mode, int count, int type, Buffer indices)方法可以基于新的顶点顺序进行绘制,新顶点顺序由indices指定 同样的顶点,可以定义的几何图形可以不同,需要使用mode参数来指明所需绘制的几何图形基本类型12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形Render(渲染)-
14、几何图形基本类型 GL_POINTS绘制独立的点 GL_LINE_STRIP绘制一系列线段 GL_LINE_LOOP同GL_LINE_STRIP,但是线段首尾相连,构成一个封闭曲线 GL_LINES顶点两两连接 GL_TRIANGLES三个顶点构成一个三角形,组成多个三角形 GL_TRIANGLE_STRIP每相邻三个顶点组成一个三角形,由一系列相连三角形组成 GL_TRIANGLE_FAN以一个点为所有三角形公共顶点,组成一系列相邻的三角形12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形变换 3D图形的变换可以使游戏角色做一些动作,在OpenG
15、L ES中有三个基本的变换函数,glRotatef( )、glTranslatef( )和glScalef( ) OpenGL ES中有两套矩阵,都是4*4的GLfloat矩阵,一个是modelview matrix,主要用来对虚拟的3D世界进行变换,我们对虚拟世界的物体进行旋转、平移或尺寸变化,都需要操作这个矩阵 OpenGL ES中的另一个矩阵用来创建根据设定的视口对世界坐标进行描述的二维表示,这个矩阵称为projection matrix,大部分时间内,我们不需要接触这个矩阵 在任何时刻这两个矩阵只能有一个是激活的,任何与矩阵相关的调用只影响激活矩阵,当调用glLoadIdentity(
16、 )时,激活矩阵设置为单元矩阵,其他三个调用则创建一个平移、尺度变换和旋转矩阵,并将创建的矩阵乘以激活矩阵,并将激活矩阵替换为矩阵乘法得到的结果12.3 OpenGL ES图形绘制基础 12.3.1 OpenGL ES图形绘制元素 3D图形变换 在大多情况下,只需要在程序开始时设置激活矩阵,在OpenGL ES中通过glMatrixMode(int)方法进行设置,设置为modelview matrix时参数为GL_MODEVIEW,设置为projection matrix时参数为GL_PROJECTION12.3 OpenGL ES图形绘制基础 12.3.2 OpenGL ES图形颜色 Fla
17、t coloring(单色) 该方法通知OpenGL使用单一的颜色来进行渲染,指定单一颜色的方法为 public void glColor4f(float red, float green, float blue, float alpha)缺省的red, green, blue为1,代表白色,这也是为什么前面的例子中显示的图形是白色的原因12.3 OpenGL ES图形绘制基础 12.3.2 OpenGL ES图形颜色 Smooth coloring(平滑颜色过渡) 当为每个顶点定义一个颜色时,OpenGL自动为不同顶点颜色之间生成中间过渡颜色(渐变色) 与定义正方形顶点类似,首先定义四个顶点
18、的颜色值,而后调用glColorPointer指定颜色过渡。右边例子显示一个颜色平滑过渡的正方形12.4 OpenGL ES空间图形绘制空间图形的绘制与前面的平面图形绘制类似,都是通过定义顶点坐标来进行绘制,三角体四个面的顶点坐标定义如下private int triangle = 0, 1, 0, -1, -1, 1,1, -1, 1, 0, 1, 0,1, -1, 1, 1, -1, -1,0, 1, 0,1, -1,-1, -1, -1, 1, 0, 1, 0,-1, -1, -1,-1, -1, 1 ;12.4 OpenGL ES空间图形绘制 三角面(Mesh) Mesh是构成空间形体
19、的基本元素,四面体、椎体、圆柱体都是由Mesh所构成,甚至球体也是由无数的Mesh所构成 一个旋转的三角体和立方体在手机中显示效果如图所示12.5 纹理映射 12.5.1 纹理映射步骤 在OpenGL ES中另一个为多边形定义颜色创建材质的方法是将纹理映射到多边形,简单的几何体通过纹理映射的方法比使用材质的复杂几何体的渲染快得多。OpenGL ES中的纹理映射主要遵循几个步骤 功能启动:为使用纹理,我们需要打开OpenGL的纹理映射开关以启动我们需要的功能。启动纹理映射函数为glEnable(GL_TEXTURE_2D),这个调用必不可少,如果没有打开,那么就无法将图像映射到多边形上 创建纹理
20、:一旦启动了纹理映射,就可以开始创建纹理了。通常纹理是在开始显示3D物体前创建的。OpenGL中的每一个图像都是一个纹理,纹理不能直接显示给用户,除非映射到物体上 为创建一个纹理,首先必须通知OpenGL ES生成一个纹理名称,在OpenGL ES中,一个纹理名称是一个int数,用来独一无二的标识一个纹理,生成纹理名称调用glGenTextures( )12.5 纹理映射 12.5.1 纹理映射步骤 OpenGL ES中的纹理映射主要遵循几个步骤 绑定纹理:在为纹理生成名称后,在为纹理提供图像数据前,必须绑定纹理,绑定使得指定纹理处于活动状态。一次只能激活一个纹理,活动或被绑定的纹理是绘制多边
21、形时使用的纹理,绑定纹理需要调用glBindTexture( ),因为一般使用二维图像创建纹理,因此第一个参数往往是GL_TEXTURE_2D 加载图像:绑定纹理后,就需要加载作为纹理的图像数据,这通过调用GLUtils类的texImage2D( )实现 图像配置:调用glTexParameteri( )12.5 纹理映射 12.5.2 纹理映射坐标 当纹理映射启动后绘图时,必须为OpenGL ES提供其他数据,即多边形顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。纹理左下角为二维平面的原点,高和宽的单位为112.5 纹理映射 12.5.2 纹理映射坐标 当指定顶点
22、数组中的顶点时,需要在另一个数组中提供纹理坐标,称为纹理坐标数组。每个顶点,需要传递一个坐标(s,t)来指定顶点在纹理坐标中的位置。假设将整个图像映射到由两个三角形组成的正方形上,叠加如下12.5 纹理映射 12.5.2 纹理映射坐标 将此时的纹理坐标转为数组static const GLfloat texCoords = 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0 ;12.5 纹理映射 12.5.2 纹理映射坐标 如果我们希望把某个纹理的局部映射到立方体,可以通过修改纹理坐标数组来实现,下图中的纹理坐标将纹理的中间部分映射到立方体表面上 private fl
23、oat texCoords = 0.25f, 0.75f, 0.75f, 0.75f, 0.25f, 0.25f, 0.75f, 0.25f ;12.5 纹理映射 12.5.2 纹理映射进阶 从上节可见,纹理坐标系统在两个轴上都是从0.0到1.0,如果设置超出此范围的值会怎么样?设纹理坐标数组为 private float texCoords = 0.0f, 2.0f, 2.0f, 2.0f, 0.0f, 0.0f, 2.0f, 0.0f ;12.5 纹理映射 12.5.3 纹理映射进阶 根据视图的设置方式有两种选择 平铺,按OpenGL的术语,也叫“重复”。即将同一幅纹理图像在立体面上进行平
24、铺,每一幅图所占坐标范围为1个单位(上图a)。在实现平铺效果时需要在onSurfaceCreated中调用 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)。实现箝位时需要在onSurface
25、Created中调用 gl.glTexParameterx(GL10.GL_TEXTURE_2D, 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)进行设置12.6 光照和事件 12.6.1 光照模型 当光照射到一个物体表面时,会出现三种情形 首先,光可以通过物体表面向空间反射,产生反射光 其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光 最后,部分光将被物体表面吸收而
26、转换为热 反射光可以分为三个分量,即环境反射、漫反射和镜面反射 环境反射分量假定入射光均匀地从周围环境入射至景物表面并等量地向各方方向反射出去 漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光 镜面反射光为朝一定方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域12.6 光照和事件 12.6.2 OpenGL ES光组成 OpenGL ES光照模型中的几种光分为 辐射光(Emitted Light)是最简单的一种光,它直接从物体发出并且不受任何光源影响 环境光(Ambient Light)是由光源发出经环境多次散射而无法确定其方向的光 漫射光(D
27、iffuse Light)来自一个方向,它垂直于物体时比倾斜时更明亮 镜面光(Specular Light)来自特定方向并沿另一个方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射 OpenGL ES光照模型中定义的光源可以分别控制、打开或关闭,OpenGL ES最多支持八个光源。OpenGL ES光照模型中最终的光照效果由Emitted, Ambient, Diffuse和Specular四种光叠加而成12.6 光照和事件 12.6.3 OpenGL ES光源添加实现 OpenGL ES光源添加遵循以下几步 定义各种光及位置数组 类似纹理映射,分别为各种光源及照射位置定义数组 调用glLightfv( )设置各种光和光源位置,参数为上面定义的数组 调用glEnable( )启用光源12.7 色彩混合 色彩混合介绍 色彩混合可以实现物体透明,例如玻璃、水、窗户等效果 alpha是混合的基础,也可以简单理解为透明度,alpha值为0代表完全
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年陕西服装工程学院单招职业倾向性测试题库参考答案详解
- 2026年宣化科技职业学院单招职业适应性考试题库带答案详解
- 2026年九江理工职业学院单招职业倾向性考试题库及参考答案详解一套
- 2026年烟台黄金职业学院单招职业技能考试题库及完整答案详解1套
- 2026年镇江市高等专科学校单招职业技能测试题库及答案详解1套
- 2026年明达职业技术学院单招职业技能考试题库含答案详解
- 2026年广州科技贸易职业学院单招职业倾向性考试题库及参考答案详解一套
- 银行应变类面试题及答案
- 儋州事业编面试题及答案
- 房东与租户消防协议书范本
- 2025-2026学年湘美版小学美术四年级(上册)期末测试卷附答案(4套)
- 2025年1月黑龙江省普通高中学业水平合格性考试物理试卷(含答案)
- 江西省三新协同体2025-2026年高一上12月思想政治试卷(含解析)
- 知识点及2025秋期末测试卷(附答案)-苏教版(新教材)小学科学小学科学二年级上册
- 2025安徽芜湖市鸠江区人民医院招聘工作人员21人笔试考试参考试题及答案解析
- 《城市轨道交通车站机电设备运用》课件 项目三:站台门系统
- 企业财务尽调咨询服务合同
- 企业税务规划合规审查手册
- 2026年山西工程职业学院单招职业技能考试题库及答案解析(名师系列)
- 附件扭转诊治中国专家共识(2024年版)解读
- 社区工作者社工面试题及答案解析
评论
0/150
提交评论