參考鏈接: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);