Intro
這篇是介紹Light
Demo是自製 WebGL 的常用/預設Shader。
如果你是用Visual Studio, IntelliSense可以Work.
>Download Demo
代碼在 glShader.js 裡
之前都是以達成目標為主,反倒是忽略了基礎得紮穩點。
前陣子去面試考題要說明 3 種 Light 和演算法
一紙筆, 才發現一時寫不出來(=_=a.
這次學 WebGL 就給它認真的來記一次,順便寫個筆記。
Content
光線..量 = 環境光 + 散射光 + 鏡射光
Light Weight = A(mbient) + D(iffuse) + S(pecular);
為了方便調整,我就全給它加了個係數-Intensity
Light = A_Color * A_Intensity
+ D_Color * D_Intensity * D
+ S_Color * S_Intensity * S;
(好像是從哪學來的)
◆ A_Color;
指整體環境的光,就是基本光的強度
沒有其它計算XD
再來是 D 和 S ,請看下圖
上圖是a來自Wiki :)
◆ D = Normal(法線) . Ligtht Direction(光線方向);
內積(dot): A.B = |A| * |B| * Cosθ
有個重要的意義,只要除以|B| 就等於 A 在 B 的分向量長度
除以|A| = B 在 A 的分向量長度
因此,長度為 1 的話就不用除了:)
所以 D = 光線 在 法線的分向量長度(強度)
也就是光線 對 這個平面提供多少 Light Weight (光量?)
◆ S = (ViewDir . Reflection) ^ n 次方;
ViewDir = 視點方向
Reflection = 鏡射方向
鏡射就是,站對位置,射對方向,就會被刺到的光
即然要站對位置,就要有 眼晴(eye position) - 反射點 = ViewDir
射對方向 就該有 鏡射方向
所以 S = 鏡射光線 在 視點 的分向量長度(強度) , 的 n 次方
至於 n 次方的原因,請看下圖
次方越大,對於 角度0 (中間) 和其它角度的差異就越大
而鏡射是越靠近鏡射線,刺眼的程度會極快速增加
有空再記錄實作過程
就醬 :)
沒有留言:
張貼留言