OpenGL 5光照和材质.ppt_第1页
OpenGL 5光照和材质.ppt_第2页
OpenGL 5光照和材质.ppt_第3页
OpenGL 5光照和材质.ppt_第4页
OpenGL 5光照和材质.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、1,第 5 章,OpenGL光照和材质,当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光。其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。最后,部分光将被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。,5.1光照及材质介绍,(1)环境光(Ambient Light) 环境光不来自于任何特殊的方向,它有光源,但是被周围的房间或场景多次反射,以致于变得没有方向。被环境光照射的物体表面的各个方向都均等受光。 (2)散射光(Diffuse Light) 来自同一个方向的光,垂直照射表面比倾斜时更明亮。 当

2、它撞击表面时,它会均匀的向所有方向发散,因此,不管眼睛在哪个位置,它看上去总是一样亮。 任何来自某个特定位置或方向的光很可能具有散射成分。,5.1光照及材质介绍,(3)镜面光( Specular Light ) 镜面光来自特定方向,但被强烈地反射到另一特定的方向。高亮度的镜面光能够在被照射的物体表面上产生称之为亮斑的亮点。 (4)发射光(emitted light) 用于模拟源自某个物体的光。 任何一个光源都是由环境光、散射光和镜面光三种光照成分组成,各成分的定义是由RGBA值定义的。,5.1光照及材质介绍,材质 OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。像光源一样

3、,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。 在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。,5.1光照及材质介绍,材质的颜色实际决定了反射光与入射光的百分比率:若OpenGL的光源颜色为(LR、LG、LB),材质颜色属性为(MR、MG、MB)。那么,最终到达眼睛的光的颜色为 (LR*MR、LG*MG、LB*MB) 三种光照成分的RGBA值叠加就形成了物体最终的颜色。当任何一种颜色成分大于1.0,就用1.0计算。,5.1光照

4、及材质介绍,使用光照的一般步骤: 为物体的所有顶点定义法线向量。决定物体相对于光源的朝向。 创建光源、设置位置。 创建和选择光照模型,它定义了全局环境光的等级和观察点的位置。 并启用光照和对应光源。 设置物体的材料属性。,5.2 OpenGL光照模型,5.2.1 法线向量,法线向量:垂直于表面的向量。 法线决定了物体相对于光线的方向。 在OpenGL中,可以给一个多边形指定法线,也可以给每个顶点指定法线,但不能在顶点以外的其他地方指定法线。 对于每个顶点,OpenGL根据指定的法线来确定有多少来自光源的光将照射到该顶点上。,设置法线函数: void glNormal3*v(TYPE nx, T

5、YPE ny, TYPE nz) 该函数指定一个向量(nx,ny,nz),并被作为法线, 接下来在调用glVertex*()函数时,当前法线被赋值给 指定的顶点 法线向量仅表示方向,长度无关紧要,在计算光照之前,必须将法线向量的长度转换为1 ,称为法线的规范化,可调用以下函数进行法线向量的自动规范化: glEnable(GL_NORMALIZE);,5.2.1 法线向量,5.2.2 创建光源,指定光源属性函数: void glLightif(GLenum light, GLenum pname,TYPE param); 创建light所指定的光源,可以是GL_LIGHT0, GL_LIGHT1

6、,.,GL_LIGHT7,pname定义被设置的光 源属性,它指定一个命名参数,param表示pname属 性将要设置的值。,glLight*()函数的pname参数默认值,例: GLfloat light_ambient = 0.0,0.0,1.0,1.0; GLfloat light_diffuse= 1.0,1.0,0.0,1.0; GLfloat light_specular= 1.0,0.0,1.0,.0.0 GLfloat light_position= 1.0,1.0,1.0,0.0; glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);

7、glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position);,颜色,GL_AMBIENT:表示一个特定的光源在场景中所添加的环境光的RGBA强度。 GL_DIFFUSE:定义特定的光源在场景中所添加的散射光的RGBA强度,最接近于想象中“光的颜色”。 GL_SPECULAR:影响物体上镜面亮点的颜色。,位置,方向性(directional)光源:光源被放在无限远处,光线

8、照射在物体上时其方向是平行的(例:太阳) 位置性(positional)光源:光源在场景中的准确位置决定了它对场景产生的效果(例:台灯) 用GL_POSITION指定光照属性时,w=0,则光源为方向性光源,反之,则为位置性光源。,衰减,现实世界中,随光源距离增加,光的强度衰减。 衰减不适用于方向性光源,但可对位置性光源发 出的光进行衰减。 OpenGL把光源的强度乘以衰减因子,对它实行衰减,其中: d = 光源和顶点之间的距离 = GL_CONSTANT_ATTENUATIION = GL_LINEAR_ATTENUATIION =GL_QUADRATIC_ATTENUATIION,聚光灯,聚

9、光灯:对位置性光源加以限制,使它的发射范围限制在一个锥体之内,GL_SPOT_CUTOFF,【步骤】 1)使用GL_SPOT_CUTOFF指定光锥轴和光锥边缘的 角度,取值范围为0.0,90.0和180。 例: glLightf(GL_LIGHT0, GL_SPOT_CUTOFF,45.0) 2)使用GL_SPOT_DIRECTION指定聚光灯方向,以 确定光锥的轴线方向。 例: GLfloat spot_direction = -1.0,-1.0,0.0; glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction),3)使用GL_SPOT_

