OpenGL编程基础颜色和光照上章回顾模型变换视点变换投影变换视口变换操纵矩阵堆栈2/38本章内容颜色光照概述创建光源选择光照模型指定材质属性3/38内容进度颜色光照概述创建光源选择光照模型指定材质属性4/38颜色RGB屏幕上的像素发出不同比例的红(Red)、绿(Green)、蓝(Blue)光,这三个值通常组合在一起,统称为RGBR、G、B的取值范围〔0.0,1.0〕0.0强度最小1.0强度最大常用的颜色RGB(0,0,0)黑色RGB(1,1,1)白色RGB(1,1,0)黄色RGB(1,0,1)紫色RGB(0,1,1)青色5/38颜色设置颜色的函数glColor3f(…);glColor4f(…);指定着色模式纯色(恒定着色)多种颜色(平滑着色)设置着色模式函数:glShadeModel(…);6/38设置颜色函数voidglColor3f(GLfloatr,GLfloatg,GLfloatb);功能:设置当前颜色参数:r:红色分量的值g:绿色分量的值b:蓝色分量的值返回值:无备注:r、g、b的值的范围在区间〔0,1〕内0.0强度最小1.0强度最大7/38设置颜色函数voidglColor4f(GLfloatr,GLfloatg,GLfloatb,GLfloatalpha);功能:设置当前颜色参数:r:红色分量的值g:绿色分量的值b:蓝色分量的值alpha:alpha分量的值,用作混合返回值:无备注:r、g、b、alpha的值的范围在区间〔0,1〕内0.0强度最小1.0强度最大8/38指定着色模式voidglShadeModel(GLenummode);功能:指定着色模式参数:mode:着色模式返回值:无备注:mode可以取下列值:GL_FLAT恒定着色GL_SMOOTH平滑着色9/38指定着色模式恒定着色平滑着色10/38内容进度颜色光照概述创建光源选择光照模型指定材质属性11/38光照概述现实世界中,如果没有光,我们几乎看不到任何东西在OpenGL中,大多数物体在没有光照的情况下,看起来甚至是二维的12/38有光照没有光照光照概述光照通常是在纹理映射之前进行的光照效果:可以看到纹理(贴图)光照可以大幅增加场景的真实感启用光照,将看不到物体表面的颜色信息启用光照,可以看到物体表面的材质信息物体表面的法线,将决定光的反射方向glShadeModel函数会影响法线13/38glShadeModel函数会影响法线GL_FLATGL_SMOOTHGL_PHONG_WIN14/38例:光照球体光照概述光照的类型环境光散射光(漫反射光)镜面反射光15/38光照概述环境光16/38光照概述散射光(漫反射光)反射方向是均匀分布在各个方向上的从任何角度看上去,光照效果都是一样的17/38光照概述镜面反射光反射方向是几乎一致的镜面反射可以使物体看起来闪闪发光不同的角度,镜面反射的效果是不一样的18/38光照概述光照方程:itotal=iamb+idiff+ispec19/38光照概述材质颜色环境光颜色散射光颜色镜面反射光颜色发射光颜色20/38改变环境光改变散射光改变镜面反射光改变发射光光照概述光源类型平行光点光聚光21/38光照概述22/38内容进度颜色光照概述创建光源选择光照模型指定材质属性23/38创建光源光源的属性颜色位置衰减聚光灯多光源设置光源属性的函数glLightfv(…)glLightf(…)24/38设置光源属性voidglLightfv(GLenumlight,GLintpname,GLfloat*param);功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个数组指针返回值:无25/38设置光源属性备注:light可取下列值:GL_LIGHT0,GL_LIGHT1,…GL_LIGHT7pname可取下列值:GL_AMBIENT//环境光的颜色(默认黑色)GL_DIFFUSE//散射光的颜色(默认白色或黑色)GL_SPECULAR//镜面反射光(默认白色或黑色)GL_POSITION//光源的位置(默认(0,0,1))GL_SPOT_DIRECTION//聚光灯的方向(默认(0,0,-1))26/38设置光源属性voidglLightf(GLenumlight,GLintpname,GLfloatparam);功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个浮点数返回值:无27/38设置光源属性备注: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)28/38glLightfv举例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);29/38glLightf举例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);31/38光源的属性位置定向(directional)光源,如太阳位置(x,y,z,w)中w为0,则光源为定向光源定位(positional)光源,如台灯位置(x,y,z,w)中w不为0,则光源为定位光源32/38光源的属性例://定向光源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);33/38光源的属性衰减定向光源没有衰减定位光源,对其发射光进行衰减1衰减系数=------kc=GL_CONSTANT_ATTENUATIONkl=GL_LINEAR_ATTENUATIONkq=GL_QUADRATIC_ATTENUATION例:glLightf(GL_LIGHT5,GL_CONSTANT_ATTENUATION,2.0);glLightf(GL_LIGHT5,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,0.5);34/38kc+kld+kqd2光源的属性聚光灯聚光灯是一种定位光源,需要指定其位置截止角,GL_SPOT_CUTOFFGL_SPOT_CUTOFF默认值180除默认值外,它的取值范围[0.0,90.0]例:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0);35/38光源的属性聚光灯方向,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)36/38光源的属性多光源OpenGL至少允许在场景中使用8个光源(甚至更多)GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,……,GL_LIGHT7使用多个光源将会降低性能37/38启用光源要在OpenGL环境中使用光照,需要告诉OpenGL系统启用光源启用光源分为两步开启光源1,开启光源2,…………开启光照渲染开启光源iglEnable(GL_LIGHTi);//i是从0到7之间的整数开启光照渲染glEnable(GL_LIGHTING);38/38禁用光源禁用光源分为两种情况禁用指定光源禁用光照渲染(禁用所有光源)禁用光源iglDisable(GL_LIGHTi);//i是从0到7之间的整数禁用光照渲染glDisable(GL_LIGHTING);39/38控制光源的位置和方向可以通过模型视点变换来改变光源的位置和方向三种常见的光源变换光源位置固定光源绕静止的物体旋转光源随视点一起移动光源位置固定必须在视点变换或模型变换后,再次设置光源的位置40/38控制光源的位置和方向例:光源位置固定voiddisplay(void){//清屏//……//移动视点及绘图//……//重置光源的位置glLoadIdentity();GLfloatlight_position[]={1.0,1.0,1.0,1.0};glLightfv(GL_LIGHT0,GL_POSITION,light_position);}41/38控制光源的位置和方向例:光源绕静止物体旋转(MoveLight)GLfloatlight_position[]={0.0,0.0,1.5,1.0};glClear(GL_COLOR_BUFFER_BIT|GL_DEP