Unity Shader 吸入黑洞效果

效果图

原理

  • 思路我们先把模型空间转到世界空间。

  • 这时再以小球的坐标减去模型顶点世界坐标,这样就得到模型中每个顶点到小球距离

  • 然后通过变量对距离插值,给原始模型顶点增加偏移量

具体步骤

参数定义
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;
}

源码下载

猜你喜欢

转载自blog.csdn.net/st75033562/article/details/129688811