Unity shader 角色消失 溶解 隱身 效果

先上兩張效果圖

在這裏插入圖片描述
在這裏插入圖片描述

實現原理

一句話總結:
空間中有一個隱形的面,判斷模型上和麪的相對位置,根據需求隱藏上方或者下方的點。

原理就這麼簡單,具體怎麼實現呢,首先確定數學幾何中平面的性質:原點到到面上任意一點構成的向量a,再這個面的法線(n)方向投影,都是相等的,距離爲d。用數學公式表達爲:
ax + by + cz = d
畫一個小圖更容易理解:
在這裏插入圖片描述
最簡單地平面垂直於Y軸。P1和P2在法線方向的投影是紅色的虛線,長度相同,爲d。P3是面下方的點,在法線方向的投影小於d,由此可以通過空間中任意一點的以原點爲起點的向量再面法線方向的投影跟d值比較,判斷這個點和麪的相對位置。法線方向不同,判斷的方式也就不同。
PS:選擇原點因爲一個點的座標值就是它的向量,方便計算。也可以選擇空間中其他點作爲計算的原點。
通過上面的講解,可以確定,在寫shader前,需要拿到法線向量和d,所以選面上的任意一點,再選一個法線向量。爲了計算方便,直接選擇ntransform.forward,任意一點P爲transform.position,通過C#算出d,將法線和d傳入shader中,爲了節省變量,shader中應選擇一個vector,xyz分量爲法線的xyz,w分量作爲d(當然也可以多個變量)。然後可以開始編寫shader了。

Vector3 point = transform.position;
Vector3 normal = transform.forward;
float dis = Vector3.Dot(point, normal.normalized);
material.SetVector("_Plane", new Vector4(normal.x, normal.y, normal.z, dis));

此時問題就變成了任意空間的任意一點(座標即爲它的向量)在向量n的投影,和d作比較。
在這裏插入圖片描述
如上圖,只需要計算藍色虛線的長度即可,使用向量的點乘dot,P點向量點乘法線的單位向量,就直接是藍色虛線的長度。

float3 face_normal = _Plane.xyz;
float target_dis = _Plane.w;
float dis = dot(i.worldPos.xyz, normalize(face_normal));
clip(dis - target_dis);

接下來根據法線的方向或者自己的需求,使用clip剪裁調不符合需求的點就能達到剔除的效果,如下圖:
在這裏插入圖片描述
爲了使效果更加柔和點,添加一個噪聲圖,將需要clip的點進行隨機偏移,修改噪聲圖的Tiling值,改變採樣的頻率,實現文章開始的效果。

fixed4 col = tex2D(_NoiseTex, TRANSFORM_TEX(i.uv, _NoiseTex));
float offset = (col.r * 2 - 1) * _Strength;
float3 w_pos = i.worldPos.xyz + float3(offset, offset, offset);
float3 face_normal = _Plane.xyz;
float target_dis = _Plane.w;
float dis = dot(w_pos, normalize(face_normal));
clip(dis - target_dis);

源代碼

源碼可以去我的GitHub看,包括資源:點我直達源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章