hyde
路人甲
路人甲
  • 注册日期2003-09-24
  • 发帖数555
  • QQ
  • 铜币1457枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1322回复:0

OpenGL系列讲座(21)

楼主#
更多 发布于:2004-03-21 11:07
第四章 OpenGL 特殊光处理
 

 

本章内容是基础篇第七章的补充和提高。这一章主要讲述一些特殊光效果处理,如全局

环境光、双面光照、光的衰减、聚光、多光源、光源位置的改变等等。读者若有兴趣,可以

按照本章例程的方法作出许多变换,则会出现意想不到的效果,充分发挥你的艺术才能。

 

4.1  光照模型
 

    OpenGL光照模型的概念由一下三部分组成:

    一、全局泛光强度;

    二、视点位置在景物附近还是在无穷远处;

    三、物体的正面和背面是否分别进行光照计算。

 

4.1.1 全局环境光

 

正如前面基础篇中所提到的一样,每个光源都能对一个场景提供环境光。此外,还有一

个环境光,它不来自任何特定的光源,即称为全局环境光。下面用参数GL_LIGHT_MODEL_AMBIENT

来说明全局环境光的RGBA强度:

 

GLfloat lmodel_ambient[]={0.2,0.2,0.2,1.0};

glLightModelfv(GLLIGHT_MODEL_AMBIENT,lmodel_ambient);

 

   在这个例子中,lmodel_ambient所用的值为GL_LIGHT_MODEL_AMBIENT的缺省值。这些数

值产生小量的白色环境光。

 

4.1.2 近视点与无穷远视点

 

视点位置能影响镜面高光的计算,也就是说,顶点的高光强度依赖于顶点法向量,从顶

点到光源的方向和从顶点到视点的方向。实际上,调用光照函数并不能移动视点。但是可以

对光照计算作出不同的假定,这样视点似乎移动了。对于一个无穷远视点,视点到任何顶点

的方向保持固定,缺省时为无穷远视点。对于一个近视点,物体每个顶点到视点的方向是不

同的,需要逐个计算,从而整体性能降低,但效果更真实。下面一句函数代码是假定为近视

点:

 

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);

 

这个调用把视点放在视点坐标系的原点处。若要切换到无穷远视点,只需将参数GL_TRUE

改为GL_FALSE即可。

 

 

4.1.3 双面光照

 

光照计算通常是对所有多边形进行的,无论其是正面或反面。一般情况下,设置光照条

件时总是正面多边形,因此不能对背面多边形进行正确地光照。在基础篇的第七章中的例子

里,物体是一个球,只有正面多边形能看到,即球的外部可见,这种情况下不必考虑背面光

照。若球被砍开,其内部的曲面是可见的,那么对内部多边形需进行光照计算,这时应该调

用如下函数:

 

glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_TRUE);

 

启动双面光照。实际上,这就是OpenGL给背面多边形定义一个相反的法向量(相对于正

面多边形而言)。一般来说,这意味着可见正面多边形和可见反面多边形的法向量都面朝观察

者,而不是向里,这样所有多边形都能进行正确的光照。

    关闭双面光照,只需将参数GL_TRUE改为GL_FALSE即可
4.2 光源位置与衰减
在基础篇中已经提到过,光源有无穷远光源和近光源两种形式。无穷远光源又称作定向

光源,即这种光到达物体时是平行光,例如现实生活中的太阳光。近光源又称作定位光源,

光源在场景中的位置影响场景的光照效果,尤其影响光到达物体的方向。台灯是定位光源的

范例。

    在以前所有与光照有关的例子里都采用的是定向光源,如:

 

GLfloat light_position[]={1.0,1.0,1.0,0.0};

glLightfv(GL_LIGHT0,GL_POSITION,light_position);

 

光源位置坐标采用的齐次坐标(x,y,z,w),这里的w为0,所以相应的光源是定向光,

(x,y,z)描述光源的方向,这个方向也要进行模型变换。GL_POSITION的缺省值是(0.0,0.0,

1.0,0.0),它定义了一个方向指向Z负轴的平行光源。

若w非零,光源为定位光源。(x,y,z,w)指定光源在齐次坐标系下的具体位置,这个位置

经过模型变换等在视点坐标系下保存下来。

 

真实的光,离光源越远则光强越小。因为定向光源是无穷远光源,因此距离的变换对光

强的影响几乎没有,所以定向光没有衰减,而定位光有衰减。OpenGL的光衰减是通过光源的

发光量乘以衰减因子计算出来的。其中衰减因子在基础篇第七章表2-7-1中说明过。缺省状

态下,常数衰减因子是1.0,其余两个因子都是0.0。用户也可以自己定义这些值,如:

 

 

glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);

glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);

glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5);

 

   注意,环境光、漫反射光和镜面光的强度都衰减,只有辐射光和全局环境光的强度不衰减。
喜欢0 评分0
夜落了,风静了,我喜欢一本书,一杯茶,一粒摇曳的烛光...
游客

返回顶部