您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 第13讲-OpenGL-光照
3.6OpenGL光照光照概述创建光源选择光照模型指定材质属性光照概述现实世界中,如果没有光,我们几乎看不到任何东西在OpenGL中,大多数物体在没有光照的情况下,看起来甚至是二维的有光照没有光照光照概述光照通常是在纹理映射之前进行的光照效果:可以看到纹理(贴图)光照可以大幅增加场景的真实感启用光照,将看不到物体表面的颜色信息启用光照,可以看到物体表面的材质信息物体表面的法线,将决定光的反射方向光照概述光照的类型环境光散射光(漫反射光)镜面反射光材质发射光光照概述环境光经过环境多次散射,无法确定其方向的光。光照概述散射光(漫反射光)反射方向是均匀分布在各个方向上的从任何角度看上去,光照效果都是一样的光照概述镜面反射光反射方向是几乎一致的镜面反射可以使物体看起来闪闪发光不同的角度,镜面反射的效果是不一样的光照概述发射光材质发出的发射光用于模拟物体发出的光表面的发射光增加了物体的亮度,它不受光源的影响发射光不会给整个场景增加光线8/38改变环境光改变散射光改变镜面反射光改变发射光光照概述光源类型平行光点光聚光光照概述内容进度光照概述创建光源选择光照模型指定材质属性创建光源光源的属性颜色位置衰减聚光灯多光源设置光源属性的函数glLightfv(…)glLightf(…)设置光源属性voidglLightfv(GLenumlight,GLintpname,GLfloat*param);功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个数组指针返回值:无设置光源属性备注:light可取下列值:GL_LIGHT0,GL_LIGHT1,…GL_LIGHT7pname可取下列值:GL_AMBIENT//环境光的颜色(默认黑色)GL_DIFFUSE//散射光的颜色(默认白色或黑色)GL_SPECULAR//镜面反射光(默认白色或黑色)GL_POSITION//光源的位置(默认(0,0,1))GL_SPOT_DIRECTION//聚光灯的方向(默认(0,0,-1))设置光源属性voidglLightf(GLenumlight,GLintpname,GLfloatparam);功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个浮点数返回值:无设置光源属性备注:light可取下列值:GL_LIGHT0,GL_LIGHT1,…GL_LIGHT7pname可取下列值:GL_SPOT_EXPONENT//聚光指数(默认0.0)GL_SPOT_CUTOFF//聚光截止角(默认180.0)GL_CONSTANT_ATTENUATION//固定衰减因子(默认1.0)GL_LINEAR_ATTENUATION//线性衰减因子(默认0.0)GL_QUADRATIC_ATTENUATION//二次衰减因子(默认0.0)glLightfv举例GLfloatLightAmbient[]={0.5f,0.5f,0.5f,1.0f};//AmbientlightGLfloatLightDiffuse[]={1.0f,1.0f,1.0f,1.0f};//DiffuselightGLfloatLightSpecular[]={0.5f,0.5f,0.5f,1.0f};//LightSpecularGLfloatLightPosition[]={0.0f,0.0f,30.0f,1.0f};//LightPositionglLightfv(GL_LIGHT0,GL_AMBIENT,LightAmbient);glLightfv(GL_LIGHT0,GL_DIFFUSE,LightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,LightSpecular);glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);glLightf举例GLfloatLightSpotExponent=10.0f;//聚光指数GLfloatLightSpotCutoff=20.0f;//聚光角度glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,LightSpotExponent);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,LightSpotCutoff);光源的属性颜色环境光颜色散射光颜色镜面反射光颜色例:GLfloatLightAmbient[]={0.5f,0.5f,0.5f,1.0f};//AmbientlightGLfloatLightDiffuse[]={1.0f,1.0f,1.0f,1.0f};//DiffuselightGLfloatLightSpecular[]={0.5f,0.5f,0.5f,1.0f};//LightSpecularglLightfv(GL_LIGHT0,GL_AMBIENT,LightAmbient);glLightfv(GL_LIGHT0,GL_DIFFUSE,LightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,LightSpecular);光源的属性位置定向(directional)光源,如太阳位置(x,y,z,w)中w为0,则光源为定向光源定位(positional)光源,如台灯位置(x,y,z,w)中w不为0,则光源为定位光源光源的属性例://定向光源GLfloatLightPosition[]={0.0,0.0,30.0,0.0f};glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);//定位光源GLfloatLightPosition[]={0.0,0.0,30.0,10.0f};glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);光源的属性衰减定向光源没有衰减定位光源,对其发射光进行衰减1衰减系数=------kc=GL_CONSTANT_ATTENUATIONkl=GL_LINEAR_ATTENUATIONkq=GL_QUADRATIC_ATTENUATIONd为光源位置与顶点之间的距离例: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光源的属性聚光灯聚光灯是一种定位光源,需要指定其位置截止角,GL_SPOT_CUTOFFGL_SPOT_CUTOFF默认值180,聚光灯特性被禁用除默认值外,它的取值范围[0.0,90.0]例:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0);光源的属性聚光灯方向,GL_SPOT_DIRECTION(轴线方向)默认方向(0.0,0.0,-1.0)例:GLfloatspot_direction[]={-1.0,-1.0,0.0};glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_direction);聚光指数,GL_SPOT_EXPONENT默认为0.0,轴线处光强最大聚光指数越大,光源的聚焦效果越高例:glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,5.0)光源的属性多光源OpenGL至少允许在场景中使用8个光源(甚至更多,这取决于opengl实现)GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,……,GL_LIGHT7使用多个光源将会降低性能启用光源要在OpenGL环境中使用光照,需要告诉OpenGL系统启用光源启用光源分为两步开启光源1,开启光源2,…………开启光照渲染开启光源iglEnable(GL_LIGHTi);//i是从0到7之间的整数开启光照渲染glEnable(GL_LIGHTING);禁用光源禁用光源分为两种情况禁用指定光源禁用光照渲染(禁用所有光源)禁用光源glDisable(GL_LIGHTi);//i是从0到7之间的整数禁用光照渲染glDisable(GL_LIGHTING);内容进度光照概述创建光源选择光照模型指定材质属性选择光照模型OpenGL光照模型包括4项内容全局环境光强度观察点靠近场景还是位于无穷远处单面光照或双面光照镜面反射颜色是否独立于环境颜色、散射颜色(OpenGL1.4)选择光照模型的函数glLightModelfv(…);glLightModeli(…);选择光照模型voidglLightModelfv(GLenumpname,GLfloat*param);功能:选择光照模型参数:pname:光照模型的类型param:该类型值的数组地址返回值:无备注:pname可以取值为:GL_LIGHT_MODEL_AMBIENT整个场景的RGBA强度(0.2,0.2,0.2,1.0)选择光照模型全局环境光即使没有其他光源,也可以看到场景中的物体例:设置全局环境光颜色GLfloatlmodel_ambient[]={0.2,0.2,0.2,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);选择光照模型voidglLightModeli(GLenumpname,GLintparam);功能:选择光照模型参数:pname:光照模型的类型param:该类型的值返回值:无备注:pname可以取值为:GL_LIGHT_MODEL_LOCAL_VIEWER//观察点是否无穷远(GL_FALSE)GL_LIGHT_MODEL_TWO_SIDE//单面还是双面光照(GL_FALSE)选择光照模型观察点靠近物体还是无穷远在视点无穷远的情况下,场景中任何顶点到视点的方向都是同一常数。否则,则不然,但效果会更加真实例:指定观察点无穷远glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);选择光照模型单面光照或双面光照多边形的正面和背面是否都需要光照例:指定双面光照glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);内容进度光照概述创建光源选择光照模型指定材质属性指定材质属性启用光照时,物体顶点的颜色信息将被忽略启用光照时,物体顶点的颜色取决于光源的颜色和物体材质的颜色指定材质属性材质的属性环境颜色散射颜色镜面反射颜色光洁度发射光颜色决定物体表面颜色的因素材质的属性光源的属性光照模型指定材质属性指定材质属性的函数glMaterialfv(…)指定材质属性voidglMaterialfv(GLenumface,GLenumpname,GLfloat*param);功能:指定材质属性参数:face:指定正面或背面的材质pname:指定要设置哪种材质属性param:属性值的数组地址返回值:无指定材质属性备注:face可取如下值:GL_FRONTGL_BACKGL_FRONT_AND_BACKpname可取如下值:GL_AMBIENT(0.2,0.2,0.2,1.0)GL_DIFFUSE(0.8,0.8,0.8,1.0)GL_AMBIENT_AND_DIFFUSEGL_SPECULAR(0.0,0.0,0.
本文标题:第13讲-OpenGL-光照
链接地址:https://www.777doc.com/doc-4376390 .html