《《OpenGL基础》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《OpenGL基础》PPT课件.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、OpenGL编程基础编程基础颜色和光照颜色和光照上章回顾上章回顾v模型变换模型变换v视点变换视点变换v投影变换投影变换v视口变换视口变换v操纵矩阵堆栈操纵矩阵堆栈2本章内容本章内容v颜色颜色v光照概述光照概述v创建光源创建光源v选择光照模型选择光照模型v指定材质属性指定材质属性3内容进度内容进度v颜色颜色v光照概述v创建光源v选择光照模型v指定材质属性4颜色颜色vRGBn屏幕上的像素发出不同比例的红(屏幕上的像素发出不同比例的红(Red)、绿)、绿(Green)、蓝()、蓝(Blue)光,这三个值通常组合在一)光,这三个值通常组合在一起,统称为起,统称为RGBvR、G、B的取值范围的取值范围0
2、.0,1.0n0.0强度最小强度最小n1.0强度最大强度最大v常用的颜色常用的颜色nRGB(0,0,0)黑色黑色RGB(1,1,1)白色白色nRGB(1,1,0)黄色黄色RGB(1,0,1)紫色紫色nRGB(0,1,1)青色青色5颜色颜色v设置颜色的函数设置颜色的函数nglColor3f();nglColor4f();v指定着色模式指定着色模式n纯色(恒定着色)纯色(恒定着色)n多种颜色(平滑着色)多种颜色(平滑着色)n设置着色模式函数:设置着色模式函数:glShadeModel();6设置颜色函数设置颜色函数vvoid glColor3f(GLfloat r,GLfloat g,GLfloa
3、t b);v功能:功能:n设置当前颜色设置当前颜色v参数:参数:nr:红色分量的值:红色分量的值ng:绿色分量的值:绿色分量的值nb:蓝色分量的值:蓝色分量的值v返回值:无返回值:无v备注:备注:nr、g、b的值的范围在区间的值的范围在区间0,1内内n0.0强度最小强度最小n1.0强度最大强度最大7设置颜色函数设置颜色函数vvoid glColor4f(GLfloat r,GLfloat g,GLfloat b,GLfloat alpha);v功能:功能:n设置当前颜色设置当前颜色v参数:参数:nr:红色分量的值:红色分量的值ng:绿色分量的值:绿色分量的值nb:蓝色分量的值:蓝色分量的值na
4、lpha:alpha分量的值,用作混合分量的值,用作混合v返回值:无返回值:无v备注:备注:nr、g、b、alpha的值的范围在区间的值的范围在区间0,1内内n0.0强度最小强度最小n1.0强度最大强度最大8指定着色模式指定着色模式vvoid glShadeModel(GLenum mode);v功能:功能:n指定着色模式指定着色模式v参数:参数:nmode:着色模式:着色模式v返回值:无返回值:无v备注:备注:nmode可以取下列值:可以取下列值:uGL_FLAT恒定着色恒定着色uGL_SMOOTH平滑着色平滑着色9指定着色模式指定着色模式v恒定着色恒定着色 平滑着色平滑着色10内容进度内容
5、进度v颜色v光照概述光照概述v创建光源v选择光照模型v指定材质属性11光照概述光照概述v现实世界中,如果没有光,我们几乎看不到任何东西现实世界中,如果没有光,我们几乎看不到任何东西v在在OpenGL中,大多数物体在没有光照的情况下,看起中,大多数物体在没有光照的情况下,看起来甚至是二维的来甚至是二维的有光照有光照没有光照没有光照12光照概述光照概述v光照通常是在纹理映射之前进行的光照通常是在纹理映射之前进行的v光照效果:光照效果:n可以可以看到纹理看到纹理(贴图)(贴图)n光照可以大幅增加场景的光照可以大幅增加场景的真实感真实感n启用光照,将看不到物体表面的颜色信息启用光照,将看不到物体表面的
6、颜色信息n启用光照,可以看到物体表面的材质信息启用光照,可以看到物体表面的材质信息n物体表面的法线,将决定光的反射方向物体表面的法线,将决定光的反射方向nglShadeModel函数会影响法线函数会影响法线13glShadeModel函数会影响法线函数会影响法线GL_FLATGL_SMOOTHGL_PHONG_WIN例:光照球体例:光照球体14光照概述光照概述v光照的类型光照的类型n环境光环境光n散射光(漫反射光)散射光(漫反射光)n镜面反射光镜面反射光15光照概述光照概述v环境光环境光16光照概述光照概述v散射光(漫反射光)散射光(漫反射光)n反射方向是均匀分布在各个方向上的反射方向是均匀分
7、布在各个方向上的n从任何角度看上去,光照效果都是一样的从任何角度看上去,光照效果都是一样的17光照概述光照概述v镜面反射光镜面反射光n反射方向是几乎一致的反射方向是几乎一致的n镜面反射可以使物体看起来闪闪发光镜面反射可以使物体看起来闪闪发光n不同的角度,镜面反射的效果是不一样的不同的角度,镜面反射的效果是不一样的18光照概述光照概述v光照方程:光照方程:itotal=iamb+idiff+ispec19光照概述光照概述v材质颜色材质颜色n环境光颜色环境光颜色n散射光颜色散射光颜色n镜面反射光颜色镜面反射光颜色n发射光颜色发射光颜色改变环境光改变环境光改变散射光改变散射光改变镜面反射光改变镜面反
8、射光改变发射光改变发射光20光照概述光照概述v光源类型光源类型n平行光平行光n点光点光n聚光聚光21光照概述光照概述22内容进度内容进度v颜色v光照概述v创建光源创建光源v选择光照模型v指定材质属性23创建光源创建光源v光源的属性光源的属性n颜色颜色n位置位置n衰减衰减n聚光灯聚光灯n多光源多光源v设置光源属性的函数设置光源属性的函数nglLightfv()nglLightf()24设置光源属性设置光源属性vvoid glLightfv(GLenum light,GLint pname,GLfloat*param);v功能:功能:n设置光源属性设置光源属性v参数:参数:nlight:指定光源(
9、第几盏灯)指定光源(第几盏灯)npname:设置光源的属性设置光源的属性nparam:pname的值,是一个数组指针的值,是一个数组指针v返回值:无返回值:无25设置光源属性设置光源属性v备注:备注:nlight可取下列值:可取下列值:uGL_LIGHT0,GL_LIGHT1,GL_LIGHT7npname可取下列值:可取下列值:uGL_AMBIENT/环境光的颜色(默认黑色)环境光的颜色(默认黑色)uGL_DIFFUSE/散射光的颜色(默认白色或黑色)散射光的颜色(默认白色或黑色)uGL_SPECULAR/镜面反射光(默认白色或黑色)镜面反射光(默认白色或黑色)uGL_POSITION/光源
10、的位置(默认(光源的位置(默认(0,0,1)uGL_SPOT_DIRECTION/聚光灯的方向(默认(聚光灯的方向(默认(0,0,-1)26设置光源属性设置光源属性vvoid glLightf(GLenum light,GLint pname,GLfloat param);v功能:功能:n设置光源属性设置光源属性v参数:参数:nlight:指定光源(第几盏灯)指定光源(第几盏灯)npname:设置光源的属性设置光源的属性nparam:pname的值,是一个浮点数的值,是一个浮点数v返回值:无返回值:无27设置光源属性设置光源属性v备注:备注:nlight可取下列值:可取下列值:uGL_LIGH
11、T0,GL_LIGHT1,GL_LIGHT7npname可取下列值:可取下列值: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)28glLightfv举例举例GLfloat LightAmbient=0.5f,0.5f,
12、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_DIFFUSE,LightDiffuse);glLightfv(GL_LIG
13、HT0,GL_SPECULAR,LightSpecular);glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);29glLightf举例举例GLfloat LightSpotExponent=10.0f;/聚光指数聚光指数GLfloat LightSpotCutoff=20.0f;/聚光角度聚光角度 glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,LightSpotExponent);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,LightSpotCutoff);光源的属性光源的属性v颜色颜色n环境光颜色
14、环境光颜色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,LightAmbient);glLightfv(GL_LIGHT0,GL_DIFFUSE,LightDiffuse);glLight
15、fv(GL_LIGHT0,GL_SPECULAR,LightSpecular);31光源的属性光源的属性v位置位置n定向(定向(directional)光源,如太阳)光源,如太阳u位置(位置(x,y,z,w)中)中w为为0,则光源为定向光源,则光源为定向光源n定位定位(positional)光源,如台灯光源,如台灯u位置(位置(x,y,z,w)中)中w不为不为0,则光源为定位光源,则光源为定位光源32光源的属性光源的属性v例:例:/定向光源定向光源GLfloat LightPosition=0.0,0.0,30.0,0.0f;glLightfv(GL_LIGHT0,GL_POSITION,Li
16、ghtPosition);/定位光源定位光源GLfloat LightPosition=0.0,0.0,30.0,10.0f;glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);33光源的属性光源的属性v衰减衰减n定向光源没有衰减定向光源没有衰减n定位光源,对其发射光进行衰减定位光源,对其发射光进行衰减 1衰减系数衰减系数 ukc=GL_CONSTANT_ATTENUATIONukl=GL_LINEAR_ATTENUATIONukq=GL_QUADRATIC_ATTENUATIONv例:例:glLightf(GL_LIGHT5,GL_CONSTANT_
17、ATTENUATION,2.0);glLightf(GL_LIGHT5,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,0.5);kc+kld+kqd234光源的属性光源的属性v聚光灯聚光灯n聚光灯是一种定位光源,需要指定其位置聚光灯是一种定位光源,需要指定其位置n截止角,截止角,GL_SPOT_CUTOFFuGL_SPOT_CUTOFF默认值默认值180u除默认值外,它的取值范围除默认值外,它的取值范围0.0,90.0u例:例:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,45
18、.0);35光源的属性光源的属性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_DIRECTION,spot_direction);n聚光指数,聚光指数,GL_SPOT_EXPONENTu默认为默认为0.0,轴线处光强最大,轴线处光强最大u聚光指数越大,光源的聚焦效果越高聚光指数越大,光源的聚焦效果越高u例:例:uglLightf(GL_LIGHT1,GL_SPOT_EXP
19、ONENT,5.0)36光源的属性光源的属性v多光源多光源nOpenGL至少允许在场景中使用至少允许在场景中使用8个光源(甚至更多)个光源(甚至更多)nGL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT7 n使用多个光源将会降低性能使用多个光源将会降低性能37启用光源启用光源v要在要在OpenGL环境中使用光照,需要告诉环境中使用光照,需要告诉OpenGL系统系统启用光源启用光源v启用光源分为两步启用光源分为两步n开启光源开启光源1,开启光源,开启光源2,n开启光照渲染开启光照渲染v开启光源开启光源inglEnable(GL_LIGHTi);/i是从是从0到到7之间的
20、整数之间的整数v开启光照渲染开启光照渲染nglEnable(GL_LIGHTING);38禁用光源禁用光源v禁用光源分为两种情况禁用光源分为两种情况n禁用指定光源禁用指定光源n禁用光照渲染(禁用所有光源)禁用光照渲染(禁用所有光源)v禁用光源禁用光源inglDisable(GL_LIGHTi);/i是从是从0到到7之间的整数之间的整数v禁用光照渲染禁用光照渲染nglDisable(GL_LIGHTING);39控制光源的位置和方向控制光源的位置和方向v可以通过模型视点变换来改变光源的位置和方向可以通过模型视点变换来改变光源的位置和方向v三种常见的光源变换三种常见的光源变换n光源位置固定光源位置
21、固定n光源绕静止的物体旋转光源绕静止的物体旋转n光源随视点一起移动光源随视点一起移动v光源位置固定光源位置固定n必须在视点变换或模型变换后,再次设置光源的位必须在视点变换或模型变换后,再次设置光源的位置置40控制光源的位置和方向控制光源的位置和方向v例:光源位置固定例:光源位置固定void display(void)/清屏清屏/移动视点及绘图移动视点及绘图/重置光源的位置重置光源的位置glLoadIdentity();GLfloat light_position=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,GL_POSITION,light_position);41
22、控制光源的位置和方向控制光源的位置和方向v例:光源绕静止物体旋转例:光源绕静止物体旋转(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);glPushMatrix();glRotated(GLdouble)spin,1.0,0.0,0.0);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glPopMatrix();gl
23、utSolidTorus();glPopMatrix();glFlush();42例:例:MoveLight43控制光源的位置和方向控制光源的位置和方向v例:光源随视点一起移动例:光源随视点一起移动glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();gluLookAt(ex,ey,ez,0.0,0.0,0.0,upx,upy,upz);glutSolidTorus(0.275,0.85,8,15);glPopMatrix();glFlush();44内容进度内容进度v颜色v光照概述v创建光源v选择光照模型选择光照模型v
24、指定材质属性45选择光照模型选择光照模型vOpenGL光照模型包括光照模型包括4项内容项内容n全局环境光强度全局环境光强度n观察点靠近场景还是位于无穷远处观察点靠近场景还是位于无穷远处n单面光照或双面光照单面光照或双面光照n镜面反射颜色是否独立于环境颜色、散射颜色镜面反射颜色是否独立于环境颜色、散射颜色(OpenGL 1.4)v选择光照模型的函数选择光照模型的函数nglLightModelfv();nglLightModeli();46选择光照模型选择光照模型vvoid glLightModelfv(GLenum pname,GLfloat*param);v功能:功能:n选择光照模型选择光照模
25、型v参数:参数:npname:光照模型的类型光照模型的类型nparam:该类型值的数组地址该类型值的数组地址v返回值:无返回值:无v备注:备注:npname可以取值为:可以取值为:uGL_LIGHT_MODEL_AMBIENT 整个场景的整个场景的RGBA强度强度(0.2,0.2,0.2,1.0)47选择光照模型选择光照模型v全局环境光全局环境光n即使没有其他光源,也可以看到场景中的物体即使没有其他光源,也可以看到场景中的物体v例例:设置全局环境光颜色:设置全局环境光颜色GLfloat lmodel_ambient=0.2,0.2,0.2,1.0;glLightModelfv(GL_LIGHT
26、_MODEL_AMBIENT,lmodel_ambient);48选择光照模型选择光照模型vvoid glLightModeli(GLenum pname,GLint param);v功能:功能:n选择光照模型选择光照模型v参数:参数:npname:光照模型的类型光照模型的类型nparam:该类型的值该类型的值v返回值:无返回值:无v备注:备注:npname可以取值为:可以取值为:uGL_LIGHT_MODEL_LOCAL_VIEWER /观察点是否无穷远观察点是否无穷远(GL_FALSE)uGL_LIGHT_MODEL_TWO_SIDE/单面还是双面光照单面还是双面光照(GL_FALSE)4
27、9选择光照模型选择光照模型v观察点靠近物体还是无穷远观察点靠近物体还是无穷远n在视点无穷远的情况下,场景中任何顶点到视点的在视点无穷远的情况下,场景中任何顶点到视点的方向都是同一常数。方向都是同一常数。n否则,则不然,但效果会更加真实否则,则不然,但效果会更加真实v例:指定观察点无穷远例:指定观察点无穷远glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);50选择光照模型选择光照模型v单面光照或双面光照单面光照或双面光照n多边形的正面和背面是否都需要光照多边形的正面和背面是否都需要光照v例:指定双面光照例:指定双面光照glLightModeli
28、(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);51学习工具学习工具vlightPostion52内容进度内容进度v颜色v光照概述v创建光源v选择光照模型v指定材质属性指定材质属性53指定材质属性指定材质属性v启用光照时,物体顶点的颜色信息将被忽略启用光照时,物体顶点的颜色信息将被忽略v启用光照时,物体顶点的颜色取决于光源的颜色和物体启用光照时,物体顶点的颜色取决于光源的颜色和物体材质的颜色材质的颜色54指定材质属性指定材质属性v材质的属性材质的属性n环境颜色环境颜色n散射颜色散射颜色n镜面反射颜色镜面反射颜色n光洁度光洁度n发射光颜色发射光颜色v决定物体表面颜色的因素决定
29、物体表面颜色的因素n材质的属性材质的属性n光源的属性光源的属性n光照模型光照模型55指定材质属性指定材质属性v指定材质属性的函数指定材质属性的函数nglMaterialfv()56指定材质属性指定材质属性vvoid glMaterialfv(GLenum face,GLenum pname,GLfloat*param);v功能:功能:n指定材质属性指定材质属性v参数:参数:nface:指定正面或背面的材质指定正面或背面的材质npname:指定要设置哪种材质属性指定要设置哪种材质属性nparam:属性值的数组地址属性值的数组地址v返回值:无返回值:无57指定材质属性指定材质属性v备注:备注:nf
30、ace可取如下值:可取如下值:uGL_FRONTuGL_BACKuGL_FRONT_AND_BACKnpname可取如下值:可取如下值:uGL_AMBIENT(0.2,0.2,0.2,1.0)uGL_DIFFUSE(0.8,0.8,0.8,1.0)uGL_AMBIENT_AND_DIFFUSEuGL_SPECULAR(0.0,0.0,0.0,1.0)uGL_SHININESS(0.0)uGL_EMISSION(0.0,0.0,0.1,1.0)58指定材质属性指定材质属性v例:散射和环境光反射例:散射和环境光反射GLfloat mat_amb_diff=0.1,0.5,0.8,1.0;glMat
31、erialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,mat_amb_diff);v例:镜面反射材质例:镜面反射材质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);59指定材质属性指定材质属性v例:发射光颜色例:发射光颜色GLfloat mat_emission=0.3,0.2,0.2,0.0;glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);v发射光材质使物体看起来发出微光,而并不是光源发射光材质使物体看起来发出微光,而并不是光源n要模拟光源,必须创建一个光源,并将其放在物体要模拟光源,必须创建一个光源,并将其放在物体所在位置所在位置60学习工具学习工具vlightMaterial61例:例:Material62本章内容总结本章内容总结v颜色颜色v光照概述光照概述v创建光源创建光源v选择光照模型选择光照模型v指定材质属性指定材质属性63