S03E08:Blinn-Phong光照模型中的半途向量(半角向量)

1,971 阅读3分钟

说明

前面我们已经讲过了光线反射和折射的计算,在此基础上,只要稍加改动,就可以得到 Phong 光照模型。那么 Blinn-Phong 做为 Phong 模型的优化版,引入了一个 half-vector(半途向量,或半角向量),到底又有什么作用?

几何

Phong 模型

我们先来说说 Phong 模型。有求得反射向量的基础上,我们再引入“眼睛”或者说“相机”的位置,如下图:点 E、F、G 就是眼睛可能的位置。当反射光线进入眼睛,物体就被看到了;反射光线进入眼睛越多,就显得越亮;眼睛在反射光线的背面,则看到是黑的物体。

考虑到真实世界的物体不可能百分百反射光线,所以 Phong 模型前面添加了一个系数来代表材质对光线的反射系数;又因为真实世界物体不可能百分之百光滑,所以 Phong 模型又对进入眼睛的光线进行了指数处理,让反射光线周围也可以更多地进入眼睛。

Phong模型数学表达式:

Ispec = KsIl(V·R)^n

注:((V·R)^n表示(V·R)的n次方即(V·R)^n 。

Ks表示材质的镜面反射系数,Il 是方向光的光源强度,n指高光指数,V表示从顶点到视点观察方向,R表示反射光方向。

总之,Phong 模型最重要的,就是计算下图中眼睛位置 BE 与反射光 BA'之间的夹角:

BlinnPhong光照模型

在Phong模型中,必须计算V·R的值,其中R为反射光线的单位向量,V为视线方向的单位向量,但是在 BlinnPhong 模型中,用N·H的值来取代V·R。BlinnPhong 光照模型公式:

Ibp = Ks * Il (N·H)^n

其中N是入射点的单位法向量,H是“光入射方向L和视点方向V的中间向量”,通常也称为半角向量或半途向量。

总之,BlinnPhong 模型最重要的,是计算下图中半角向量 BF 与法线 BC 之间的夹角:

对比

我们来做个综合对比,假设光源A和物体B都不动,只有观察者眼睛 E 在动时,且眼睛和光源一般不会进入物体内部(即不低于 B 点 y 坐标): 可以看到:

  • BE 与 BA' 的夹角变化剧烈,当 BE 与反射光 BA' 重合时夹角最小 0 度,垂直时夹角 90 度,超过 90 度之后认为反射光不会进入眼睛,表现为全黑;
  • BF 与 BC 的夹角变化比较温和,当 BE 处于与反射光 BA' 重合时夹角最小 0 度,当 BE 与入射光垂直时,夹角最大一般不会超过 90 度,一般不会全黑;

从几何和数学上可以看到,BlinnPhong 模型最大值、最小值与 Phong 模型基本一致,且变化更温和,计算过程也更简单,在 3D 中应用广泛。效果如下图,图中 Blinn 指 Blinn-Phong,Phong 指 Phong 模型: