OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt

上传人:小飞机 文档编号:1376581 上传时间:2022-11-16 格式:PPT 页数:44 大小:502.50KB
返回 下载 相关 举报
OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt_第1页
第1页 / 共44页
OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt_第2页
第2页 / 共44页
OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt_第3页
第3页 / 共44页
OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt_第4页
第4页 / 共44页
OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt》由会员分享,可在线阅读,更多相关《OpenGL图形编程8颜色光照材质(陈永强)ppt课件.ppt(44页珍藏版)》请在三一办公上搜索。

1、1,OpenGL图形编程,武汉纺织大学数学与计算机学院,授课教师:陈永强 教授,2,9.颜色/光照/材质,9.1颜色9.2光照9.3材质9.4透明处理(混合)9.5纹理映射,9.1颜色,OpenGL 颜色模式RGB(RGBA)模 式在 RGB 模式下,所有的颜色定义全用R、G、B 三个值来表示,有时也加上Alpha值(与透明度有关),即RGBA 模式。 颜色表模式 在颜色表模式下,每一个象素的颜色是用颜色表中的某个颜色索引值表示,而这个索引值指向了相应的R、G、B 值。,9.1颜色,OpenGL 颜色模式RGB(RGBA)模 式用 glColor*()来定义当前颜色,其函数形式为:void g

2、lColor (red, green, blue, alpha); 函数名中的x表示参数的数目,当它等于 3 的时候,三个参数分别代表R、G、B值, alpha值缺省为1.0;当它等于4的时候,还包括了Alpha 值,其范围从 0.0 到 1.0。函数名中的t指定参数数据的类型,可以取b、d、f、i、s、ub、ui或us,它们分别代表字节型、双精度型、浮点型、整型、短整型、无符号字节型和无符号短整型。,9.1颜色,OpenGL 颜色模式RGB(RGBA)模 式常用的指定颜色的函数是 glColor3f,其中每个颜色分量的值在0.0,1.0范围内。还有一个函数 glColor3ub,这个版本使用

3、的颜色分量的取值范围是 0 到 255 之间的无符号数。,9.1颜色,OpenGL 颜色模式颜色表模式 在颜色表模式(Color_Index Mode)下,可以调用 glIndex*()函数从颜色表中选取当前 颜色,其函数形式为: void glIndexsifd(TYPE c); void glIndexsifdv(TYPE *c); 参数值 c 用于设置当前颜色索引值,即调色板号,若值大于颜色位面数时则取模。,9.1颜色,着色模型绘制线框或填充多边形时,可用纯色(恒定着色)和平滑(Gouraud着色)两种着色模型。 void glShadeModel(GLenum mode)参数mode取

4、:纯色 GL_SMOOTH(默认) 平滑 GL_FLAT,9.1颜色,例子红皮书smooth.c,9.2光照,场景中的光类型点光源全局光照添加光照步骤,9.2光照,场景中的光类型环境光(Ambient Light) 散射光(Diffuse Light) 镜面光(Specular Light) 辐射光(Emitted Light),9.2光照,场景中的光类型环境光环境光有光源,但是由于被周围的环境,如地面、天空、墙壁等多次反射,变得无法确定其方向。环境光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去。一般说来,房间里的环境光成分要多些,户外的相反要少得多,因为大部分光按相同的方向照射,

5、而在户外很少有其他物体反射的光。,9.2光照,场景中的光类型散射光漫射光来自某个方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去。于是,无论视点在哪里它都一样亮。来自特定位置和特定方向的任何光,都可能有散射成分。,9.2光照,场景中的光类型镜面光镜面光也具有方向性,但被物体强烈地反射到另一个特定的方向。如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。,9.2光照,场景

6、中的光类型辐射光辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响。,9.2光照,场景中的光类型在 OpenGL 中,任何一种光源都由三种光照成分组成:环境光、散射光和镜面光,当然光源本身还有可能发出辐射光。光是一种波,而颜色仅仅是我们可以看见的一 种光波,每种光照成分都是由 RGBA 值定义的。,16,9.2光照,点光源在OpenGL场景描述中可以包含多个点光源,光源的各种属性设置使用下面的函数指定。void glLightif (GLenum light, GLenum pname, TYPE param);void glLightifv (GLenum light, GLenu

7、m pname, TYPE *param);第一个参数是一个符号常数,指定设置的是哪个光源的参数。第二个参数指定了设置的是哪一个参数。第三个参数是一个类型数组,用于指定相应的参数。,17,9.2光照,18,9.2光照,点光源点光源的颜色点光源的位置和类型聚光灯光强度衰减,19,9.2光照,点光源聚光灯1. 定义聚光源位置; 2. 定义聚光截止角; 使用参数 GL_SPOT_CUTOFF 定义聚光光锥的轴与中心线的夹角,是光锥顶角的一半。3. 定义聚光方向; 聚光方向决定聚光光锥的轴,使用齐次坐标定义,缺省值为(0.0,0.0,-1.0),即指向 Z 负轴。聚光方向是通过使用参数GL_SPOT_

