计算机图形学五:局部光照模型(Blinn-Phong 反射模型)


到了这一部分,我们就开始进入到着色(shading)的环节了,简单来说shading就是计算出每个采样点的颜色是多少,特别来说,本文所介绍的是从经验总结而来的局部光照模型,并不是真正准确的模型,但是优点是计算快,效果可以接受,至今依然广泛的运用在各种游戏之中。本文会从最基础的泛光模型,Lambert漫反射模型,Phong反射模型,Blinn-Phong反射模型一步步推进详细详解我们如何得到一个局部光照模型。

1 我们为何能够看到物体?

在进入具体模型讲解之时,我们以该章标题的问题作为一个开始,其实问题的答案我想大家都知道,之所以物体能被我们观察,是因为人眼接收到了从物体来的光。 没错,这其实也就是局部光照模型的基础,可以具体看看究竟有几种类型光线能从物体到人眼呢?
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
如上图,可以先将光线简单的分为3类:

1. 镜面反射
2. 漫反射
3. 环境光

好,明白以上分类之后我们便进行具体模型的讲解!

(Note:本文中光强,光的亮度,光的能量皆指同一个概念,目前阶段暂不做区分,另外所有方向向量都为单位向量

2 泛光模型

第一个, 泛光模型即只考虑环境光,这是最简单的经验模型,只会去考虑环境光的影响,并且不会去精确的描述,而只是用一个简单的式子表示
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
其中KaK_a代表物体表面对环境光的反射率,IaI_a代表入射环境光的亮度,IenvI_{env}存储结果,即人眼所能看到从物体表面反射的环境光的亮度。效果如下:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
没错,泛光模型只能让我们看到一个物体的平面形状,怎么能够有体积感呢,这就要添加漫反射了,即Lambert漫反射模型。

(tips:其中反射率还是光的亮度都是一个3维的RGB向量,为什么一个物体能够有颜色,其实就是它吸收了一定颜色的光,将剩下的光反射出来,也就有了颜色)

3 Lambert漫反射模型

所谓Lambert漫反射模型其实就是在泛光模型的基础之上增加了漫反射项。漫反射便是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等,而产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
这种漫反射我们该去怎么模拟呢?首先应该考虑入射的角度所造成的接收到光强的损失,如下图所示:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
只有当入射光线与平面垂直的时候才能完整的接受所有光的能量,而入射角度越倾斜损失的能量越大,具体来说,我们应该将光强乘上一个cosθ=lncos\theta = l \cdot n,其中ll是入射光方向,nn为平面法线方向。

好了!除了入射角度之外,光源与照射点的距离也应该考虑,直观来说,离得越远当然强度也就越弱!具体来说如图所示:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
图中中心为一个点光源,光线均匀的向周围发射,可以想象光源发射出来的能量其实是一定的,那么在任意两个圈上接受到的能量之和一定相等。而离圆心越远,圆的面积越大,单位面积所接受能量也就越弱,因此会将光强 II 除上一个 r2r^2

OK,如此我们便可以较为正确的去模拟漫反射了!如下式:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
其中kdk_d为漫反射系数,II入射光强,n,ln,l分别如图中所示为法线向量和入射方向,max是为了剔除夹角大于90°的光。
注意漫反射光线强度是与出射方向无关的,因此无论人眼在哪观察接收到的强度都是一样的!
将环境光与漫反射一起考虑之后:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
因为漫反射的存在我们已经能够很明显的看出茶壶的体积感了,但依然感觉不是很真实,因为缺少了高光!即镜面反射,下一节将介绍在Lambert模型之内再加入镜面反射,从而得到Phong模型!

(tips:通过改变漫反射模型的3维反射系数kdk_d,我们就能够得到物体表面不同的颜色)

3 Phong反射模型

相信所有读者都对镜面反射十分了解,这是我们从小学就知道的物理知识了!如图所示RR为镜面反射方向,vv为人眼观察方向。
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
除了考虑漫反射中提到的光源到反射点的距离rr之外,需要注意的是,观察方向在镜面反射时是很重要的,具体来说,只有当观察方向集中在反射方向周围很近的时候才能看见反射光,因此在镜面反射中会考虑 RRvv 的夹角 α\alpha。如下式:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
其中ksk_s为镜面反射系数,II为入射光强,rr为光源到入射点距离,注意这里在max剔除大于90°的光之后,我们还乘了一个指数p,添加该项的原因很直接,因为离反射光越远就越不应该看见反射光,需要一个指数p加速衰减
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
最后我们把环境光,漫反射光,镜面反射光全部累加得到Phong模型效果:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
可以看出,此时模型其实已经非常接近真实效果了!那么Blinn-Phong反射模型是什么呢?它只是对phong模型计算反射方向与人眼观察方向角度的一个优化!

4 Blinn-Phong反射模型

如上文所提,我们将反射方向与人眼观察方向夹角替换成如下图所示的一个半程向量和法线向量的夹角
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)
这样的得到的结果其实是与真实计算反射与人眼观察夹角的结果是非常近似的,但好处在于大大加速了角度计算的速度,提升了效率!

读者可以自己试试计算半程向量与反射向量谁快(加法次数,乘法次数比较)
(tips:反射向量可由入射方向在法线方向投影的两倍减去入射方向得出)

整体计算公式:
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)

5 Reference

[1] Fundamentals of Computer Graphics 4th
[2] GAMES101-现代计算机图形学入门-闫令琪
[3] 电子科技大学计算机图形学PPT