计算机图形学课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》课程设计
(2015----2016学年第二学期)
学院
专业班级
学号
学生姓名
老师
编写日期:2016年xx月xx日
目录
真实感游戏场景绘制 (3)
一实验目的 (3)
二实验内容 (3)
三实验分工 (4)
四理论基础 (4)
1雾化模型 (4)
2颜色模型 (5)
3光照模型 (6)
4纹理模型 (6)
五系统描述 (13)
1墙壁、地面、箱子 (13)
2石柱、雪人 (14)
3玻璃球 (15)
4天空 (17)
六心得体会 (19)
七附录:程序源代码 (19)
2/ 45
真实感游戏场景绘制
【摘要】本次课程设计绘制了一个真实感的三维场景,并实现场景漫游。主要绘制了墙壁与地面、天空、石柱、箱子、玻璃球、雪人、雾等对象。以Visual Studio2012为平台用OpenGL基础知识实现此真实感场景的绘制。
一实验目的
1.熟悉OpenGL基础函数,并了解其用法。
2.通过程序模拟真实感游戏场景,掌握图形综合展示效果,基于专业背景,结合实验课内容与课程设计要求,使用OpenGL绘制简单的3D真实感游戏场景,包括光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用。
二实验内容和效果
光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中的应用,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。
图1 游戏场景整体效果
三实验分工
本次课程设计实验,小组成员齐心协力。首先从自己尝试编写没有成功到后来的各种搜集资料,寻找3D游戏场景的绘制代码,到最后小组成员分工解析代码并注释,做PPT,演讲PPT等,大家合作都很用心。这次的实验中我们小组每个成员在每一个环节都参与任务,因代码过多,也都参与到代码解析中。具体安排如下:
四理论基础
1雾化模型
OpenGL中提供了完整的雾化接口,我们只需要选择合适的雾气的混合因子、密度、颜色、起始位置等。在OpenGL中,雾的工作模式有两种:线性模式和指数模式。这两种模式是根据雾的浓度变化来区分的。
在线性模式下,只需要提供一个距离视点的开始位置和结束位置。从开始位置到结束位置之间,雾的浓度越来越高,浓度的变化和距离成正比。
在指数模式下,雾的浓度随着距离的增加呈指数增长。这种模式通常用来用于烟雾、烟幕等效果。
glFogf(GL_FOG_START, 1.0f)确定了雾的开始初离屏幕有多近。
glFogf(GL_FOG_END, 5.0),它告诉OpenGL雾能离开屏幕有多远
glHint(GL_FOG_HINT, GL_DONT_CARE)确定了雾的渲染方式,使用
GL_DONT_CARE是因为并不关心建议值。这个项的不同值之间的区别:
GK_DONT_CARE:让OPENGL自己来确定雾的渲染方式,每顶点或是每像素。
4/ 45
GL_NICEST:对每一像素进行雾的渲染,它看起来是极棒的。
GL_FASTEST:对每一顶点进行雾的渲染,它速度较快,但是不够美丽
我们的雾气设置如下:
修改函数里面的参数改变雾的颜色和浓度:
图2 改变颜色(蓝色)和浓度的雾气
2颜色模型
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。
RGBA颜色
RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色。
3光照模型
光照模型包括许多因素,如物体的类型,物体相对光源与其他物体的位置以及场景中所设置的光源属性,物体的透明度,物体的表面光亮程度,甚至物体的各种表面纹理等。光照到物体表面时,物体对光会发生反射、透射、吸收、衍射、折射和干涉。通常观察不透明、不发光的物体,人眼所观察到的是从物体表面的得到的反射光,它是由场景中的光源和其他物体表面的反射光共同作用产生的。
简单光照明模型模拟物体表面对直接光照的反射作用,包括镜面反射和漫反射,而物体间的光反射作用没有被充分考虑到,仅仅用一个与物体周围和视点、光源位置都无关的环境光常量来近似表示。可以用如下表达式表示:入射光=环境光+漫反射+镜面反射光
4纹理模型
(因为我们的场景大量使用了纹理模型,且我主要也负责纹理模型,因此处会详细解释。)
我们都知道物体表面通常并不是具有简单颜色的平滑面,而是有着花纹图案等丰富细节的。
计算机三维图形通过给面贴纹理来表现表面细节。OpenGL默认设置是关闭贴纹理的,所以必须先用命令打开纹理计算。
glEnable(GL_TEXTURE_2D); // 启用二维纹理
glDisable(GL_TEXTURE_2D); // 禁用二维纹理
1、启用纹理和载入纹理
6/ 45
如同我们曾经学习过的OpenGL光照、混合等功能一样。在使用纹理前,必须启用它。OpenGL支持一维纹理、二维纹理、三维纹理和四维纹理。一般情况下使用二维纹理即可。
使用纹理前,必须载入纹理。利用glTexImage2D函数可以载入一个二维的纹理,该函数有多达九个参数,
glTexImage2D(GL_TEXTURE_2D,Glint level,Glint components,Glsizei width,Glsizei Height,Glint order,Glenum ype,const Glvoid *pixels)
详细说明如下:第一个参数为指定的目标,在我们的入门教材中,这个参数将始终使用GL_TEXTURE_2D。
第二个参数为“多重细节层次”,现在我们并不考虑多重纹理细节,因此这个参数设置为零。
第三个参数有两种用法。在OpenGL最初的版本中,使用整数来表示颜色分量数目,例如:像素数据用RGB颜色表示,总共有红、绿、蓝三个值,因此参数设置为3,而如果像素数据是用RGBA颜色表示,总共有红、绿、蓝、alpha四个值,因此参数设置为4。而在后来的版本中,可以直接使用GL_RGB或GL_RGBA 来表示以上情况,显得更直观。注意:虽然我们使用Windows的BMP文件作为纹理时,一般是蓝色的像素在最前,其真实的格式为GL_BGR而不是GL_RGB,在数据的顺序上有所不同,但因为同样是红、绿、蓝三种颜色,因此这里仍然使用GL_RGB。如果使用GL_BGR,OpenGL将无法识别这个参数,造成错误。
第四、五个参数是二维纹理像素的宽度和高度。在使用纹理时要特别注意其大小,必须使用大小为2的整数次方的纹理。在很长一段时间内,很多图形程序都喜欢使用256*256大小的纹理,不仅因为256是2的整数次方,也因为某些硬件可以使用8位的整数来表示纹理坐标,2的8次方正好是256,这一巧妙的组合为处理纹理坐标时的硬件优化创造了一些不错的条件。
第六个参数是纹理边框的大小。
最后三个参数分别是纹理的图像数据格式,数据类型和纹理图像的像素数据的存储地址。