- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3D游戏图形学实验四
数字图像处理实验指导书
《3D游戏图形学》
实验指导书
指导老师:马文娟
姓名:
学号:
浙江理工大学
2013年 12月
实验四 纹理映射实验
实验项目性质:设计性实验
所属课程名称:3D游戏图形学
实验计划学时:3学时
实验目的和要求
了解简单光照明模型的基本原理,利用VC++ OpenGL实现物体的光照和材质处理。
实验原理
光照模型
当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光;其次,对于透明物体,光可以穿透该物体并从另一端射出,产生透射光;最后,部分光被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。此外,物体本身还有可能发光,比如发光的灯泡。这里我们暂时不考虑透明物体,这样场景中可能存在以下几种类型的光,即环境光、散???光、镜面光和辐射光。
1)环境光(Ambient Light)
环境光有光源,但是由于被周围的环境,如地面、天空、墙壁等多次反射,变得无法确定其方向。环境光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去。一般说来,房间里的环境光成分要多些,户外的相反要少得多,因为大部分光按相同的方向照射,而在户外很少有其他物体反射的光。
2)漫射光(Diffuse Light)
漫射光来自某个方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去。于是,无论视点在哪里它都一样亮。来自特定位置和特定方向的任何光,都可能有散射成分。
3)镜面光(Specular Light)
镜面光也具有方向性,但被物体强烈地反射到另一个特定的方向。如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight)”,它是光源在金属球面上产生的镜面反射光。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。
4)辐射光
辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响。在OpenGL 中,任何一种光源都由三种光照成分组成:环境光、散射光和镜面光,当然光源本身还有可能发出辐射光。由于我们知道光是一种波,而颜色仅仅是我们可以看见的一种光波,所以每种光照成分都是由RGBA 值定义的。
材质属性
当我们使用光照来描述多边形,总是说它由具有某些反射属性的材质组成,而不说它具有特殊的颜色。这样我们指定物体的颜色,就必须指定物体材质对环境光、漫射光和镜面光源的反射属性。通常,我们用材质对光的红、绿、蓝三原色的反射率来近似定义材质属性。象光源一样,材质颜色也分成环境、漫反射和镜面反射成分,它们决定了材质对环境光、漫反射光和镜面反射光的反射程度。
在进行光照计算时,物体的最终颜色是由其材质属性的RGB 值 和光照属性的RGB 值共同决定的。例如,如果当前的环境光源的RGB 值为(0.5,1.0,0.5),而物体的材质的环境反射成分的RGB 值为(0.5,0.5,0.5),那么物体最终的颜色为:
(0.5×0.5,1.0×0.5,0.5×0.5)=(0.25,0.5,0.25)
即将每个环境光源的成分与材质的环境反射率相乘。这样,物体表面的颜色为三项RGB值的叠加:材质对环境光的反射率与环境光结合的RGB 值;材质对漫反射光的反射率与漫反射光结合的RGB 值;材质对镜面光的反射率与镜面反射光结合的RGB 值。注意,当叠加的RGB 中任何一个颜色分量的值大于1.0,那么就用1.0 计算。
实验内容
利用OpenGL函数实现一个简单的光照模型,显示一个具有灰色光影的球。调整球的材质属性,使其呈现不同的颜色。
源代码:
#include stdlib.h
#include GL/glut.h
// 初始化z缓冲区,投影矩阵,光源和光照模型
void init(void)
{
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };
GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat local_view[] = { 0.0 };
glClearColor(0.0, 0.1, 0.1, 0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glLightfv(GL_
文档评论(0)