Unity Shader场景切换过度效果实现
发表于2018-08-27
切换场景,我们需要屏幕出现白到黑的过渡效果,一般来说,在相机前面加个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 }