Unity场景向屏幕中心塌陷的shader

发表于2019-01-23
评论0 2.8k浏览
游戏中的场景分为很多种,本篇文章中要分享的是在开发过程中如何利用shader实现场景向屏幕中心塌陷的效果。

先来看下效果:

shader代码:
Shader "Custom/CollapseShader" {
	Properties {
		_MainTex ("Maintex", 2D) = "white" {}
        _Progress ("Progress" , Float) = 1  
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
        Pass{  
		CGPROGRAM
		    #include "UnityCG.cginc"    
            #pragma vertex vert_img    
            #pragma fragment frag  
            sampler2D _MainTex;
            float _Progress;
            fixed4 frag(v2f_img i) : SV_Target {  
                float2 uv = (i.uv - float2(0.5f,0.5f));
                float dis = length(uv);
                uv = i.uv + normalize(uv)*(1-length(uv))*(_Progress);
                fixed4 c = tex2D(_MainTex,uv);  
                return c*(1-_Progress);  
            }    
        ENDCG 
        }     
	}
	FallBack "Diffuse"
}

代码很简单,一个_Progress变量控制当前塌陷的程度,使用当前uv距离中心点的向量*当前uv到当前方向边缘的距离来计算当前位置偏移后的位置。

C#代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollapseCamera : MonoBehaviour {
    Camera mainCamera;  
    public Material m;
    float progress = 0;
    public float distance; 
	// Use this for initialization
	void Start () {
        mainCamera = gameObject.GetComponent<Camera>();
	}
	// Update is called once per frame
	void Update () {
        if (progress  >=  1 ) return;
        progress += (Time.deltaTime * 0.5f);
        m.SetFloat("_Progress", progress); 
	}
    void OnRenderImage(RenderTexture src, RenderTexture dest)  
    {  
        Graphics.Blit(src, dest, m);  
    }  
}

将此脚本挂在到摄像机上并赋予一个使用了上边shader的材质球,运行场景即可看到效果。
完整代码:https://github.com/LiuFeng1011/Test/tree/master/Assets/CollapseTest

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引