光照效果
仅仅使用环境光和漫反射光的光照效果,喷气式飞机表面的颜色看起来比较平淡。在渲染木材,泥土,布料,纸箱上等这些表面粗糙的物体上,使用环境光和漫反射光的光照效果就基本足够了。但是在为光滑的金属物体建模时,为了使其显得更加逼真,仅仅使用环境光和漫反射光是不够的,还需要镜面光的效果。
镜面光照和材料属性可以为物体表面添加光泽和亮斑的效果。当入射光与观察者的角度较小时,可以看到镜面加亮的效果。镜面亮点就是几乎所有的光照射在物体表面上并被反射开来。添加镜面光的成分:
specular[]为镜面光成分指定了一个非常亮的白光。模拟太阳当空照的效果
。下面的语句就是指定镜面光的成分。
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
仅仅添加镜面光的效果,我们不会再喷气式飞机上看到什么变换。我们还需要为其指定材料的镜面光反射属性。
给材料添加镜面反射属性的代码段如下:
在上面的例子中在强烈的镜面光照射和材料镜面反射(完全发射)的效果下导致飞机显示为纯白,只有远离光源的表面除外(未受到光照,显示黑色)。
glMateriali(GL_FRONT, GL_SHININESS, 128);
GL_SHININESS属性设置材料的镜面指数,指定了镜面加亮的大小和集中性。如果指定为0,即没有聚焦,即整个多边形均匀加亮。通过设置这个值可以缩小镜面加亮的范围,增加镜面加亮的集中度,制造亮点的效果。这个值越小,表示材质越粗糙,点光源发射的光线照射到上面,产生较大的亮点。这个值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。这个参数值的范围为1-128。
设置为128的效果如下:

设置为0时效果如下:(被照射到的多边形整个都加亮了,没被照射到的显示黑色)


由四边形和三角形组成的球体,如果为其的每一个表面都单独指定了法线,那这个球体看起来就是充满棱角。如果我们为每个顶点指定“真实的”法线,那么OpenGL光照计算的所产生的值将会平滑地分布在多边形表面上。这些平面的多边形经过着色之后就像平滑的表面一样。
在理论上,如果我们使用足够多的多边形来绘制球体,那球体表面就会显得平滑,这些多边形就近似于真实的表面。就像使用足够多的小短线来模拟平滑的曲线一样。如果把每个顶点都当成真实的表面上的顶点的话,那么这个表面的实际法线值就代表着真实表面的法线。在球体中,法线从球体的中心指向各个顶点。
下图图5.30中的,每一个平面片段都有法线垂直指向它的表面。就像在喷气式飞机中的例子一样。在图5.31中法线并不正交于多边形的平面,而是正交于真实球体的表面,或者球体表面的切线。

在球体中,计算真实法线较为简单,球体中心和多边形顶点的连线即是。但在一些复杂的物体中,就没那么简单了。需要取得共享一个顶点的多边形的法线,对其进行平均,来获得更加真实的效果。
在这个例子中,我们使用一个黄色的小灯泡的方式来模拟光源的位置,通过方向键可以调整其位置。并通过右键菜单来调整,物体的着色模式,和球体的近似程度(由多少多边形组成球体)。

GL_FLAT着色模式

GL_SMOOTH着色模式

完整代码示例:
?