10、EXPONENT设置聚光指数,聚光指数控制光的集中程度,光锥中心的光强最大,越靠边的光强越小,默认为0 ,均匀照射。 例:glLightf(GL_LIGHT0, GL_SPOT_EXPONENT,2.0) 【注意】 聚光灯发出的光不会到达光锥边沿的外侧 默认情况下,聚光灯是被禁用的, 因为GL_SPOT_CUTOFF的值是180度。,5.2.3 选择光照模型,OpenGL的光照模型概念包括以下部分: 全局环境光强度。 观察点位置是局部于场景还是位于无限远处。 物体的正面和背面是否应该执行不同的光照计算。,指定光照模型函数: void glLightModelif(GLenum pname,TY

11、PE param) 设置光照模型属性。被设置的光照模型特征由pname定义,param表示pname属性被设置的值。,glLightModel*()函数的pname参数的默认值,几种常见的OpenGL光照模型: 全局环境光 局部视点和无穷远视点 双面光照,5.2.3 选择光照模型,全局环境光,全局环境光:不来自任何特定光源的环境光 设置举例: float Light_Model_Ambient = 0.2,0.2,0.2,1.0; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient);,局部视点和无穷远视点,对于局部视点:视点到

12、每个顶点的方向不同,需计算视点到每个顶点的方向。 对于无穷远视点:视点到任何顶点的方向都是相同的。 设置: glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); /局部视点 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); /无穷远视点,双面光照,双面光照:对所有多边形的正面和背面都进行光照计算。 设置: glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_TRUE); /启用双面光照 glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_

13、FALSE); /禁用,5.2.4 启用光源,要使光照有效,首先得启动光照,即:glEnable(GL_LIGHTING);若使光照无效,则调用Disable(GL_LIGHTING)可关闭当前光照。然后,必须使所定义的每个光源有效,例如:glEnable(GL_LIGHT0);其它光源类似,只是光源号不同而已。,5.3 材质,材质定义函数: void glMaterialif(GLenum face,GLenum pname, TYPE param); 指定一种用于光照计算的当前材料属性。face定 义GL_FRONT,GL_BACK或GL_FRONT_AND_BACK,表明材料属 性应用于

14、物体哪个面,pname指定要设置的材料属 性,param指定设置的属性值。,glMaterial*()函数的pname参数的默认值,镜面光处理 使用glLightf函数在光源中加入镜面光成分,为了出现镜面光效果,还要在材质属性中增加镜面成分。 镜面指数: glMateriali(GL_FRONT,GL_SHININESS,128); GL_SHININESS属性设置材质的镜面指数,它说明如何确定镜面亮斑的大小和聚焦程度。值越大,镜面高光的范围越小,亮度远大。,5.3 材质,辐射光通过给GL_EMISSION定义一个RGBA值,可以使物体看起来象发出这种颜色的光一样,以达到某种特殊效果。实际上,

15、现实生活中的物体除光源外都不发光,但我们可以利用这一特性来模拟灯和其他光源。代码举例如下:GLfloat mat_emission=0.3,0.3,0.5,0.0;glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);这样,物体看起来稍微有点发光。,5.3 材质,5.3.2 颜色材质,void glColorMaterial(GLenum face,GLenum mode) 使表面(由face指定)的材料属性(由mode指定)总是使用当前颜色(glColor设置的),当前颜色变化将会立即更新指定的材料属性。 face可以是GL_FRONT,GL_BAC

16、K或GL_FRONT_AND_BACK mode可以是GL_AMBIENT、GL_DIFFUSE、GL_AMBIENT_AND_DIFFUSE、GL_SPECULAR或GL_EMISSION,【注意】 需要用glEnable()函数启用材料颜色模式 glEnable(GL_COLOR_MATERIAL); 不需要材料颜色模式时应将其禁用,以免得到预料之外的材料属性。 建议:当需要更改单个材料参数的值时,使用glColorMaterial(),反之使用glMaterial()。,阴影 当物体阻止光源的光射到它后面的物体或表面时就会产生阴影。通常是通过把原物体压平、平放到平面表面的方法创建阴影。

17、处理时需要压平模型视图投影矩阵,此外需要考虑光源的距离和方向,光源的方向决定阴影的形状、影响阴影的尺寸。,扩展,光源的移动 OpenGL光源的位置和方向与其它几何图元的位置和方向一样都必须经过变换矩阵的作用。当用glLight()说明光源的位置和方向时,位置和方向都要经过当前变换矩阵的作用并保存在视点坐标系中,注意投影矩阵变换对它们不起作用。OpenGL可通过调整光源函数和视点变换函数在程序中的相对位置来获得三种不同的效果:1)光源位置保持固定、2)光源绕静止物体移动、3)光源随视点移动 。,扩展,阴影,影(又称影子、背影),光线被不透明物体阻档而产生的黑暗范围,与光源的方向相反。影的横切面是

18、二维轮廓、阻档光线物体的倒转投影。影的大小、形状随光线的入射角而改变。,在场景中添加阴影可以使得场景更加逼真。下面两幅图是有无阴影效果的对比:,如何制造阴影?,简单地做法,我们可以通过把源物体压平在物体表面所处的平面上,来制造阴影效果。然后被压平的物体用黑色或深色进行绘制。通过操作高级矩阵的方式,来把物体压平到其他表面上。,被压平的效果,我们需要压平的模型视图投影矩阵,以使得所有被绘制的物体都会被压平到阴影所处的二维平面上。无论物体朝哪个方向,都会被投影到阴影所在的平面上。在此需要考虑两种情况,光源离物体的距离以及光源的照射方向。光源的方向决定了阴影的形状和大小。就像在一天中的不同时段,人站在太阳底下,影子会随着太阳的位置而变化。,有一个函数MakePlanarShadowMatrix,它接受的参数包括一个阴影所处平面的平面方程(3个点不能位于一条直线上),光源的位置,返回的是一个变换矩阵。用当前的模型视图矩阵乘以这个矩阵,随后的所有被绘制的物体都会被压平到这个投影平面上。,void MakePlanarShadowMatrix(M3DMatrix44f p

温馨提示

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

评论

0/150

提交评论