[UnityShader3]溶解與重現效果


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM