簡單光照模型(Phong和Blinn-Phong)和明暗處理
支援點光源和平行光,是一種簡單光照模型,它將光照分解成了三個部分,分別為
- 漫反射
- 鏡面反射
- 環境光
如圖所示,是一個簡單的幾何模型。
- \(L\)是光源方向
- \(N\)是法線方向
- \(R\)是反射方向
- \(V\)是視線方向
- \(H\)是\(L\)和\(V\)的平分
- 所有向量都是單位向量
理想漫反射
當光源來自一個方向時,漫反射均勻地向各個方向傳播,與視點無關,是由物體表面粗糙不平引起的,漫反射的空間分佈是均勻的,也就是說不論從哪個方向看去,同一個點的漫反射光強都是一樣的。物體上的點\(P\),法向量為\(N\),入射光強度為\(I_p\),\(L\)為\(P\)指向光源的方向。如果所有所有的向量都是單位向量,那麼有
其中\(K_d=(K_{dr},K_{dg},K_{db})\)這三個分量分別是RGB三原色的漫反射係數,可以反應物體的顏色。同樣的\(I_p=(I_r,I_g,I_b)\)可以通過分量來設定光源的顏色。
鏡面反射
對於理想鏡面,反射光集中在一個方向,並遵守反射定律。對於一般的光滑表面,反射光則集中在一個範圍內,且反射定律決定的方向光強最大。所以從不同位置觀察到的鏡面反射光強不同。鏡面反射光可表示為
\(R \cdot V\)計算的是反射方向和視線方向的夾角,夾角越小,強度越大。\(n\)是反射指數,反應了物體的表面的光滑程度,一般1-2000。\(n\)越大約光滑,因為n越大,例如2000,那麼當夾角很小時,例如很接近1,如0.9,但是經過2000乘方,就變得很小了,這意味著只有無限接近反射方向,才能看到高光,其他方向不行,這就表示物體很光滑。反過來,\(n\)很小那麼移動一點角度,也能看到衰弱的高光,所以光斑會比較明顯。
在鏡面反射模型中,最終要的是計算R的方向,\(R\)可以通過入射方向和法線方向計算出來
因為這裡的向量都是單位向量,只有方向不一致
高光區域只反映光源的顏色,漫反射才能設定物體的顏色。
環境光
光源間接對物體施加的明暗影響,在物體和環境之間多次反射。在簡單光照模型中進行了簡化,通常用一個常數來模擬環境光
\(I_a\)是環境光強,\(K_a\)為物體對環境光的反射係數。
Phong模型
Phong模型是上述三種因素的疊加,其中\(R\)的計算比較費時,需要對每一點計算一次\(R\)的值。
Blinn-Phong模型
由於Phong模型計算較為耗時,後來提出了一種對Phong模型的修改,Blinn-Phong模型。
假設:
- 光源在無窮遠處,光線的方向L為常數(這就意味著,對物體上所有點來說,光線的方向都是一致的,正常情況應該是光源到點的向量,每個點的光照方向都不一致)
- 視點在無窮遠處,視線的防線V為常數(這個同理)
- 此模型針對高光部分進行了修改,\(R\cdot V\)的計算用\(H\cdot N\)近似,其中\(H=(L+V)/||L+V||\),也就是\(L\)和\(V\)的平分向量。當\(V\)接近\(R\)的時候,\(H\)也接近\(N\),符號高光的規律。對於所有點,\(H\)只需計算一次。
所以Blinn-Phong模型的可以表示成:
(圖片中應該採用了明暗處理,不僅是光照模型)
明暗處理
如今的物體大多數用多邊形表示,一個多邊形的法線方向一致,因此一個多邊形內部的畫素相同,而在鄰接出可能會有突變,感覺不連續。為了讓過度平滑,基本思想是:對多邊形的頂點計算合適的光強度,在內部進行均勻插值。其中有兩種主要的做法:
- 計算物體表面多邊形頂點的光強,然後插值,求多邊形內部光強。
- 對內部點的法向量進行插值,而頂點的法向量用相鄰多邊形的法向量的平均值得到。
Gouraud明暗處理(雙線性光強插值)
基本演算法
- 計算多邊形頂點的平均法向量
- 用Phong模型計算頂點的平均強度
- 插值計算離散邊上的各點光強
- 插值計算多邊形區域內的各點光強
計算速度比簡單光照模型有了很大的提高,解決了顏色突變問題,但是鏡面反射效果不理想。
Phong明暗處理(雙線性法向量插值)
和Gouraud方法基本類似,只不過是對法向量插值。多邊形頂點的法向量用相鄰多邊形的法向量的平均值。而內部每個點都要計演算法向量,用頂點的法向量插值得到。
這種做法效果好,可以產生正確的高光,但是計算量很大。
- [1]維基百科
- [2]計算機圖形學基礎教程 胡事民