1. 程式人生 > >Shader 學習筆記 20160618

Shader 學習筆記 20160618

星之卡比-機械星球 機械魔方shader思路


CSDN伺服器崩了,圖片待補。
視訊如下
http://pan.baidu.com/s/1i4R97gT


圖片說明:
a, 一個box, 自己旋轉,然後顏色變換,在最右側有高光, 然後內部有電路一樣的東西似乎在流動。
b, 背後有一個動態光flare
c, 背後有一個多個方塊fadeinFadeout效果。


思路一:旋轉、動態光flare、背後的多方塊fadeinFadeout效果都不是問題。難點是中間的那個光不停變換的怎麼做。思路一就是我最開始的想法,通過程式做按照時間或者旋轉角度作為輸入做pixel控制。但是後來一想,這種方法太笨了,coding過於複雜,並且不利於artist調整。

思路二:使用兩個差別比較大的Texture配合lerp()函式,然後配合計算時間(或者cube的旋轉角度)做輸入,計算pixel。這個approach比之前的好一些,但是還是面對需要做兩個Texture,調整lerp的工作,最關鍵是不夠直觀。

思路三:其實也不算是思路,因為之後我又看到了一個同樣的cube,但是是灰色的,從這個cube可以看到它會出現鏡面高光(最右面的面)。我一下子想到了!這是一個典型應用了brdf(或者reflectionCube)做到的高光和顏色控制說白了就是通過輸入Viewdir和Normal,算出Reflectdir,然後把Reflectdir歸一化到一個texture裡面去找點(實際上這個點代表的意思就是光源的color和specular)。找完點(找完光)後再和cube本身的Texture相乘。

操作上有兩種:
一種是shader裡面直接寫反射公式,然後去對映lightTextureMap。這個方式好處在於節省材質大小,但是缺點在於不太方便artist靈活調整。
另外一種就是直接使用reflection cube map做反射控制,簡單粗暴,又符合人類直觀調整。舉例來說,用standardShader實現,可以直接掛一個reflection probe,然後reflection probe上面掛一個reflection cube以便模擬光源。而物體本身則可以通過specular和smooth來決定反射效果。缺點是物件多,資源耗費多,特別是cubemap的資源多(不過可以使用mipmap降低解析度);另外一個缺點就是Cubemap需要仔細調整,因為在cube旋轉的時候,如果cubemap的色彩調整不到位,就會讓人感覺cubemap是在反射環境,而不是在shining,從這點上看第一種操作就好,因為可以函式控制,搞成非線性的,直接reflection probe cube的方式就是隻能線性的。