點光源與平行光
前言
最近實作了點光源與平行光,以前都看別人寫好的光源,現在自己做的時候發現有些觀念跟我想的不一樣,在此做個紀錄。
內容
在光的Diffuse的部分只需計算Lambert's cosine law,也就利用光的方向與三角形的Normal做點積(dot),以前都沒發現實際上還要再加上一個"負號"才正確,想想點積後的結果是"1"的時候,表示光與normal同一方向,這時應該得到"-1",再想想點積後的結果是"-1"的時後,表示光與normal相反方向,這時應該得到"1",這樣剛好會差一個負號,這點請注意!再來要剃除負號的部分,讓光只會增亮而不會變暗,所以只需算diffuse的平行光計算如下diffuse = (light's intensity) * clamp(dot(lightDir,Normal) * -1, 0.0, 1.0)
接著是Specular的部分,需要一個Light與Normal的反射向量與鏡頭所看的方向兩個做點積,這裡要注意Reflect()的光方向要是"相反的",如下圖示
Specular的計算 |
Specular = pow(clamp(dot(reflect(-LightDir,Normal),viewDir.xyz),0.0,1.0),(powIntensity) ) * (light's intensity)
接著是點光源與平行光的差異,平行光不需計算Specular的部分,所以傳入Shader計算時,只須傳一個方向,點光源在Shader計算時傳的是"光源的位置",在diffuse 與Specular 的計算須要的"光的方向"是透過"光源的位置"與"目前計算的Pixel的位置"兩者來取得方向,並且點光源還需要多控制一個"範圍"。
沒有留言:
張貼留言