- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
光照模型及纹理映射
光照模型及纹理映射
基本光照模型
在现实生活中,当光照在非透明物体上时,部分光线被物体吸收,剩余的部分光线被反射。人眼依靠这种反射光来感知物体的形状、颜色和其他细节。从光源投向物体的光称为入射光,从物体表面反射回的光称为反射光。
光照模型概述
当光照射到物体表面上时,将出现3种情况:
光从物体表面反射,形成反射光
光穿透物体,形成透射光
光被物体吸收,转化成为物体的内能
在上述三种情形的光线中,通常只有前2种情形的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。
OpenGL用一种近似的光照模型模拟现实世界的光照效果。在该模型中,仅当物体表面吸收和反射光线时,光源才会起做作用。每一个物体表面都假定是由某种特性的材料构成的。一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能像镜子一样在某个方向强烈地反射入射光。
光照分量
在OpenGL的简化光照模型中,将光照分为4个独立的组成部分:辐射光、环境光、漫反射光和镜面反射光。
辐射光
辐射光是直接从物体或光源发出的,不受任何其他光源的影响。
环境光
环境光是这样一种光线,它被环境多次反射,以致于连初始方向也难以确定。这种光线看起来就像来自于所有的方向,当它照在一个物体表面时,它在所有的方向上等量地反射。
漫反射光
在被照射物体表面的反射光中,那些均匀地向各个方向反射出去的光,称为漫反射光,如黑板反射就属于漫反射光
镜面反射光
镜面反射光是指超一定方向的反射光,如点光源照射光滑金属球表面时,会在球表面形成一个特别亮的区域,呈现所谓的高亮(Highlight),这就是光源在该物体表面形成的镜面反射光(Specular Light)。点光源照射表面光滑的物体时,高亮区域小而亮;而点光源照射表面粗糙的物体时,高亮区域大而不亮。
创建光源
光源有许多特性,如颜色、位置、方向等。不同特性的光源,作用在物体上的效果是不一样的。
定义一个简单光源
在OpenGL中,定义一个光源是由函数glLight()来实现的,该函数的原型为:void glLight(GLenum light,GLenum pname);
light为一个光源,pname为光源light指定一个单值的光源参数,其取值及其含义如下表所示:
pname 功 能 缺 省 值 GL_AMBIENT 环境光分量的强度 (0.0,0.0,0.0,1.0) GL_FIFFUSE 漫反射光分量的强度 (1.0,1.0,1.0,1.0) GL_SPECULAR 镜面反射光分量的强度 (1.0,1.0,1.0,1.0) GL_POSITION 光源位置 (0.0,0.0,0.0,0.0) GL_SPOT_DIRECTION 光源聚光方向 (0.0,0.0,-1.0) GL_SPOT_EXPONENT 光源的聚光指数 0.0 GL_SPOT_CUTOFF 聚光的截至角 180.0 GL_CONSTANT_ATTENUATION 光的常数衰减因子 1.0 GL_LINEAR_ATTENUATION 光的线性衰减因子 0.0 GL_QUADERTIC_ATTENUATION 光的二次衰减因子 0.0 光源的数目与具体的实现的系统有关,但至少支持8个光源。它们用符号名称GL_LIGHTi相互区别,这里0≤i≤GL_MAX_LIGHTS,如GL_LIGHT0,GL_LIGHT1,…GL_LIGHT7等。
以下的代码定义了一个编号为GL_LIGHT0的光源的例子:
GLfloat light_ambient[]={0.0,0.0,0.0,1.0};
GLfloat light_diffuse[]={1.0,1.0,1.0,1.0};
GLfloat light_specular[]={1.0,1.0,1.0,1.0};
GLfloat light_position[]={1.0,1.0,1.0,1.0};
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
光源定义完毕后,必须调用glEnable(GL_LIGHT0)打开该光源,否则该光源对场景中的物体不起作用。
1.3.2 启用光源和激活光源
在OpenGL中,如果需要使用光源,首先必须启用光照。
启动光照的函数为:glEnable(GL_LIGHTING);
取消光照的函数为:glDisable(GL_LIGHTIN
文档评论(0)