Shader實例:溶解效果(Dissolve)


效果:

圖左:一道金光閃過,瞬間灰飛煙滅
圖右:燃燒效果,先過渡到黃色,然后漸漸過渡到黑色,最后消失殆盡。

這是游戲中常見的效果,各位可以想想自己玩過的游戲。
手頭正在玩的,夢三國手游,死亡的時候就是溶解消失。

代碼有注釋:

Shader "Custom/Dissolve"
 {
    Properties 
    {
        _MainTex("main tex",2D) = ""{}
        _DissolveTex("dissolve tex",2D) = ""{}//溶解紋理,根據這張圖的R值(也可以是其它通道的值)來做溶解判斷,簡單的說就是利用這張圖的特征來作為溶解的樣式
        _DissolveColor("dissolve color",Color) = (0,0,0,1)//溶解顏色
        _EdgeColor("edge color",Color) = (0,0,0,1)//邊緣顏色
        _DissolveSpeed("dissolve speed",Range(0,5)) = 2//溶解速度
        _DissolveFactor1("dissolve factor1",range(0,1)) = 0.7//溶解因子1,大於這個因子就向溶解色過渡
        _DissolveFactor2("dissolve factor2",range(0,1)) = 0.9//溶解因子2,大於這個因子就向邊緣色過渡
    }
 
    SubShader 
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata_custom
            {
                float4 vertex:POSITION;
                float4 texcoord:TEXCOORD0;
            };
 
            struct v2f
            {
                float4 pos:POSITION;
                float2 uv:TEXCOORD0;
            };
 
            sampler2D _MainTex;
            float4 _MainTex_ST;
 
            sampler2D _DissolveTex;
            float4 _DissolveColor;
            float4 _EdgeColor;
            float _DissolveSpeed;
            float _DissolveFactor1;
            float _DissolveFactor2;
 
            v2f vert(appdata_custom v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }
 
            half4 frag(v2f IN):COLOR
            {
                half4 c = tex2D(_MainTex,IN.uv);
                float dissolve_c_r = tex2D(_DissolveTex,IN.uv).r;
                float factor = saturate(_Time.y*_DissolveSpeed/5);
                if(factor>dissolve_c_r)
                {
                    discard;
                    //clip(-1.0);
                }
 
                float rate = factor / dissolve_c_r;
                if(rate > _DissolveFactor1)
                {
                    //向溶解色過渡
                    c.rgb = lerp(c.rgb,_DissolveColor.rgb,rate);
 
                    if(rate>_DissolveFactor2)
                    {
                        //向邊緣色過渡
                        c.rgb = lerp(c.rgb, _EdgeColor.rgb,rate);
                    }
                }
                return c;
            }
            ENDCG
        }
    } 
    FallBack "Diffuse"
}

clip:如果輸入向量中的任何元素小於0,則丟棄當前像素。
discard:丟棄當前像素,功能同clip
lerp:線性插值,eg:lerp(a,b,f),a*(1-f)+b*f,隨着f增大,a會越來越趨向於b

CG函數,無需記憶,待用到之時再去查閱即可。


免責聲明!

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



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