webGL常见光照模型

前言

当光照射到物体表面时,物体对光会发生反射、透射、吸收、衍射、折射、和干涉,其中被物体吸收的部分转化为热,反射、透射的光进入人的视觉系统,使我们能看见物体。为模拟这一现象,我们建立一些数学模型来替代复杂的物理模型,这些模型就称为明暗效应模型或者光照明模型。[1]

简言之,光照模型就是用来模拟真实世界中物体受到光线照射时的表现的计算模型;

冯氏光照模型(Phong reflection model)

冯氏光照模型由环境光漫反射光镜面反射光这三类光线组成;

  • 环境光(Ambient Light):用于模拟物体周围环境固有存在的光线;通常是阳光,月光这类光线对物体造成漫反射光,在物体间不停地反射,达到某种程度恒定的光线;
  • 漫反射光(Diffuse Light):用于模拟光线照射到粗糙表面形成的反射光;
  • 镜面反射光(Specular Light):用于模拟光线照射到光滑表面形成的亮点(即高光);

img

环境光的计算

由于环境光模拟的是一类固定的光线,因此常使用环境光因子来计算;

L=LKL_{环境} = L_{光源} * K_{环境}

注意:环境光因子的值在[0, 1]之间!

漫反射的计算

漫反射的计算需要借助物体表面的法向量,通过光线的入射方向(L)及法向量(N)的点乘可以得到漫反射因子,然后根据漫反射因子来得到漫反射光;

K=max(DN, 0.0)L=LKK_{漫反射} = max(D_{光源} \cdot N,\ 0.0)\\ L_{漫反射} = L_{光源} * K_{漫反射}

注意:当光线方向与法向量之间夹角大于90°时,点乘值必然小于0(此时相当于光线没有照射到该点);

镜面反射光的计算

同理,镜面反射光也需要先计算出一个镜面反射因子;镜面反射因子是由人眼观察方向(V)和光线反射方向(R)之间的点乘得到;

K=max(VR, 0.0)L=LKK_{镜面反射} = max(V \cdot R,\ 0.0)\\ L_{镜面反射} = L_{光源} * K_{镜面反射}

除此之外,可以通过一个反光度(Shininess)的变量来控制高光区域的大小,反光度越大,则高光区域越小

K=max((VR)shininess, 0.0)K_{镜面反射} = max((V \cdot R)^{shininess},\ 0.0)

注意:反光度的值一般为2n次方,如:32, 64, 128, ...

因此,环境光 + 漫反射光 + 镜面反射光即等于物体的反射光,最后将反射光乘以物体颜色即可得到物体最终进入人眼中的颜色值了(逐分量相乘);

L=L+L+LColor=ColorLL_{反射} = L_{环境} + L_{漫反射} + L_{镜面反射}\\ Color_{反射} = Color_{物体} * L_{反射}

这里有一个关于Phong光照模型的Demo14. Phong specular reflect

Blinn–Phong 光照模型

Blinn–Phong光照模型实际上是对于冯氏光照模型的一种改进,主要区别就在于镜面反射因子的计算;

改进后的镜面反射因子

Blinn–Phong光照模型中,镜面反射因子是由光源方向(L)和观察方向(V)的半程向量H)与法向量(N)之间的点积构成的;

K=max((HN)shininess, 0.0)K_{镜面反射} = max((H \cdot N)^{shininess},\ 0.0)

同样地,这里有一个关于Blinn–Phong光照模型的Demo15. Blinn-Phong specular reflect

参考链接


  1. 什么是光照模型 - 知乎 ↩︎