webGL常见光照模型
前言
当光照射到物体表面时,物体对光会发生反射、透射、吸收、衍射、折射、和干涉,其中被物体吸收的部分转化为热,反射、透射的光进入人的视觉系统,使我们能看见物体。为模拟这一现象,我们建立一些数学模型来替代复杂的物理模型,这些模型就称为明暗效应模型或者光照明模型。[1]
简言之,光照模型就是用来模拟真实世界中物体受到光线照射时的表现的计算模型;
冯氏光照模型(Phong reflection model)
冯氏光照模型由环境光、漫反射光及镜面反射光这三类光线组成;
- 环境光(
Ambient Light
):用于模拟物体周围环境固有存在的光线;通常是阳光,月光这类光线对物体造成漫反射光,在物体间不停地反射,达到某种程度恒定的光线; - 漫反射光(
Diffuse Light
):用于模拟光线照射到粗糙表面形成的反射光; - 镜面反射光(
Specular Light
):用于模拟光线照射到光滑表面形成的亮点(即高光);
环境光的计算
由于环境光模拟的是一类固定的光线,因此常使用环境光因子
来计算;
注意:环境光因子的值在[0, 1]
之间!
漫反射的计算
漫反射的计算需要借助物体表面的法向量,通过光线的入射方向(L
)及法向量(N
)的点乘可以得到漫反射因子
,然后根据漫反射因子来得到漫反射光;
注意:当光线方向与法向量之间夹角大于90°
时,点乘值必然小于0
(此时相当于光线没有照射到该点);
镜面反射光的计算
同理,镜面反射光也需要先计算出一个镜面反射因子
;镜面反射因子是由人眼观察方向(V
)和光线反射方向(R
)之间的点乘得到;
除此之外,可以通过一个反光度(Shininess
)的变量来控制高光区域的大小,反光度越大,则高光区域越小;
注意:反光度的值一般为2
的n
次方,如:32, 64, 128, ...
;
因此,环境光 + 漫反射光 + 镜面反射光
即等于物体的反射光,最后将反射光乘以物体颜色即可得到物体最终进入人眼中的颜色值了(逐分量相乘);
这里有一个关于Phong
光照模型的Demo
:14. Phong specular reflect
Blinn–Phong 光照模型
Blinn–Phong
光照模型实际上是对于冯氏光照模型的一种改进,主要区别就在于镜面反射因子的计算;
改进后的镜面反射因子
在Blinn–Phong
光照模型中,镜面反射因子是由光源方向(L
)和观察方向(V
)的半程向量(H
)与法向量(N
)之间的点积构成的;
同样地,这里有一个关于Blinn–Phong
光照模型的Demo
:15. Blinn-Phong specular reflect