第9章 OpenGL入门学习之七——使用光照来表现立体感.pdfVIP

第9章 OpenGL入门学习之七——使用光照来表现立体感.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenGL 入门学习之七——使用光照来表现立体感 2009-01-07 11:49 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达 了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类 而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果 的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效 果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 图1 OpenGL 对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效 果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但 可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅 画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都 是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终 几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确 模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的 最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL 在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光 照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种 物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL 中没有考虑光的折射), 材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的 光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时, 指定一个 “环境亮度”参数,可以使最后形成的画面更接近于真实情况。 在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为 镜面反射)。光线如果射入粗糙的、不光滑的平面,则反射后的光线是杂乱的(这样的反射 称为漫反射)。现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以 看成是这两种反射的叠加。对于光源发出的光线,可以分别设置其经过镜面反射和漫反射后 的光线强度。对于被光线照射的材质,也可以分别设置光线经过镜面反射和漫反射后的光线 强度。这些因素综合起来,就形成了最终的光照效果。 二、法线向量 根据光的反射定律,由光的入射方 和入射点的法线就可以得到光的出射方 。因此,对于 指定的物体,在指定了光源后,即可计算出光的反射方 ,进而计算出光照效果的画面。在 OpenGL 中,法线的方 是用一个向量来表示。 不幸的是,OpenGL 并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成的物 体的表面的每个点的法线(这话听着有些迷糊),通常,为了实现光照效果,需要在代码中 为每一个顶点指定其法线向量。 指定法线向量的方式与指定颜色的方式有雷同之处。在指定颜色时,只需要指定每一个顶点 的颜色,OpenGL 就可以自行计算顶点之间的其它点的颜色。并且,颜色一旦被指定,除非 再指定新的颜色,否则以后指定的所有顶点都将以这一向量作为自己的颜色。在指定法线 量时,只需要指定每一个顶点的法线向量,OpenGL 会自行计算顶点之间的其它点的法线 量。并且,法线向量一旦被指定,除非再指定新的法线向量,否则以后指定的所有顶点都将 以这一向量作为自己的法线向量。使用glColor* 函数可以指定颜色,而使用glNormal*函数 则可以指定法线向量。 注意:使用glTranslate* 函数或者glRotate*函数可以改变物体的外观,但法线向量并不会随 之改变。然而,使用glScale* 函数,对每一坐标轴进行不同程度的缩放,很有可能导致法线 向量的不正确,虽然OpenGL 提供了一些措施来修正这一问题,但由此也带来了各种开销。 因此,在使用了法线向量的场合,应尽量避免使用glScale* 函数。即使使用,也最好保证各 坐标轴进行等比例缩放。 三、控制光源 在OpenGL 中,仅仅支持有限数量的光源。使用GL_LIGHT0 表示第 0 号光源,GL_LIGHT1 表示第 1 号光源,依次类推,OpenGL 至少会支持8 个光源,即GL_LIGHT0 到 GL_LIGHT7 。使用glEnable 函数可以开启它们。例如,glEnable(GL_LIGHT0);可

文档评论(0)

daijun + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档