第13讲 OpenGL 光照_第1页
第13讲 OpenGL 光照_第2页
第13讲 OpenGL 光照_第3页
第13讲 OpenGL 光照_第4页
第13讲 OpenGL 光照_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、3.6 OpenGL光照光照v 光照概述光照概述v 创建光源v 选择光照模型v 指定材质属性光照概述光照概述v 现实世界中,如果没有光,我们几乎看不到任何东西现实世界中,如果没有光,我们几乎看不到任何东西v 在在OpenGL中,大多数物体在没有光照的情况下,看起中,大多数物体在没有光照的情况下,看起来甚至是二维的来甚至是二维的有光照有光照没有光照没有光照光照概述光照概述v 光照通常是在纹理映射之前进行的光照通常是在纹理映射之前进行的v 光照效果:光照效果:n 可以可以看到纹理看到纹理(贴图)(贴图)n 光照可以大幅增加场景的光照可以大幅增加场景的真实感真实感n 启用光照,将看不到物体表面的颜色

2、信息启用光照,将看不到物体表面的颜色信息n 启用光照,可以看到物体表面的材质信息启用光照,可以看到物体表面的材质信息n 物体表面的法线,将决定光的反射方向物体表面的法线,将决定光的反射方向光照概述光照概述v 光照的类型光照的类型n 环境光环境光n 散射光(漫反射光)散射光(漫反射光)n 镜面反射光镜面反射光n 材质发射光材质发射光光照概述光照概述v 环境光环境光n 经过环境多次经过环境多次散射,无法确定其散射,无法确定其方向的光。方向的光。光照概述光照概述v 散射光(漫反射光)散射光(漫反射光)n 反射方向是均匀分布在各个方向上的反射方向是均匀分布在各个方向上的n 从任何角度看上去,光照效果都

3、是一样的从任何角度看上去,光照效果都是一样的光照概述光照概述v 镜面反射光镜面反射光n 反射方向是几乎一致的反射方向是几乎一致的n 镜面反射可以使物体看起来闪闪发光镜面反射可以使物体看起来闪闪发光n 不同的角度,镜面反射的效果是不一样的不同的角度,镜面反射的效果是不一样的光照概述光照概述v 发射光发射光n 材质发出的发射光材质发出的发射光n 用于模拟物体发出的光用于模拟物体发出的光n 表面的发射光增加了物体的亮度,它不受光源的影响表面的发射光增加了物体的亮度,它不受光源的影响n 发射光不会给整个场景增加光线发射光不会给整个场景增加光线8/38改变环境光改变环境光改变散射光改变散射光改变镜面反射

4、光改变镜面反射光改变发射光改变发射光光照概述光照概述v 光源类型光源类型n 平行光平行光n 点光点光n 聚光聚光光照概述光照概述内容进度内容进度v 光照概述v 创建光源创建光源v 选择光照模型v 指定材质属性创建光源创建光源v 光源的属性光源的属性n 颜色颜色n 位置位置n 衰减衰减n 聚光灯聚光灯n 多光源多光源v 设置光源属性的函数设置光源属性的函数n glLightfv()n glLightf()设置光源属性设置光源属性v void glLightfv(GLenum light, GLint pname, GLfloat* param);v 功能:功能:n 设置光源属性设置光源属性v 参

5、数:参数:n light: 指定光源(第几盏灯)指定光源(第几盏灯)n pname: 设置光源的属性设置光源的属性n param: pname的值,是一个数组指针的值,是一个数组指针v 返回值:无返回值:无设置光源属性设置光源属性v 备注:备注:n light可取下列值:可取下列值:uGL_LIGHT0, GL_LIGHT1, GL_LIGHT7n pname可取下列值:可取下列值:uGL_AMBIENT/环境光的颜色(默认黑色)环境光的颜色(默认黑色)uGL_DIFFUSE/散射光的颜色(默认白色或黑色)散射光的颜色(默认白色或黑色)uGL_SPECULAR/镜面反射光(默认白色或黑色)镜面

