Shading
Shading 的定义
Shading 中文译为着色,可以为某个物体的,某一个区域进行上色以及对其明暗程度的操控。
我们看到不同的物体可以呈现出不同的材质以及明暗程度,正是因为 Shading,使物体表面每一个像素点都能够呈现出不同的颜色。
Shading 理解成为一个物体应用上某种材质。
Blinn-Phong 反射光模型
该模型能够简单地描述物体表面对光的吸收和反射,使物体表面呈现出不同的明暗程度,但其不是最真实的一种反射光模型。
引入该模型的原因:它能够用尽量简单的数学原理尽可能解释物体表面呈现出不同颜色及明暗程序的原因。
在现实世界中有三种光照类型:
- 「高光」:物体完全反射光源照射到表面的光照到人眼
- 「漫反射光」:物体朝着任意方向反射相同亮度的光照到人眼
- 「环境光」:物体表面完全背对光源,但其它物体反射光照照射到该物体表面上,再通过该物体反射光照到人眼
同样,在图形学中也需要讨论这三种光照,Bling-Phong 模型可以近似地模拟漫反射光照,但不完全准确。
我们聚焦在物体局部上的某一个点,Shading 是对物体上的每一个点进行着色。
在计算机中的计算目标是:从物体表面的每一个点通过反射光到摄像机呈现的颜色值。
我们能看到上面有三个向量:
- Light Direction:向量 l 代表光源的直射方向
- Surface Normal:向量 n 代表物体表面的法线方向
- View Direction:向量 v 代表视线方向
漫反射光
漫反射光是物体表面向四面八方反射相同强度的能量,所以:无论从哪个视角看同一个点,都应该呈现出相同的颜色。
我们首先两种考虑特殊情况:法线方向与光照方向平行或垂直
注意下图黑色边框表示物体表面。
上图左边是平行关系,此时表面着色点可以接收到所有的漫反射光进行反射,而右图相反,物体表面完全与光线没有任何接触,此时漫反射光的能量为 0
考虑到一般情况,涉及到一个定理:Lambert’s cosine law(朗伯特余弦定律)
该定律表明:物体表面接收到光的能量与法线方向、光照方向两者夹角的余弦值成正比关系。
此时我们已经知道物体的每一个着色点能够接收多少的光能量了: c o s θ = l ⋅ n cosθ = l · n cosθ=l⋅n。
值得注意的地方是由于 l 和 n 都只表示方向,所以采用单位向量,所以它们的长度都为 1,即: ∣ l ∣ = ∣ n ∣ = 1 |l| = |n| = 1 ∣l∣=∣n∣=1,所以上面的式子才成立。
接下来我们需要知道:从光源到物体表面发射的能量光是多少?
忽略其它能量损失,假设有一个点光源,发射出来的能量光在单位球上的能量表示为 I,同一个点上的能量随着光不断向外传播而逐渐减少, 根据能量守恒定律,每一个球面上的总能量都是相同的。
光在传播了半径为 r 的球表面上,此时该表面上的光强度 I ′ I' I′是多少?
由于存在能量守恒定律,且假定各点上的光能量强度是相同的,所以可以得到一个比例关系:
1 2 4 Π I = r 2 4 Π I ′ = > I ′ = I r 2 1^24ΠI = r^24ΠI' => I' = \frac{I}{r^2} 124ΠI=r24ΠI′=>I′=r2I
所以,我们可以得到无论在任何远的地方,只要有点光源的单位强度 I I I和传播距离 r r r,即可计算出发射在物体表面的光强度。
最后还需要计算:物体表面着色点反射多少能量光给摄像机接收?
每一个着色点都有不同的光吸收率,这与该着色点的颜色相关,这里举一个例子会很好理解:
我们平时在生活中穿黑色衣服,被太阳光照射时还是黑色,但是当我们穿着白色衣服的时候,如果太阳光是黄色的,那么衣服上也会反射出黄色的光,被人眼接收,看到黄色的衣服。
对应着在计算机里面也是一样的,用一个系数 K d K_d Kd表示该着色点的光吸收率,范围是 [ 0 , 1 ] [0, 1] [0,1],如果该系数是 0,证明该着色点完全吸收能量,反之,如果是 1,代表该点完全不吸收能量。
再抽象一些,我们可以把这个系数看作是:「RGB颜色值」
当
K
d
=
0
K_d = 0
Kd=0时,此时对应着RGB值是:[0, 0, 0],在计算机里表示为黑色,黑色正是完全吸收光的颜色,反之,当
K
d
=
1
K_d = 1
Kd=1时,对应着 [255, 255, 255],在计算机里表示为白色,白色正是完全反射光的颜色。
上图可以看到,点光源在左上角处,随着
K
d
K_d
Kd越来越大,左上角的物体表面反射光能量越来越多,而右下角处于背光处,所以完全没有光,越往中间部分,法线方向与光照方向的夹角越来越大,所以接收的光能量越来越少,符合 Blinn-Phong 模型。
高光
高光的产生:在物体表面的观察角度与光源角度正好是镜面对称时,即可看到高光
抽象到计算机图形学中,我们定义向量 R R R是镜面反射方向,当观察方向 V V V与 R R R越接近时,高光部分越明显。
我们可以通过计算 R R R和 V V V的接近程度来确定看到的高光强度,但是:在计算机中计算反射向量 R R R的计算量非常大。
所以,Blinn-Phong光照模型提出使用另一种计算方法:「半程向量」
通过上图可以发现,物体表面一点的法线方向正好是光源方向 l l l和镜面反射方向 R R R的角平分向量。
同样,我们知道视角 V V V和光源 l l l,可以很容易的计算出它们的角平分向量 h h h,而该向量就称为半程向量。
通过比对法向量 n n n和半程向量 h h h的接近程度,用角度 α α α表示:
c o s α = n ⋅ h ∣ n ∣ ∣ h ∣ = n ⋅ h cosα = \frac{n·h}{|n||h|} = n·h cosα=∣n∣∣h∣n⋅h=n⋅h
由于 c o s α ∈ [ 0 , 1 ] cosα∈[0, 1] cosα∈[0,1]可以表示物体表面该点反射的高光强度,所以我们可以得到计算高光的公式:
L s = K s ( I r 2 ) m a x ( 0 , c o s α ) p = K s ( I r 2 ) m a x ( 0 , n ⋅ h ) p L_s = K_s(\frac{I}{r^2})max(0, cosα)^p = K_s(\frac{I}{r^2})max(0, n·h)^p Ls=Ks(r2I)max(0,cosα)p=Ks(r2I)max(0,n⋅h)p
注意: K s K_s Ks依旧表示物体表面该点对光的吸收率,在计算机中用RGB值表示。
最后带有一个指数p,该指数用于加快函数的衰减程度,由于在物理世界中高光存在于物体表面很小的一部分,而 c o s α cosα cosα的衰减速度太慢,通过携带指数,可以促进衰减速度,使得高光只能在与法线向量 n n n非常接近的情况下才能被视角看见。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DohvZayd-1614042128430)(Shading/b6966aee-349f-43f6-8163-083b74199b64.png)]
实际上允许使用视角向量 v v v和镜面反射向量 R R R的接近程度来计算高光,但是计算量更大,而这种计算方式就称为 Phong 模型。
环境光
环境光是照射在其它物体上的光先反射到观察物体上,通过观察物体表面再反射至视角中。
在 Blinn-Phong 模型中,举出了一个非常大胆的假设:物体表面接收到的各种环境光都是相同强度的。
当然,这并不符合常理,但是可以大大简化了计算环境光的步骤,强度相同,意味着反射光的强度也相同,而由于环境光来自四面八方的物体反射,所以该物体表面反射环境光的方向也是四面八方的,那么:环境光与光源的角度无关,与观察角度也无关,所以它是一个常数。
计算环境光的公式非常简单,只需要得到物体表面的环境光吸收率和环境光的强度即可:
L a = K a I a L_a = K_a I_a La=KaIa
三种光的叠加效果
最后,将漫反射光、高光和环境光作用在物体表面上的效果叠加在一起,就可以得到近似于物理光照的效果。
L = L a + L d + L s L = L_a + L_d + L_s L=La+Ld+Ls
我们可以拆分来看:
- 第一幅图:由于环境光是常数,所以作用在物体的每一个点上都有相同的光强度效果。
- 第二幅图:漫反射光与观察视角相关,所以观察视角与物体表面顶点法线越接近,光强度越大。
- 第三幅图:高光和观察的视角密切相关,只有半程向量与顶点法线偏差非常小时,才能看到高光效果。
总结
Blinn-Phong 模型是一种理想化的光照模型,忽略各种能量损失,模拟物体表面着色点对光的三种反射叠加效果,它奠定了后面其它所有光照着色模型的基础。
参考资料
B站:彦令琪老师《Games101-现代计算机图形学入门》