一、 OpenGL的光照模型
OpenGL的光照模型模拟了现实生活中的光照。它根据顶点的法向量和光源的位置,决定顶点的明暗程度;根据顶点的材质和光源的颜色,决定顶点的颜色。
光照计算时,OpenGL采用的是简单光照模型,只考虑环境光和光源直接入射光,不考虑物体间的反射光和透射光。且不考虑物体间的相互遮挡,因此没有阴影。
1. 环境光
环境光是指光源间接对物体的影响,是在物体和环境之间多次反射,最终达到平衡时的一种光。我们近似地认为同一环境下的环境光,其光强分布是均匀的,它在任何一个方向上的分布都相同。例如,透过厚厚云层的阳光就可以称为环境光。在简单光照模型中,我们用一个常数来模拟环境光:
I
e=
I
a·K
a
其中:
Ia为环境光的光强,Ka为物体对环境光的反射系数。
2.全局环境光
(场景环境光)
全局环境光不依赖于任何特定光源。
全局环境光概念的提出使得即使场景中没有任何光源,观察者也可以看到物体。
3.
漫射光(Lambert模型)
漫反射由表面的粗糙不平引起,它均匀地向各方向传播,与视点无关。记入射光强为Ip,物体表面上点P的法向为N,从点P指向光源的向量为L,两者间的夹角为θ,则漫反射光强为:
Id = Ip*Kd*cos(θ) θ∈(0,π/2)
其中,Kd是与物体有关的漫反射系数, 0<Kd<1 。
当L、N为单位向量时:
Id = Ip*Kd* (L·N)
4.
镜面光(Phong模型)
对于理想镜面,反射光集中在一个方向,并遵守反射定律。对一般的光滑表面,反射光集中在一个范围内,且由反射定律决定的反射方向光强最大。因此,对于同一点来说,从不同位置所观察到的镜面反射光强是不同的。镜面反射光强可表示为:
Is = Ip*Ks*cosn(α), α∈(0,π/2)
其中Ks是与物体有关的镜面反射系数,α为视线方向V与反射方向R的夹角,n为反射指数,反映了物体表面的光泽程度,一般为1~2000,数目越大物体表面越光滑。镜面反射光会在反射方向附近形成很亮的光斑,称为高光现象。
同样,将V和R都格式化为单位向量,镜面反射光强可表示为:
Is = Ip*Ks*(R· V ) n
镜面反射光产生的高光区域只反映光源的颜色,镜面反射系数Ks是一个与物体的颜色无关的参数(与光洁程度有关)。综合前面已经提到的,在简单光照模型中,我们只能通过改变物体的漫反射系数来控制物体的颜色。
5.OpenGL
中的顶点颜色计算公式
未完待续......