8、DIRECTION定义。 4. 定义聚光指数。参数GL_SPOT_EXPONENT控制光的集中程度,光锥中心的光强最大,越靠边的光强越小,缺省时为 0。,20,9.2光照,点光源镜面光斑 在定义了光源中的镜面光成分之后,物体上并不会产生镜面光斑的效果,还需要定义材质的镜面反射率和镜面指数。,21,9.2光照,点光源在OpenGL中,必须明确启用或禁用光照。默认情况下,不启用光照,此时使用当前颜色绘制图形,不进行法线矢量、光源、光照模型、材质属性的相关计算。要启用光照,可以使用函数: glEnable(GL_LIGHTING);指定了光源的参数后,需要使用函数启用light指定的光源: glEn

9、able(light);,22,9.2光照,全局光照在OpenGL中,下面的函数用于指定全局光照 void glLightModelif (GLenum pname,TYPE param); void glLightModelifv (GLenum pname,TYPE *param);,9.2光照,添加光照步骤为顶点定义法线向量 glNormal3()创建光源 glLight()选择光照模型 3种启用光照 glEnable(GL_LIGHTING)设置材质,9.2光照,例子红皮书 单光源light.c 移动光源movelight.c,9.3材质,材质颜色材质颜色也分成环境、漫发射和镜面发射3

10、类成分,决定了材质对环境光、漫反射光和镜面反射光的反射程度。,26,9.3材质,在OpenGL中,下面的函数用于指定材质属性void glMaterialif (GLenum face, GLenum pname, TYPE param);void glMaterialifv (GLenum face, GLenum pname, TYPE *param);,27,9.3材质,OpenGL提供颜色材质模式: glEnable(GL_COLOR_MATERIAL); void glColorMaterial (GLenum face, GLenum mode); 颜色材质模式中,可以通过glCo

11、lor函数来指定物体表面的颜色,而相应的材质属性将通过颜色值和光源的RGB值计算出来。,9.3材质,区别说明需要改变场景中大部分顶点的某个单独材质特性时,使用glColorMaterial()。需要改变不止一个特性时,使用glMaterial*()。,9.3材质,例子红皮书material.c colormat.c,30,9.4透明处理(混合),OpenGL中使用混合实现透明处理。混合操作是指将输入对象(源)的颜色值与当前存储在帧缓存中的像素(目标)颜色值合并的过程。,9.4透明处理(混合),混合步骤启用深度测试绘制场景中所有不透明的物体关闭深度测试或设置深度测试为只读模式,并启用混合操作绘制

12、透明物体恢复深度测试,32,9.4透明处理,开启混合操作 glEnable(GL_BLEND);指定计算源因子和目标因子的计算方式 void glBlendFunc(GLenum srcfactor, GLenum destfactor);,33,9.4透明处理,34,9.4透明处理,进行混合计算假定计算出的源和目标混合因子分别为(Sr,Sg,Sb,Sa)和(Dr,Dg,Db,Da),并且分别使用下标s和d区分表示源和目标的RGBA值,则混合后的RGBA值如下: (RsSr+ RdDr,GsSg+Gd Dg,BsSb +BdDb,AsSa +AdDa),9.4透明处理,例子红皮书blendeq

13、n.c alpha.c alpha3D.c,9.5纹理映射,纹理映射步骤定义纹理对象 glTexImage2D()控制纹理 glTexParameter*()设置映射方式 glTexEnv*()加载纹理并绘制场景 生成纹理对象名称glGenTextures() 创建与使用纹理对象glBindTexture() 人工设置纹理坐标glTexCoord*() 自动设置纹理坐标glTexGen*()删除纹理对象 glDeleteTextures(),9.5纹理映射,纹理定义二维纹理void glTexImage2D(GLenum target, GLint level, GLint component

14、s, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels);参数target设置为GL_TEXTURE_2D;参数level表多级分辨率纹理的级数,一种分辨率设为0;参数components是一个从1到4的整数,指出选择RGBA的分量;参数width和heitht表纹理的长宽;参数border为纹理边界宽,通常为0;参数format和type表格式和数据类型;参数texels指纹理数据。,9.5纹理映射,纹理控制void glTexParameterifv(G

15、Lenum target, GLenum pname,TYPE param);参数target取 一维纹理GL_TEXTURE_1D 二维纹理GL_TEXTURE_2D参数pname和param见下表,9.5纹理映射,纹理控制,9.5纹理映射,纹理映射方式void glTexEnvifv(GLenum target, GLenum pname,TYPE param);,9.5纹理映射,加载纹理 生成纹理对象名称void glGenTextures(GLsizei n,GLuint* textureNames); 创建与使用纹理对象void glBindTexture(GLenum target

16、, GLuint textureName); 人工设置纹理坐标void glTexCoord1234sifdv(TYPE coords); 自动设置纹理坐标void glTexGenifdv(GLenum coord,GLenum pname,TYPE param);,42,9.5纹理映射,启用纹理glEnable(GL_TEXTURE_1D);glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_3D);,43,9.5纹理映射,在启用纹理之后,需要建立物体表面上的点与纹理空间的对应关系。在绘制基本图元时,在glVertex函数调用之前调用glTexCoord函数明确指定当前顶点所对应的纹理坐标。让OpenGL自动生成纹理坐标。,9.5纹理映射,例子红皮书checker.c texsub.c texbind.c texgen.c,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号