Unity

Unity

官方網站:點擊進入
官方粉絲團:點擊進入

《Unity》Shader 05: 空間中的魔法參數 view direction

【unity】 【shader】 【view direction】 【參數】 【渲染】
作者:Hui-Ku Shih 時間:2015-10-13

大家好~~~~~久不見,由於人生中又開始充滿了各種忙和不確定性,所以拖了很久,這回我們先從上次沒講完的specular shading model 講起。 
 

要算反光亮點  就要先算 half vector 而是哪兩個 unit 中間的 half vector (這邊的 half vector 不是一半的意思 是 中間halfway) 而從 Blinn-Phong lighting model  的公式來看

 

float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(_Object2World,o.vertex));

 

viewDir = mul(rotation, viewDir);

(這邊的rotation 是上回的tangent space 的 matrix, 如果你要套用normal map 的話)

 

fixed3 halfvector = normalize(o.lightDirection + viewDir);

(這邊的 o.lightDirection 算法 在上回的 normal map shader 理)

 

比較省的作法 當然是在 vertex shder 中把 half vector 算好在傳給 fragment shader 

 

既然我們有了 half vector

剩下的公式就是跟lambert 差不多,把光的單位向量換成half vector 而已

 

fixed specular = dot(normal, halfvector );

 

剩下的就是反光的強度計算

 

float intensity = pow( saturate( specular),  specularHardness );

 

最後注意的是合成最後顏色的部份   

 

fixed4 finalColor = (材質採樣*lamber diffuse*客制化顏色 + 反光強度*反光顏色)*光強度*光顏色  

 

最後給大家 normal map + specular shader 的原碼 
 

隔了這麼久,當然不會只說到這裡啊! 標題要講的是 view direction ㄟ,雖然反光計算也是需要view direction 的  

但是有更多的shader 都會用到 view direction 的  

例如   rim light shader

《Unity》Shader 05: 空間中的魔法參數 view direction


水面的反射和折射的 blending lookup (lookup 的意思就像是對應的關係,這邊意思是反射和折射之間的轉換是用view direction 來決定的)

下圖中 比較近的水面你可以看到水下面的東西  比較遠的水面 則可以看到倒影而看不到水下的東西

這就是因為由視角(view direction) 當參數造成的效果

 

《Unity》Shader 05: 空間中的魔法參數 view direction

 

還有一種應用是今天要說的  當作貼圖作標的基礎 (事情當然不是這麼簡單低 所以說基礎)

 

《Unity》Shader 05: 空間中的魔法參數 view direction

 

沒錯今天要說的就是水墨邊shader~  超厲害der~  (這個shader 是很多人實驗出來的成果  不是我創的)

因為街霸四有類似的shader 所以我用了 Juri 當示範  希望各位不要檢舉我

 

我們直接講重點  重點就是view direction vector 

這個shader 的view direction unit vector 要用 object space 的

 

float3 viewDir = normalize( mul(_World2Object, float4(_WorldSpaceCameraPos.xyz, 1)).xyz - v.vertex);

有了以後  我們要算出view 和 normal 的內積

 

float vdotn = dot(viewDir,v.normal);

 

這個參數會決定邊緣(其實就是 rim light)

如果要加強這個邊緣線的粗細 可以用

 

vdotn = pow(vdotn, 2); 

 

如果在fragment 直接輸出這個值  

我們可以得下圖

 

《Unity》Shader 05: 空間中的魔法參數 view direction

 

離我們的目標看起來很近啦~  

最後階段的調整看起來很複雜 實際上就是找色區而已

然後套入見層的材質  

是實驗出來的結果 沒啥道理  客倌們可以自己玩看看

 

材質在這裡

 

《Unity》Shader 05: 空間中的魔法參數 view direction

 

付上原始shader檔 有興趣的可以自己玩   這個shader 有個好處 因為是 3D space 的 所以手機都可用~

https://drive.google.com/file/d/0B5Lw6ldPrVqkRnZPQkdrN1p5Nlk/view?usp=sharing
 

※作者作品

《落跑藍圖》 Android
《落跑藍圖》iOS


x