这类特效在游戏中经常看到,比如地铁跑酷等,可以在一个看起来类似坡道的地方运动,远处视野受限,将在两方快要交汇在顶点时才可视,增加难度与不一样的视觉体验。

原理:

因为是以摄像机为中心的地面效果,所以要在顶点经过MV变换后,在进行透视变换之前对顶点进行修改。

使用一个_Value作为控制修改的控制参数

Properties
{
    _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0)
    _MainTex("Main Tex", 2D) = "white" {}
    _Value ("_Value", Range(0,1)) = 0.0
}

先执行MV变换,然后对顶点进行操作,在进行P变换。其中在view变换后对算出参数对z的影响后,使用抛物线*y轴单位向量,如果是地面下沉,则用减法。

v2f vert(a2v v) 
{
    float4 pos = v.vertex;
    //transform
    pos = mul(UNITY_MATRIX_MV, pos);

    float zOff = pos.z * _Value;
    pos -= float4(0, 1, 0, 0) * zOff * zOff;

    pos = mul(UNITY_MATRIX_P, pos);

    ...
}

原场景

通过调节_Value参数来修改影响

z轴地面下沉,因为以摄像机为中心变换,所以往哪走都是上坡。

在增加一个x轴

v2f vert(a2v v) 
{
    float4 pos = v.vertex;
    //transform
    pos = mul(UNITY_MATRIX_MV, pos);

    float zOff = pos.z * _Value;
    float xOff = pos.x * _Value;
    pos -= float4(0, 1, 0, 0) * zOff * zOff;
    pos -= float4(0, 1, 0, 0) * xOff * xOff;
    pos = mul(UNITY_MATRIX_P, pos);

    ...
}

效果: