现在的位置: 首页 > 综合 > 正文

OpenGL光照 学习笔记(转)

2013年09月02日 ⁄ 综合 ⁄ 共 1674字 ⁄ 字号 评论关闭

我的毕业设计要用到OpenGL,时间不多了,估计学习的时间也就一两个月吧。没办法,只好硬着头皮学了,不知道这一两个月能学多少。

  光照

光照是非常重要的一部分,对光照的设置分为三个部分:

1,创建光源

光源有几个特征参数,如颜色、位置和方向。用于指定光源属性参数的函数是glLight*(),它有三个参数,分别标识需要指定属性的光源、光源属性和属性值。

              void glLight{if}[v](GLenum light,GLenum pname,TYPE param);

创建由light指定的光源,它可以是GL_LIGHT0,GL_LIGHT1,。。。。或GL_LIGHT7。光源的属性由pname定义,常用的参数有GL_AMBIENT(设置光源的环境光亮度),GL_DIFFUSE(散射光亮度),GL_SPECULAR(镜面反射光亮度)和GL_POSITION,param参数为pname指定了光源的属性值。例如为光源LIGHT0指定环境光为(0.0,0.0,0.0,1.0),则语句为:glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); 其中light_ambient为值为上述四值的数组。

2,选择光照模型

每一个光源都将给场景带来一定的环境光。另外,还可能存在与任何光源都无关的环境光。这就要设置全局的环境光,函数是: glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); lmodel_ambient为全局环境光的强度值。此外还要设置视点的远近,glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); 该函数将视点设于(0,0,0)点如果要将视点重新置于无穷远,以GL_FALSE作为参量调用此函数即可。再有就是是否是双面光照,函数是glLightModeli(LIGHT_MODEL_TWO_SIDE, GL_TRUE);最后就是激活光照。glEnable(GL_LIGHTINT);用于激活光照。glEnable(GL_LIGHTx);用于激活光照LIGHTx。

3,材料属性的定义

在这里主要是定义场景中物体的材料属性;环境颜色、散射颜色、镜面反射颜色、亮度和发射光的颜色。与创建光源非常类似。所用的函数是glMaterial*().

void glMaterial{if}[v](GLenum face, GLenum pname, TYPE param);

参数face分别可以取GL_FRONT, GL_BACK或GL_FRONT_AND_BACK,表示材料属性应用于物体的哪个表面。所设置的材料属性由pname标识,属性值由param给出。

 

要真正掌握光照效果可不是件容易的事,不光要理解光照的数学计算理论,还得有长时间的编程实践和试验。唉,看来是路漫漫兮其修远。我只好慢慢求索了。

若光源未被激活,则顶点的颜色就是当前颜色;如果激活了光源,则为计算了光照后的颜色。

照亮一个顶点产生的颜色按下式计算:

顶点颜色=该顶点发射光的颜色+由材质环境光属性放大的全局环境光颜色+从各个光源发出,经过衰减的环境光、散射光和镜面反射不颜色

光照计算完成以后,颜色值(RGBA模式下)将被截取在区间[0 , 1]之内。

1,材质的发射光

材质的发射光最简单。它就是分配给GL_EMMISION参数的RGB值。

2,放大的全局环境光

这是由全局环境光(由参数GL_LIGHT_MODEL_AMBIENT进行定义)与材质的环境光属性相乘得到。

3,光源的贡献

每个光源对顶点颜色均有贡献,这些贡献是叠加在一起的。计算每个光源的贡献可以按照下面的方程:

整个光源的效果=衰减系数*聚光灯效果*(环境光项+散射光项+镜面反射光项)

4,聚光灯效果

如果光源不是聚光灯,则取值为1。

5,环境光项

环境光项就是光线中的环境光颜色和材质的环境光属性简单相乘的结果。

6,散射光项

散射光项需要考虑光线是否照在该顶点上、入射光的散射光颜色、以及材质的散射光属性。

抱歉!评论已关闭.