这类特效在游戏中经常看到,比如地铁跑酷等,可以在一个看起来类似坡道的地方运动,远处视野受限,将在两方快要交汇在顶点时才可视,增加难度与不一样的视觉体验。
原理:
因为是以摄像机为中心的地面效果,所以要在顶点经过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); ... }
原场景
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); ... }
效果:
文章评论