6、反射光(默认白色或黑色)uGL_POSITION/光源的位置(默认(光源的位置(默认(0,0,1)uGL_SPOT_DIRECTION/聚光灯的方向(默认(聚光灯的方向(默认(0,0,-1)设置光源属性设置光源属性v void glLightf(GLenum light, GLint pname, GLfloat param);v 功能:功能:n 设置光源属性设置光源属性v 参数:参数:n light: 指定光源(第几盏灯)指定光源(第几盏灯)n pname:设置光源的属性设置光源的属性n param: pname的值,是一个浮点数的值,是一个浮点数v 返回值:无返回值:无设置光源属性设置光源

7、属性v 备注:备注:n light可取下列值:可取下列值:uGL_LIGHT0, GL_LIGHT1, GL_LIGHT7n pname可取下列值:可取下列值:uGL_SPOT_EXPONENT/聚光指数(默认聚光指数(默认0.0)uGL_SPOT_CUTOFF/聚光截止角(默认聚光截止角(默认180.0)uGL_CONSTANT_ATTENUATION/固定衰减因子(默认固定衰减因子(默认1.0)uGL_LINEAR_ATTENUATION/线性衰减因子(默认线性衰减因子(默认0.0)uGL_QUADRATIC_ATTENUATION/二次衰减因子(默认二次衰减因子(默认0.0)glLigh

8、tfv举例举例GLfloat LightAmbient=0.5f,0.5f,0.5f,1.0f;/Ambient lightGLfloat LightDiffuse=1.0f,1.0f,1.0f,1.0f;/Diffuse lightGLfloat LightSpecular=0.5f,0.5f,0.5f,1.0f;/Light SpecularGLfloat LightPosition=0.0f,0.0f,30.0f,1.0f;/Light PositionglLightfv(GL_LIGHT0,GL_AMBIENT, LightAmbient);glLightfv(GL_LIGHT0,GL

9、_DIFFUSE, LightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR, LightSpecular);glLightfv(GL_LIGHT0,GL_POSITION, LightPosition);glLightf举例举例GLfloat LightSpotExponent = 10.0f; /聚光指数聚光指数GLfloat LightSpotCutoff = 20.0f; /聚光角度聚光角度 glLightf( GL_LIGHT1,GL_SPOT_EXPONENT, LightSpotExponent );glLightf( GL_LIGHT1, GL

10、_SPOT_CUTOFF, LightSpotCutoff );光源的属性光源的属性v 颜色颜色n 环境光颜色环境光颜色n 散射光颜色散射光颜色n 镜面反射光颜色镜面反射光颜色v 例:例:GLfloat LightAmbient=0.5f,0.5f,0.5f,1.0f;/Ambient lightGLfloat LightDiffuse=1.0f,1.0f,1.0f,1.0f;/Diffuse lightGLfloat LightSpecular=0.5f,0.5f,0.5f,1.0f;/Light SpecularglLightfv(GL_LIGHT0,GL_AMBIENT, LightAm

11、bient);glLightfv(GL_LIGHT0,GL_DIFFUSE, LightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR, LightSpecular);光源的属性光源的属性v 位置位置n 定向(定向(directional)光源,如太阳)光源,如太阳u位置(位置(x, y, z, w)中)中w为为0,则光源为定向光源,则光源为定向光源n 定位定位(positional)光源,如台灯光源,如台灯u位置(位置(x, y, z, w)中)中w不为不为0,则光源为定位光源,则光源为定位光源光源的属性光源的属性v 例:例:/定向光源定向光源GLfloat

12、 LightPosition= 0.0, 0.0, 30.0, 0.0f ;glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);/定位光源定位光源GLfloat LightPosition= 0.0, 0.0, 30.0, 10.0f ;glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);光源的属性光源的属性v 衰减衰减n 定向光源没有衰减定向光源没有衰减n 定位光源,对其发射光进行衰减定位光源,对其发射光进行衰减 1衰减系数衰减系数 ukc = GL_CONSTANT_ATTENUATIONukl = GL_

13、LINEAR_ATTENUATIONukq = GL_QUADRATIC_ATTENUATIONud为光源位置与顶点之间的距离为光源位置与顶点之间的距离v 例:例:glLightf(GL_LIGHT5, GL_CONSTANT_ATTENUATION, 2.0);glLightf(GL_LIGHT5, GL_LINEAR_ATTENUATION, 1.0);glLightf(GL_LIGHT5, GL_QUADRATIC_ATTENUATION, 0.5);kc+kld+kqd2光源的属性光源的属性v 聚光灯聚光灯n 聚光灯是一种定位光源,需要指定其位置聚光灯是一种定位光源,需要指定其位置n

14、截止角,截止角,GL_SPOT_CUTOFFuGL_SPOT_CUTOFF默认值默认值180,聚光灯特性被禁用,聚光灯特性被禁用u除默认值外,它的取值范围除默认值外,它的取值范围0.0, 90.0u例:例:glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);光源的属性光源的属性n 聚光灯方向,聚光灯方向, GL_SPOT_DIRECTION (轴线方向)(轴线方向)u默认方向(默认方向(0.0, 0.0, -1.0)u例:例:GLfloat spot_direction = -1.0, -1.0, 0.0;glLightfv(GL_LIGHT0, GL_SPOT

15、_DIRECTION, spot_direction);n 聚光指数,聚光指数, GL_SPOT_EXPONENTu默认为默认为0.0,轴线处光强最大,轴线处光强最大u聚光指数越大,光源的聚焦效果越高聚光指数越大,光源的聚焦效果越高u例:例:uglLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 5.0)光源的属性光源的属性v 多光源多光源n OpenGL至少允许在场景中使用至少允许在场景中使用8个光源(甚至更多,这取决于个光源(甚至更多,这取决于opengl实现)实现)n GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, ,GL_LIGHT7 n 使用多

16、个光源将会降低性能使用多个光源将会降低性能启用光源启用光源v 要在要在OpenGL环境中使用光照,需要告诉环境中使用光照,需要告诉OpenGL系统系统启用光源启用光源v 启用光源分为两步启用光源分为两步n 开启光源开启光源1,开启光源,开启光源2, n 开启光照渲染开启光照渲染v 开启光源开启光源in glEnable(GL_LIGHTi);/i是从是从0到到7之间的整数之间的整数v 开启光照渲染开启光照渲染n glEnable(GL_LIGHTING);禁用光源禁用光源v 禁用光源分为两种情况禁用光源分为两种情况n 禁用指定光源禁用指定光源n 禁用光照渲染(禁用所有光源)禁用光照渲染(禁用所

17、有光源)v 禁用光源禁用光源n glDisable(GL_LIGHTi);/i是从是从0到到7之间的整数之间的整数v 禁用光照渲染禁用光照渲染n glDisable(GL_LIGHTING);内容进度内容进度v 光照概述v 创建光源v 选择光照模型选择光照模型v 指定材质属性选择光照模型选择光照模型v OpenGL光照模型包括光照模型包括4项内容项内容n 全局环境光强度全局环境光强度n 观察点靠近场景还是位于无穷远处观察点靠近场景还是位于无穷远处n 单面光照或双面光照单面光照或双面光照n 镜面反射颜色是否独立于环境颜色、散射颜色(镜面反射颜色是否独立于环境颜色、散射颜色(OpenGL 1.4)

18、v 选择光照模型的函数选择光照模型的函数n glLightModelfv();n glLightModeli();选择光照模型选择光照模型v void glLightModelfv(GLenum pname, GLfloat* param);v 功能:功能:n 选择光照模型选择光照模型v 参数:参数:n pname: 光照模型的类型光照模型的类型n param: 该类型值的数组地址该类型值的数组地址v 返回值:无返回值:无v 备注:备注:n pname可以取值为:可以取值为:uGL_LIGHT_MODEL_AMBIENT 整个场景的整个场景的RGBA强度强度(0.2, 0.2, 0.2, 1.

19、0) 选择光照模型选择光照模型v 全局环境光全局环境光n 即使没有其他光源,也可以看到场景中的物体即使没有其他光源,也可以看到场景中的物体v 例例:设置全局环境光颜色:设置全局环境光颜色GLfloat lmodel_ambient = 0.2, 0.2, 0.2, 1.0 ;glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);选择光照模型选择光照模型v void glLightModeli(GLenum pname, GLint param);v 功能:功能:n 选择光照模型选择光照模型v 参数:参数:n pname: 光照模型的类型光

20、照模型的类型n param: 该类型的值该类型的值v 返回值:无返回值:无v 备注:备注:n pname可以取值为:可以取值为:uGL_LIGHT_MODEL_LOCAL_VIEWER /观察点是否无穷远观察点是否无穷远(GL_FALSE)uGL_LIGHT_MODEL_TWO_SIDE /单面还是双面光照单面还是双面光照(GL_FALSE )选择光照模型选择光照模型v 观察点靠近物体还是无穷远观察点靠近物体还是无穷远n 在视点无穷远的情况下,场景中任何顶点到视点的方向都是同一常数。在视点无穷远的情况下,场景中任何顶点到视点的方向都是同一常数。n 否则,则不然,但效果会更加真实否则,则不然,但

21、效果会更加真实v 例:指定观察点无穷远例:指定观察点无穷远glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);选择光照模型选择光照模型v 单面光照或双面光照单面光照或双面光照n 多边形的正面和背面是否都需要光照多边形的正面和背面是否都需要光照v 例:指定双面光照例:指定双面光照glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);内容进度内容进度v 光照概述v 创建光源v 选择光照模型v 指定材质属性指定材质属性指定材质属性指定材质属性v 启用光照时,物体顶点的颜色信息将被忽略启用光照时,物体顶点的颜

22、色信息将被忽略v 启用光照时,物体顶点的颜色取决于光源的颜色和物启用光照时,物体顶点的颜色取决于光源的颜色和物体材质的颜色体材质的颜色指定材质属性指定材质属性v 材质的属性材质的属性n 环境颜色环境颜色n 散射颜色散射颜色n 镜面反射颜色镜面反射颜色n 光洁度光洁度n 发射光颜色发射光颜色v 决定物体表面颜色的因素决定物体表面颜色的因素n 材质的属性材质的属性n 光源的属性光源的属性n 光照模型光照模型指定材质属性指定材质属性v 指定材质属性的函数指定材质属性的函数n glMaterialfv()指定材质属性指定材质属性v void glMaterialfv(GLenum face, GLenum pname, GLfloat* param);v 功能:功能:n 指定材质属性指定材质属性v 参数:参数:n face: 指定正面或背面的材质指定正面或背面的材质n pname: 指定要设置哪种材质属性指定要设置哪种材质属性n param: 属性值的数组地址属性值的数组地址v 返回值:无返回值:无指定材质属性指定材质属性v 备注:备注:n face可取如下值:可取如下值:uGL_FRONTuGL_BACKuGL_FRONT_AND_BACK

温馨提示

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

评论

0/150

提交评论