Unity 溶解效果基于透明度软描边和硬描边

废话不多说进入正题.

下面这张动图是基于硬边做的溶解

下面这张动图是基于软边做的溶解

两者区别是溶解边缘有无过渡

然后再上代码

Shader "Custom/Disslove" 
{
    Properties
    {
        _MainTex("MainTex", 2D) = "white" {}
        _NoiseTex("NoiseTex", 2D) = "white" {}
        _EdgeWidth("EdgeWidth", Range( 0 , 1)) = 0
        _Dissolve("Dissolve", Range( 0.0001 , 1)) = 0.1643941
    }
    
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        Pass {
            Blend SrcAlpha OneMinusSrcAlpha
            Cull Off
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma target 2.0
            uniform sampler2D _NoiseTex;
            uniform float _Dissolve;
            uniform float _EdgeWidth;
            uniform sampler2D _MainTex;
            struct VertexInput {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float4 uv1 : TEXCOORD1;
                float4 uv2 : TEXCOORD2;
                float4 vertexColor : COLOR;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 uv1 : TEXCOORD1;
                float4 uv2 : TEXCOORD2;
                float4 vertexColor : COLOR;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.uv0;
                o.uv1 = v.uv1;
                o.uv2 = v.uv2;
                o.vertexColor = v.vertexColor;
                o.pos = UnityObjectToClipPos( v.vertex );
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                float4 noiseTex = tex2D( _NoiseTex,  i.uv0 );
                float4 mainTex = tex2D( _MainTex,  i.uv0 );
                float radio = saturate((noiseTex.r - _Dissolve)/(_EdgeWidth*_Dissolve));
                return fixed4(mainTex.rgb,radio*mainTex.a);
            }
            ENDCG
        }
    }
}

千万要记住噪声图要有过渡色, 如果没有过渡色也没办法做出来软边效果.

要点讲解此行技术关键

float radio = saturate((noiseTex.r - _Dissolve)/(_EdgeWidth*_Dissolve));

        noiseTex.r就是扫描的当前某个像素点 _Dissolve是溶解度 _EdgeWidth是描边宽度  (默认r,g,b通道值相等)

当前像素值(noiseTex.r)-溶解度(_Dissolve)=可视像素溶解差值

可视像素溶解差值 / _EdgeWidth(描边宽度)=跟描边宽度有关的色差值  溶解是先从接近于0的黑色开始 所以可视像素溶解差值 / _EdgeWidth(描边宽度)得出来效果也是由远及近对应的效果也是从浅到深

乘以_Dissolve是为了防止_EdgeWidth调的很大但是_Dissolve为0时候就开始溶解  

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值