zoukankan      html  css  js  c++  java
  • 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函数,无需记忆,待用到之时再去查阅即可。

  • 相关阅读:
    UVA 1600
    P3366 【模板】最小生成树(堆优化prim)
    P2414 [NOI2011]阿狸的打字机
    P2322 [HNOI2006]最短母串问题
    P4052 [JSOI2007]文本生成器
    P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
    P3966 [TJOI2013]单词
    P2444 [POI2000]病毒
    P3294 [SCOI2016]背单词
    P2922 [USACO08DEC]秘密消息Secret Message
  • 原文地址:https://www.cnblogs.com/joeshifu/p/5489773.html
Copyright © 2011-2022 走看看