一、Phong模型數學原理
1.1 光照疊加公式
L = k a I a + k d I d max ? ( 0 , n ? l ) + k s I s max ? ( 0 , r ? v ) α L = k_a I_a + k_d I_d \max(0, \mathbf{n} \cdot \mathbf{l}) + k_s I_s \max(0, \mathbf{r} \cdot \mathbf{v})^\alpha L=ka?Ia?+kd?Id?max(0,n?l)+ks?Is?max(0,r?v)α
- ?符號說明:
- k a , k d , k s k_a, k_d, k_s ka?,kd?,ks?:材質的環境/漫反射/高光系數(標量)
- I a , I d , I s I_a, I_d, I_s Ia?,Id?,Is?:光源的環境/漫反射/高光強度(三通道向量或標量)
- n \mathbf{n} n:表面單位法線向量
- l \mathbf{l} l:單位光照方向向量(從表面指向光源)
- v \mathbf{v} v:單位視線方向向量(從表面指向觀察點)
- r \mathbf{r} r:反射方向單位向量
- α \alpha α:高光銳度系數(值越大高光越集中)
1.2 核心分量數學推導
1.2.1 環境光(Ambient)
L a = k a ? I a L_a = k_a \cdot I_a La?=ka??Ia?
- ?特性:均勻照亮場景,與幾何關系和光源方向無關
- ?缺陷:易導致畫面“過平”,需結合其他分量使用
1.2.2 漫反射(Lambert’s Cosine Law)
L d = k d ? I d ? max ? ( 0 , n ? l ) L_d = k_d \cdot I_d \cdot \max(0, \mathbf{n} \cdot \mathbf{l}) Ld?=kd??Id??max(0,n?l)
- ?幾何解釋:
- n ? l = cos ? θ \mathbf{n} \cdot \mathbf{l} = \cos\theta n?l=cosθ,其中 θ \theta θ 為入射角
- max ? ( 0 , ? ) \max(0, \cdot) max(0,?) 確保背面無光照貢獻
- ?能量守恒:入射角越大,單位面積接收的光能越少
1.2.3 高光反射(Phong Specular)
L s = k s ? I s ? max ? ( 0 , v ? r ) α L_s = k_s \cdot I_s \cdot \max(0, \mathbf{v} \cdot \mathbf{r})^\alpha Ls?=ks??Is??max(0,v?r)α
- ?反射向量計算:
r = 2 ( n ? l ) n ? l \mathbf{r} = 2(\mathbf{n} \cdot \mathbf{l})\mathbf{n} - \mathbf{l} r=2(n?l)n?l - ?Blinn-Phong優化:
- 半角向量 h = l + v ∥ l + v ∥ \mathbf{h} = \frac{\mathbf{l} + \mathbf{v}}{\|\mathbf{l} + \mathbf{v}\|} h=∥l+v∥l+v?
- 高光項改寫為 ( n ? h ) α (\mathbf{n} \cdot \mathbf{h})^\alpha (n?h)α,計算效率更高
1.3 坐標系變換與關鍵推導
1.3.1 反射向量 r \mathbf{r} r 的嚴格推導
設入射方向 l \mathbf{l} l 為指向表面的單位向量,法線 n \mathbf{n} n 為單位向量:
- 將 l \mathbf{l} l 分解為法線分量和切平面分量:
l = ( n ? l ) n + l ⊥ \mathbf{l} = (\mathbf{n} \cdot \mathbf{l})\mathbf{n} + \mathbf{l}_{\perp} l=(n?l)n+l⊥? - 反射方向 r \mathbf{r} r 的法線分量反向,切平面分量不變:
r = ? ( n ? l ) n + l ⊥ = l ? 2 ( n ? l ) n \mathbf{r} = -(\mathbf{n} \cdot \mathbf{l})\mathbf{n} + \mathbf{l}_{\perp} = \mathbf{l} - 2(\mathbf{n} \cdot \mathbf{l})\mathbf{n} r=?(n?l)n+l⊥?=l?2(n?l)n
1.3.2 法線矩陣 N = ( M ? 1 ) T \mathbf{N} = (\mathbf{M}^{-1})^T N=(M?1)T 的證明
設模型變換矩陣為 M \mathbf{M} M,切線向量 t \mathbf{t} t 變換后為 M t \mathbf{M}\mathbf{t} Mt,法線 n \mathbf{n} n 變換后為 N n \mathbf{N}\mathbf{n} Nn。需滿足:
( N n ) ? ( M t ) = 0 (\mathbf{N}\mathbf{n}) \cdot (\mathbf{M}\mathbf{t}) = 0 (Nn)?(Mt)=0
展開得:
n T N T M t = 0 \mathbf{n}^T \mathbf{N}^T \mathbf{M} \mathbf{t} = 0 nTNTMt=0
因原始法線與切線正交( n T t = 0 \mathbf{n}^T \mathbf{t} = 0 nTt=0),需有:
N T M = I ?? ? ?? N = ( M ? 1 ) T \mathbf{N}^T \mathbf{M} = \mathbf{I} \implies \mathbf{N} = (\mathbf{M}^{-1})^T NTM=I?N=(M?1)T
1.3.3 視線方向 v \mathbf{v} v 的計算
在視圖坐標系中,設表面點坐標為 p \mathbf{p} p,則:
v = ? p ∥ p ∥ \mathbf{v} = -\frac{\mathbf{p}}{\|\mathbf{p}\|} v=?∥p∥p?