Unity Shader场景切换过度效果实现

发表于2018-08-27
评论0 4.3k浏览
切换场景,我们需要屏幕出现白到黑的过渡效果,一般来说,在相机前面加个Image,控制他的透明度就好了。虽然这种方法可以做到,但是可能之后会有各种小问题,为此下面就给大家介绍下的Shader方法来实现场景切换过度效果。脚本直接挂在相机上,相关代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using DG.Tweening;
public class test : MonoBehaviour
{
    public Material ma;
    float count;
    public bool SetWhiteBool = false;
    public bool SetBlackBool = false;
    public float ChangeTime = 0.3f;
    // Use this for initialization
    void Start()
    {
        if(ma==null)
        {
            ma = new Material(Shader.Find("MyShader/BlackScreen"));
        }      
    }
    // Update is called once per frame
    void Update()
    {
        if (SetWhiteBool)
        {
            SetWhite();
        }
        else if (SetBlackBool)
        {
            SetBlack();
        }    
    }
    void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        //拷贝源纹理到目的渲染纹理。这主要是用于实现图像效果。  
        //Blit设置dest到激活的渲染纹理,在材质上设置source作为  
        //_MainTex属性,并且绘制一个全屏方块。  
         Graphics.Blit(source, destination, ma);
    }
    void SetWhite()
    {
        count = ma.GetFloat("_Float1") + ChangeTime * Time.deltaTime;
        ma.SetFloat("_Float1", count);
        if (ma.GetFloat("_Float1") >= 1)
        {
            SetWhiteBool = false;
        }
    }
    void SetBlack()
    {
        count = ma.GetFloat("_Float1") - ChangeTime * Time.deltaTime;
        ma.SetFloat("_Float1", count);
        if (ma.GetFloat("_Float1") <= 0)
        {
            SetBlackBool = false;
        }
    }
}

shader代码:
Shader "MyShader/BlackScreen" {
Properties
{
_Color("Main Color", Color) = (1,1,1,1)
_Float1("改变颜色",Range(0,1)) = 1.0
_MainTex("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_img         //vert_img在UnityCG.cginc里有预定义的函数体,是最普通的顶点处理函数  
#pragma fragment frag             
#include "UnityCG.cginc"  
fixed4 _Color;
sampler2D _MainTex;             //这两个变量一定要在CGPROGRAM中定义一次,不要看Properties里有就不写了  
float1 _Float1;
float4 frag(v2f_img i) : COLOR
{
float4 col = tex2D(_MainTex, i.uv) * _Float1;    //简单的两个float4点乘,刚好乘白色不变,乘纯黑就黑透,不一定是纯线性关系但表现效果没问题  
return col;
}
ENDCG
}
}
Fallback off
}

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