《《OpenGL基础》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《OpenGL基础》PPT课件.ppt(63页珍藏版)》请在三一办公上搜索。
1、OpenGL编程基础,颜色和光照,2,上章回顾,模型变换视点变换投影变换视口变换操纵矩阵堆栈,3,本章内容,颜色光照概述创建光源选择光照模型指定材质属性,4,内容进度,颜色光照概述创建光源选择光照模型指定材质属性,5,颜色,RGB屏幕上的像素发出不同比例的红(Red)、绿(Green)、蓝(Blue)光,这三个值通常组合在一起,统称为RGBR、G、B的取值范围0.0,1.00.0强度最小1.0强度最大常用的颜色RGB(0,0,0)黑色RGB(1,1,1)白色RGB(1,1,0)黄色RGB(1,0,1)紫色RGB(0,1,1)青色,6,颜色,设置颜色的函数glColor3f();glColor4
2、f();指定着色模式纯色(恒定着色)多种颜色(平滑着色)设置着色模式函数:glShadeModel();,7,设置颜色函数,void glColor3f(GLfloat r,GLfloat g,GLfloat b);功能:设置当前颜色参数:r:红色分量的值g:绿色分量的值b:蓝色分量的值返回值:无备注:r、g、b的值的范围在区间0,1内0.0强度最小1.0强度最大,8,设置颜色函数,void glColor4f(GLfloat r,GLfloat g,GLfloat b,GLfloat alpha);功能:设置当前颜色参数:r:红色分量的值g:绿色分量的值b:蓝色分量的值alpha:alpha
3、分量的值,用作混合返回值:无备注:r、g、b、alpha的值的范围在区间0,1内0.0强度最小1.0强度最大,9,指定着色模式,void glShadeModel(GLenum mode);功能:指定着色模式参数:mode:着色模式返回值:无备注:mode可以取下列值:GL_FLAT恒定着色GL_SMOOTH平滑着色,10,指定着色模式,恒定着色 平滑着色,11,内容进度,颜色光照概述创建光源选择光照模型指定材质属性,12,光照概述,现实世界中,如果没有光,我们几乎看不到任何东西在OpenGL中,大多数物体在没有光照的情况下,看起来甚至是二维的,有光照,没有光照,13,光照概述,光照通常是在纹
4、理映射之前进行的光照效果:可以看到纹理(贴图)光照可以大幅增加场景的真实感启用光照,将看不到物体表面的颜色信息启用光照,可以看到物体表面的材质信息物体表面的法线,将决定光的反射方向glShadeModel函数会影响法线,14,glShadeModel函数会影响法线,GL_FLATGL_SMOOTHGL_PHONG_WIN,例:光照球体,15,光照概述,光照的类型环境光散射光(漫反射光)镜面反射光,16,光照概述,环境光,17,光照概述,散射光(漫反射光)反射方向是均匀分布在各个方向上的从任何角度看上去,光照效果都是一样的,18,光照概述,镜面反射光反射方向是几乎一致的镜面反射可以使物体看起来闪
5、闪发光不同的角度,镜面反射的效果是不一样的,19,光照概述,光照方程:itotal=iamb+idiff+ispec,20,光照概述,材质颜色环境光颜色散射光颜色镜面反射光颜色发射光颜色,改变环境光,改变散射光,改变镜面反射光,改变发射光,21,光照概述,光源类型平行光点光聚光,22,光照概述,23,内容进度,颜色光照概述创建光源选择光照模型指定材质属性,24,创建光源,光源的属性颜色位置衰减聚光灯多光源设置光源属性的函数glLightfv()glLightf(),25,设置光源属性,void glLightfv(GLenum light,GLint pname,GLfloat*param);
6、功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个数组指针返回值:无,26,设置光源属性,备注:light可取下列值:GL_LIGHT0,GL_LIGHT1,GL_LIGHT7pname可取下列值:GL_AMBIENT/环境光的颜色(默认黑色)GL_DIFFUSE/散射光的颜色(默认白色或黑色)GL_SPECULAR/镜面反射光(默认白色或黑色)GL_POSITION/光源的位置(默认(0,0,1)GL_SPOT_DIRECTION/聚光灯的方向(默认(0,0,-1),27,设置光源属性,void glLightf(GLenum
7、 light,GLint pname,GLfloat param);功能:设置光源属性参数:light:指定光源(第几盏灯)pname:设置光源的属性param:pname的值,是一个浮点数返回值:无,28,设置光源属性,备注: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_QUA
8、DRATIC_ATTENUATION/二次衰减因子(默认0.0),29,glLightfv举例,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_AMBI
9、ENT,LightAmbient);glLightfv(GL_LIGHT0,GL_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);glL
10、ightf(GL_LIGHT1,GL_SPOT_CUTOFF,LightSpotCutoff);,31,光源的属性,颜色环境光颜色散射光颜色镜面反射光颜色例: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,LightAmbient);glLightfv
11、(GL_LIGHT0,GL_DIFFUSE,LightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,LightSpecular);,32,光源的属性,位置定向(directional)光源,如太阳位置(x,y,z,w)中w为0,则光源为定向光源定位(positional)光源,如台灯位置(x,y,z,w)中w不为0,则光源为定位光源,33,光源的属性,例:/定向光源GLfloat LightPosition=0.0,0.0,30.0,0.0f;glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);/定位光源GLfloa
12、t LightPosition=0.0,0.0,30.0,10.0f;glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);,34,光源的属性,衰减定向光源没有衰减定位光源,对其发射光进行衰减 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);glLi
13、ghtf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,0.5);,kc+kld+kqd2,35,光源的属性,聚光灯聚光灯是一种定位光源,需要指定其位置截止角,GL_SPOT_CUTOFFGL_SPOT_CUTOFF默认值180除默认值外,它的取值范围0.0,90.0例:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45.0);,36,光源的属性,聚光灯方向,GL_SPOT_DIRECTION(轴线方向)默认方向(0.0,0.0,-1.0)例:GLfloat spot_direction=-1.0,-1.0,0.0;glLightfv(GL_LIG
14、HT0,GL_SPOT_DIRECTION,spot_direction);聚光指数,GL_SPOT_EXPONENT默认为0.0,轴线处光强最大聚光指数越大,光源的聚焦效果越高例:glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,5.0),37,光源的属性,多光源OpenGL至少允许在场景中使用8个光源(甚至更多)GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT7 使用多个光源将会降低性能,38,启用光源,要在OpenGL环境中使用光照,需要告诉OpenGL系统启用光源启用光源分为两步开启光源1,开启光源2,开启光照渲染开启光源iglEnab
15、le(GL_LIGHTi);/i是从0到7之间的整数开启光照渲染glEnable(GL_LIGHTING);,39,禁用光源,禁用光源分为两种情况禁用指定光源禁用光照渲染(禁用所有光源)禁用光源iglDisable(GL_LIGHTi);/i是从0到7之间的整数禁用光照渲染glDisable(GL_LIGHTING);,40,控制光源的位置和方向,可以通过模型视点变换来改变光源的位置和方向三种常见的光源变换光源位置固定光源绕静止的物体旋转光源随视点一起移动光源位置固定必须在视点变换或模型变换后,再次设置光源的位置,41,控制光源的位置和方向,例:光源位置固定void display(void)
16、/清屏/移动视点及绘图/重置光源的位置glLoadIdentity();GLfloat light_position=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,GL_POSITION,light_position);,42,控制光源的位置和方向,例:光源绕静止物体旋转(MoveLight)GLfloat light_position=0.0,0.0,1.5,1.0;glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslatef(0.0,0.0,-5.0);glPushMatr
17、ix();glRotated(GLdouble)spin,1.0,0.0,0.0);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glPopMatrix();glutSolidTorus();glPopMatrix();glFlush();,43,例:MoveLight,44,控制光源的位置和方向,例:光源随视点一起移动glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();gluLookAt(ex,ey,ez,0.0,0.0,0.0,upx,upy,upz);glutSo
18、lidTorus(0.275,0.85,8,15);glPopMatrix();glFlush();,45,内容进度,颜色光照概述创建光源选择光照模型指定材质属性,46,选择光照模型,OpenGL光照模型包括4项内容全局环境光强度观察点靠近场景还是位于无穷远处单面光照或双面光照镜面反射颜色是否独立于环境颜色、散射颜色(OpenGL 1.4)选择光照模型的函数glLightModelfv();glLightModeli();,47,选择光照模型,void glLightModelfv(GLenum pname,GLfloat*param);功能:选择光照模型参数:pname:光照模型的类型par
19、am:该类型值的数组地址返回值:无备注:pname可以取值为:GL_LIGHT_MODEL_AMBIENT 整个场景的RGBA强度(0.2,0.2,0.2,1.0),48,选择光照模型,全局环境光即使没有其他光源,也可以看到场景中的物体例:设置全局环境光颜色GLfloat lmodel_ambient=0.2,0.2,0.2,1.0;glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);,49,选择光照模型,void glLightModeli(GLenum pname,GLint param);功能:选择光照模型参数:pname:光照模型
20、的类型param:该类型的值返回值:无备注:pname可以取值为:GL_LIGHT_MODEL_LOCAL_VIEWER/观察点是否无穷远(GL_FALSE)GL_LIGHT_MODEL_TWO_SIDE/单面还是双面光照(GL_FALSE),50,选择光照模型,观察点靠近物体还是无穷远在视点无穷远的情况下,场景中任何顶点到视点的方向都是同一常数。否则,则不然,但效果会更加真实例:指定观察点无穷远glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);,51,选择光照模型,单面光照或双面光照多边形的正面和背面是否都需要光照例:指定双面光照glLig
21、htModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);,52,学习工具,lightPostion,53,内容进度,颜色光照概述创建光源选择光照模型指定材质属性,54,指定材质属性,启用光照时,物体顶点的颜色信息将被忽略启用光照时,物体顶点的颜色取决于光源的颜色和物体材质的颜色,55,指定材质属性,材质的属性环境颜色散射颜色镜面反射颜色光洁度发射光颜色决定物体表面颜色的因素材质的属性光源的属性光照模型,56,指定材质属性,指定材质属性的函数glMaterialfv(),57,指定材质属性,void glMaterialfv(GLenum face,GLenum pn
22、ame,GLfloat*param);功能:指定材质属性参数:face:指定正面或背面的材质pname:指定要设置哪种材质属性param:属性值的数组地址返回值:无,58,指定材质属性,备注: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.0,1.0)GL_SHININESS(0.0)GL_EMISSION(0.0,0.0,0.1,1.0),5
23、9,指定材质属性,例:散射和环境光反射GLfloat mat_amb_diff=0.1,0.5,0.8,1.0;glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff);例:镜面反射材质GLfloat mat_specular=1.0,1.0,1.0,1.0;GLfloat low_shininess=5.0;glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,low_shininess);,60,指定材质属性,例:发射光颜色GLfloat mat_emission=0.3,0.2,0.2,0.0;glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);发射光材质使物体看起来发出微光,而并不是光源要模拟光源,必须创建一个光源,并将其放在物体所在位置,61,学习工具,lightMaterial,62,例:Material,63,本章内容总结,颜色光照概述创建光源选择光照模型指定材质属性,