[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);

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现角色消失、溶解或隐身的效果可以使用Unity Shader编写。一种常用的方法是使用渐变进行角色的消失或出现。 以下是一个简单的Unity Shader代码示例,用于实现角色消失的效果: ``` Shader "Custom/Disappear" { Properties { _MainTex ("Texture", 2D) = "white" {} _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 _FadeRange ("Fade range", Range(0,1)) = 0.1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float _Cutoff; float _FadeRange; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); float alpha = col.a; float dist = abs(i.uv.y - 0.5); alpha = smoothstep(_Cutoff - _FadeRange, _Cutoff + _FadeRange, alpha); alpha *= smoothstep(0, _FadeRange, dist); col.a = alpha; return col; } ENDCG } } } ``` 在这个Shader中,我们使用_MainTex来获取角色的纹理。_Cutoff和_FadeRange分别控制渐变的起点和终点。在fragment shader中,我们使用smoothstep函数来实现渐变效果,并使用dist变量来控制渐变的位置,使角色从中心开始渐变消失。 你可以将这个Shader应用到角色的材质中,然后使用代码控制_Cutoff和_FadeRange参数来实现角色的消失效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值