效果图
原理
思路我们先把模型空间转到世界空间。
这时再以小球的坐标减去模型顶点世界坐标,这样就得到模型中每个顶点到小球距离
然后通过变量对距离插值,给原始模型顶点增加偏移量
具体步骤
参数定义
Properties
{
_MainTex ("Texture", 2D) = "white" {}
//物体的y坐标上限
_TopY("Top Y", Float) = 0
//物体的y坐标下限
_BottomY("Bottom Y", Float) = 0
//控制条
_Control("Control Squash", Range(0, 2)) = 0
//黑洞坐标
_BlackHolePos("Position of the Black Hole", Vector) = (0, 0, 0, 1)
}
顶点函数
核心思想经过对_Control控制得到模型顶点距离小球中心点距离不同插值数值,然后把这数值增加给原始模型偏移量。
v2f vert (appdata v)
{
v2f o;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float3 toBlackHolePos = mul(unity_WorldToObject, (_BlackHolePos - worldPos)).xyz;
float normalizedDist = GetNormalizedDist(worldPos.y);//对所有顶点的Y坐标进行归一化
float val = max(0, _Control - normalizedDist);
v.vertex.xyz += toBlackHolePos * val;
//模型顶点
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
片元函数
clip过滤超过黑洞的部分
fixed4 frag (v2f i) : SV_Target
{
//clip(x) Discards the current pixel, if any component of x is less than zero.
//过滤超过黑洞的部分
clip(_BlackHolePos.y - i.worldPos.y);
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}