UnityShader例項11 積雪材質

2021-07-04 09:53:48 字數 2382 閱讀 4012

積雪材質是我自己給這個材質取的名字,既然是積雪,那顧名思義,雪是從天而降的,因此積雪都是在物體朝上的表面;不管你的模型怎麼擺放 ,雪都保證是積在物體朝上(在unity裡就是y軸正方向)的表面,如下圖所示:

要保證向上的面有積雪,其實就是模型表面的法線方向與世界座標空間的y軸正方向保持一致積雪多,否則積雪就少雪,所以將模型的法線方向normal從模型空間轉化到世界空間,然後與y軸正方向float3(0,1,0)做點積,根據結果來確認法相的朝向和y軸的夾角大小,從而確認是否積雪;這個和之前的邊緣光材質是一樣的道理,不同的是,那個是考慮模型法線與視線方向的夾角;

終於到**實現了,想想有點小激動,嘿嘿。鑑於vf寫燈光比較複雜,本例的材質是沒有實現燈光支援的,廢話不多說,先從屬性定義開始,至少需要兩張貼圖,然後定義乙個引數控制雪的數量:

properties 

_snowtex ("snowtexture(rgb)",2d) = "white"{}

_snowcount ("snowcount", range (0.0, 1)) = 0.078

}

定義輸入結構體和輸出結構體;

float4 vertex : position;

float2 texcoord : texcoord0;

float3 normal : normal;

};struct v2f ;

接下來是比較關鍵的vert函式部分,在這裡獲得模型的法線,並將法線方向轉換到世界空間與y方向軸做點積,確定積雪的面,關鍵**如下:

float3 worldnormal = mul((float3x3)_object2world ,v.normal );//將法線轉換到世界空間

float rim = 1-saturate(dot(float3(0,1,0),worldnormal ));//將世界空間的法線方向與y軸做點積運算

o.texcoord = transform_tex(v.texcoord, _maintex);

o.snowuv = transform_tex(v.texcoord , _snowtex);

o.snow = pow(rim,_snowcount*64);//控制積雪的量,這個值將傳入到frag函式裡面用來混合兩張貼圖

frag函式比較簡單,用vert傳入的值i.snow將兩張貼圖混合,做出積雪的效果。下面是完整**

vf版本**01

shader "penglu/unlit/snowvf" 

_snowtex ("snowtexture(rgb)",2d) = "white"{}

_snowcount ("snowcount", range (0.0, 1)) = 0.078

}subshader

lod 100

pass ;

struct v2f ;

sampler2d _maintex;

sampler2d _snowtex;

float4 _maintex_st,_snowtex_st;

float _snowcount;

fixed4 frag (v2f i) : sv_target

endcg }}

}

上面的**由於是直接由頂點的法線計算,所以可以看到積雪的效果還是有點粗糙,因此可以考慮用法線貼圖來事的積雪的效果更加精確和細膩一些。同樣這個shader並沒有實現光照的效果,還是乙個unlit材質;原理差不多,因此不做過多的解析,完整**即效果如下:

vf版本**02:

shader "penglu/unlit/snowbumpvf" 

_bumpmap ("basebump", 2d) = "bump" {}

_snowtex ("snowtexture(rgb)",2d) = "white"{}

_snowcount ("snowcount", range (0.01, 1)) = 0.078

}subshader

lod 200

pass ;

sampler2d _maintex,_bumpmap;

sampler2d _snowtex;

float4 _maintex_st,_snowtex_st;

float _snowcount;

fixed4 frag (v2f i) : sv_target

endcg }}

}

vf版本**02效果:

UnityShader例項03 邊緣光材質

邊緣光材質 邊緣光材質原理和xray材質相類似,shader 也就長得幾乎一樣了 shader 實現 vf版本 01 shader penglu rimlight vf rimcolor rimcolor color 0,1,1,1 rimpower rim power range 0.1,8.0 ...

Unity Shader內建矩陣

內建矩陣 支援的矩陣 float4x4 unity matrix mvp 當前模型 檢視 投影 矩陣 unity matrix mv 當前模型 檢視 矩陣 unity matrix v 當前檢視矩陣。unity matrix p 目前的投影矩陣 unity matrix vp 當前檢視 投影 矩陣 ...

Unity Shader 光照模式

shader custom deferred forward vertex subshader blend one zero cgprogram pragma vertex vert pragma fragment frag include unitycg.cginc include lightin...