OpenGL初探:光照

OpenGL在根据光照条件模拟显示世界方面做得相当不错。为此,它使用了一个简单和直观的光照模型,并不一定要根据物理光源或现实世界的光源。在OpenGL光照模型中,除非一个物体自己会发光,否则它将受到3种不同类型的光的照射:环境光(ambient)、散射光(diffuse)和镜面光(specular)。在现实世界中,当然不存在这样的光。但是,作为光照的抽象,这三种类型的光允许我们模拟和控制在物体表面上所产生的主要类型的效果。


1.环境光:

环境光并不来自任何特定的方向。它来自某个光源,但光线却是在房间或场景中四处反射,没有方向可言。由环境光所照射的物体在所有方向的表面是均匀照亮的。在OpenGL中,这种光照成员实际上模拟了环境中源自所有光源的散光。


2.散射光:

OpenGL的散射光具有方向性,来自于一个特定的方向,它根据入射光线的角度在表面上均匀地反射开来。因此,如果光线直接指向物体表面,它看上去就更亮一些。如果光线是从一个较大的角度照射到物体表面上,它看上去就显得暗一些。散射光的例子包括台灯、蜡烛以及正午时照在窗户一侧的日光。从本质上来说,正是光源的散射成分产生了被光照物体表面的着色(或颜色变化)。


3.镜面光:

和散射光一样,镜面光也具有很强的方向性,但它的反射角度很锐利,只沿一个特定的方向反射。高强度的镜面光(实际上是现实世界的材料属性)趋向于在它所照射的表面上形成一个亮点,称为镜面亮点。由于它的高度方向性本质,取决于观察者的位置,镜面光甚至可能看不到。聚光灯和太阳都是产生很强的镜面光的例子。


没有一种光源是纯粹由上面所述的任何一种类型的光所组成的。事实上,光源是由各种强度的不同类型的光所组成的。例如,实验室中的红色激光束几乎是由纯的红色镜面光所组成的,当它照射物体时,将会产生一个非常强的亮点。但是,烟或灰尘将会导致激光束有所发散,产生非常小的环境光成分,使房间中的其他物体染上一层微微的红色。如果光束极为耀眼地照射到一个表面上,将会产生非常小的散射成分,可以在它所照亮的表面上看到(尽管在很大程度上会被镜面亮点所掩盖)。

因此,场景中的一种光源是由3种光成分所组成的:环境光、散射光和镜面光。就像颜色的成分一样,每种光成分是用一个RGBA值定义的,它描述了组成这种成分的红光、绿光和蓝光的强度(对于光的颜色而言,alpha值被忽略)。

你可能感兴趣的:(OpenGL初探:光照)