上一次的分享有說到,specular的算法主要有三步:首先得到平面上點的法向量N;然後根據光源的方向求得反射光R;最後根據R求得反射光與人眼的夾角θ,θ越小說明人眼與反射光越接近,等到θ等於0的時候,就可以最大化的看到反射光。
所以現在我們開始在shadergraph裡面來完成我們的算法。
打開上次diffuse的那個shader,我們直接在這個shader的基礎上疊加specular效果,就可以最終得到phong shader的效果。
首先新建節點NormalVector來獲取物體表面的法向量(記得space一定要和之前的diffuse一樣選world)
然後光源方向,直接用上次輸入的light direction變量,將這兩個參數輸入到一個叫做reflection的節點裡面,就可以得到我們光源的反射光線
得到反射光線以後,還需要獲取人觀察的方向,然後反射光線和觀察方向進行點乘,就可以求得θ值了。
人觀察的方向可以直接用shader graph自帶的view direction來獲取,所以結果如下;
因為黑色顏色值為0,但是如果是負數的話,得到的顏色也是0,所以為保證顏色值在0-1之間,我們給結果加上一個Maximum節點,去除掉小於0的值。
如此便得到specular的效果,最後將其與之前做的diffuse相加,輸入到最後的輸出節點中。
觀察最後的輸出,可以看到高光的地方特別亮,以至於擋掉了diffuse的顏色值。
所以我們需要想辦法讓這個高光值不那麼大,0-1之間的值怎麼才能夠越變越小,就是乘以自己,所以我們給高光加上一個power函數,來控制高光範圍。
保存後在場景中觀察得到的結果。
此時的小球已經有了我們夢寐以求的高光效果!
為方便外部可調性,將power的冪值暴露出去,新添加一個類型為float的input,命名為shininess,並將默認值改為10。值越大表示高光範圍越小。
同樣,我們再給高光的輸出乘上一個參數來控制specular高光的亮度。
這樣我們就可以在外部隨意調節高光的亮度和範圍了。
- End -