Phong 光照模型(Phong Lighting Model)是计算机图形学中最经典的经验光照模型之一。由裴祥风(Bui Tuong Phong)于 1973 年提出。它并不是基于严谨的物理光学法则,而是通过观察光照现象总结出的一套算法。因为计算效率极高,至今仍是学习 3D 渲染和光栅化的核心基础。
Phong 模型将物体表面的光照效果拆分为三个独立的线性叠加部分:环境光(Ambient) 、漫反射(Diffuse) 和 镜面高光(Specular) 。
1. 环境光 (Ambient Light)
模拟光线在场景中经过多次反弹后,均匀充满整个空间的底光。它的核心作用是保证“处于阴影中的背面不会变成死黑色”。
I_a=k_a \cdot i_a
- k_a:材质的环境光反射系数。
- i_a:环境光强度。
2. 漫反射 (Diffuse Light)
模拟光线照射到粗糙表面后,向四面八方均匀散射的现象。它遵循兰伯特余弦定律(Lambert's cosine law):表面接收到的光照强度与光线方向和表面法线的夹角余弦值成正比。光线垂直照射时最亮,斜射时变暗。
I_d=k_d \cdot i_d \cdot \max(0, \mathbf{N} \cdot \mathbf{L})
- \mathbf{N}:表面点向外的法线向量。
- \mathbf{L}:表面点指向光源的光照方向向量。
- 两者的点积 \mathbf{N} \cdot \mathbf{L} 即代表夹角的余弦值(前提是向量均已归一化)。
3. 镜面高光 (Specular Light)
模拟光线照射到光滑表面(如金属或湿润的塑料)时产生的明亮反光点。只有当你的观察方向刚好处于反射光路附近时,才能看到最强的高光。
I_s=k_s \cdot i_s \cdot \max(0, \mathbf{V} \cdot \mathbf{R})^\alpha
- \mathbf{R}:光线的反射方向向量。
- \mathbf{V}:表面点指向相机的观察方向向量。
- \alpha:光泽度(Shininess/Specular exponent) 。这是调节材质质感的关键参数——\alpha 越大,高光范围越小、光斑越集中,材质显得越光滑;\alpha 越小,高光越散开。
最终光照方程
将上述三个分量相加,就得到了最终像素表现出的光照强度(颜色):
I=I_a + I_d + I_s
Phong局限性:Phong 模型虽然计算开销小,但它是一种纯粹的“Hack”。它最致命的弱点是能量不守恒(出射的总光能可能会大于入射的光能),且在处理非常粗糙或金属材质时表现不佳。这也正是现代工业界和游戏引擎后来纷纷转向 PBR(基于物理的渲染) 体系的核心原因。
Blinn-Phong 光照模型模型
在原始 Phong 模型中,当光源在物体后方,或者观察角度非常平缓(掠射角)时,\mathbf{V} 和 \mathbf{R} 的夹角很容易超过 90 度。一旦超过 90 度,\mathbf{V} \cdot \mathbf{R} 就会变成负数,被 \max(0, ...) 函数直接截断为 0。 这导致在物体的边缘轮廓处,高光会突然消失,出现非常生硬、不自然的黑色断层线
(如上图左侧所示)这就是 Phong 模型会出现高光截断的问题
为什么 Phong 会发生“截断”?
在原始的 Phong 模型中,镜面反射的强度取决于视线向量 \mathbf{V} 和反射向量 \mathbf{R} 的夹角 \theta。
I_s \propto \max(0, \mathbf{V} \cdot \mathbf{R})^\alpha
- 低光泽度材质(\alpha 较小) :这意味着高光斑应该非常大、非常散,甚至蔓延到物体的边缘。
- 极限角度的冲突:当光源位于物体正前方,而你从几乎贴着表面的侧面观察时(掠射角),视线 \mathbf{V} 会和表面的夹角极小。此时,反射向量 \mathbf{R} 和 \mathbf{V} 的夹角 \theta 非常容易超过 90 度。
- 数学崩溃:一旦 \theta > 90^\circ,\mathbf{V} \cdot \mathbf{R} 就变成负数。由于 \max(0, ...) 函数的存在,这个值会瞬间“撞墙”变为 0。原本应该平滑衰减的宽广高光,在这里被一刀切断,形成一条生硬的黑线。
Blinn-Phong 是如何完美绕过这个陷阱的?
Blinn-Phong 放弃了 \mathbf{V} 和 \mathbf{R},转而使用法线 \mathbf{N} 和半程向量 \mathbf{H} (\mathbf{L} 和 \mathbf{V} 的角平分线)。
I_s \propto \max(0, \mathbf{N} \cdot \mathbf{H})^\beta
这个替换在几何上极其巧妙:
- 只要光源 \mathbf{L} 在表面之上(即光能照到这面),且相机 \mathbf{V} 也在表面之上(即你能看到这面),那么 \mathbf{L} 和 \mathbf{V} 都在法线半球内。
- 既然 \mathbf{L} 和 \mathbf{V} 都在表面上方,它们的角平分线 \mathbf{H} 必定也指向表面上方。
- 因此,半程向量 \mathbf{H} 与法线 \mathbf{N} 的夹角,永远不可能超过 90 度。
在 Blinn-Phong 模型中,\mathbf{N} \cdot \mathbf{H} 永远不会因为角度过大而猝不及防地变成负数。它会随着角度的增大,非常平滑地、连贯地向 0 衰减。这就彻底消除了大范围高光在边缘被强行切断的问题,让低光泽度材质的高光表现自然得多。