參考链接:http://www.cnblogs.com/Esfog/p/DissolveShader.html
效果图:
从颜色变化来说,有三种,一种是纹理颜色。一种是纹理与黑边的混合颜色,一种是透明(用discard处理。不绘制像素)。还须要一张纹理(随意),依据它的随意一个通道来控制哪部分先消失。比如上面的效果图用的就是这张纹理的r通道:
假设用的是这张纹理(也就是模型自身的纹理)的r通道。会更加酷:
溶解效果代码例如以下:
Shader "Esfog/Dissolve" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _NoiseTex ("NoiseTex (R)",2D) = "white"{} _DissolveSpeed ("DissolveSpeed (Second)",Float) = 1 _EdgeWidth("EdgeWidth",Range(0,0.5)) = 0.1 _EdgeColor("EdgeColor",Color) = (1,1,1,1) _StartTime("StartTime",Float) = 0 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _NoiseTex; uniform float _DissolveSpeed; uniform float _EdgeWidth; uniform float4 _EdgeColor; uniform float _StartTime; float4 frag(v2f_img i):COLOR { float DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed); float noiseValue = tex2D(_NoiseTex,i.uv).r; if(noiseValue <= DissolveFactor) { discard; } float4 texColor = tex2D(_MainTex,i.uv); float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor)); float4 BlendColor = texColor * _EdgeColor; return lerp(texColor,BlendColor,1 - EdgeFactor); } ENDCG } } FallBack Off }
重现效果代码例如以下:
Shader "lyh/Show" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _NoiseTex ("NoiseTex (R)",2D) = "white"{} _DissolveSpeed ("DissolveSpeed (Second)",Float) = 1 _EdgeWidth("EdgeWidth",Range(0,0.5)) = 0.1 _EdgeColor("EdgeColor",Color) = (1,1,1,1) _StartTime("StartTime",Float) = 0 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _NoiseTex; uniform float _DissolveSpeed; uniform float _EdgeWidth; uniform float4 _EdgeColor; uniform float _StartTime; float4 frag(v2f_img i):COLOR { float DissolveFactor = saturate((_Time.y - _StartTime) / _DissolveSpeed); float noiseValue = tex2D(_NoiseTex,i.uv).r; float4 texColor = tex2D(_MainTex,i.uv); float EdgeFactor = saturate((noiseValue - DissolveFactor)/(_EdgeWidth*DissolveFactor)); float4 BlendColor = texColor * _EdgeColor; clip(1 - EdgeFactor - 0.01); return lerp(BlendColor,texColor,1 - EdgeFactor); } ENDCG } } FallBack Off }
在给出的參考链接中,能够非常好地了解到原理。这里就不解释了。而重现效果只是就是溶解效果的反转了。这里须要控制一下时间:
material.SetFloat("_StartTime", Time.realtimeSinceStartup);