OpenGL基础5

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

OpenGL编程基础颜色和光照上章回顾模型变换视点变换投影变换视口变换操纵矩阵堆栈2/38本章内容颜色光照概述创建光源选择光照模型指定材质属性3/38内容进度颜色光照概述创建光源选择光照模型指定材质属性4/38颜色RGB屏幕上的像素发出不同比例的红(Red)、绿(Green)、蓝(Blue)光,这三个值通常组合在一起,统称为RGBR、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_LIGHT7pname可取下列值: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_LIGHT7pname可取下列值: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_ATTENUATIONkl=GL_LINEAR_ATTENUATIONkq=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_CUTOFFGL_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,…………开启光照渲染开启光源iglEnable(GL_LIGHTi);//i是从0到7之间的整数开启光照渲染glEnable(GL_LIGHTING);38/38禁用光源禁用光源分为两种情况禁用指定光源禁用光照渲染(禁用所有光源)禁用光源iglDisable(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

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功