從0開始用javascript和HTML5的canvas編寫光線追蹤渲染器<二>

局部光照模型簡介:

在上一節,介紹了光線追蹤算法的基本框架,裏面提到了兩個新的概念,其中一個是局部光照模型(phong模型),另一個是光線投射算法。光線投射算法我會在下一節介紹,本節主要介紹什麼是phong局部光照模型。


局部光照模型,顧名思義就是隻考慮光線在該物體上的作用,而不用考慮物體之間光能的傳遞。

phong模型分爲三大部分,漫反射分量diffuse, 鏡面反射分量reflection,環境光常量e。


漫反射在phong模型中是這樣描述的。

diffuse = I*cosa    其中a是光線和法線之間的夾角,I是入射光的亮度。如果夾角越大,也就是入射光入射角度越傾斜,漫反射的亮度越低。這也叫做餘弦發光體,又名朗博體表面散射模型。用文言文描述這一現象是:日初出滄滄涼涼,及其日中如探湯。。。。

鏡面反射和漫反射的一個差異就是,物體上某個點的光亮度不光和光源位置有關,還和視點有關。

reflection = I*(cosb)^n   其中cosb是反射光線 和 視線的反向射線 之間的夾角的餘弦,n表示光滑程度,由於cosb是(0-1)之間的小數,n越大相同的b會導致鏡面反射結果越小,也就使得光斑的面積越小,也就說明越光滑。


  

這裏採用的局部光照模型是phong模型,屬於一種經驗模型,所以爲了表現不同物體的材質十分困難,需要繁雜的參數調教。在目前業界已經普遍採用基於物理的渲染,即pbr,我希望在之後的迭代過程中可以引入。


下面給出已知入射光線求反射光線的解法以及公式,都是高中立體幾何知識。具體推導很簡單,我這裏只給出了結果。

直線入射點(a,b,c),方向向量(l,m,n)
x = l*t+a
y = m*t+b
z = n*t+c


法線 方向向量( o,p,q )
x = o*t+a
y = p*t+b
z = q*t+c


可以求入射向量的反方向向量(-l, -m, -n )關於法向量( o, p, q )的對稱向量
令ol + pm + qn = A, o^2 + p^2 + q^2 = B
對稱向量爲(-2Ao/B+l, -2Ap/B+m, -2Aq/B+n), 又已知入射點(a,b,c),所以易得反射光線。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章