提示:可直接复制使用哦

一、属性定义

Properties 块定义了可在 Unity Inspector 面板中调节的参数,是控制溶解效果的 “开关”:
_MainTex:UI 元素的主纹理(如按钮、图片的原始纹理)。
_NoiseTex:噪声纹理(关键!用于控制溶解的形状,通常是黑白灰的随机纹理)。
_DissolveThreshold:溶解阈值(范围 0~1),控制溶解程度:值越小,溶解区域越少;值越大,溶解区域越多(当为 1 时完全消失)。
_BurnColor:燃烧边缘的颜色(如红色、橙色,模拟燃烧效果)。
_BurnWidth:燃烧边缘的宽度(值越大,边缘越宽)。
模板测试相关属性(_StencilComp、_Stencil等):适配 UI 系统的遮罩逻辑(确保溶解效果受 UI 遮罩影响,比如在 Panel 遮罩内才显示)。

二、渲染设置(SubShader & Pass)

这部分控制渲染管线的基础行为,确保溶解效果正确融入 UI 渲染:
Tags { “Queue” = “Transparent” }:指定渲染队列为透明队列,确保 UI 元素按透明物体的规则渲染(不遮挡后方半透明元素)。
模板测试(Stencil):通过模板缓冲控制像素是否渲染,用于适配 UI 的遮罩系统(例如:只有当像素在遮罩范围内时,才应用溶解效果)。
Blend SrcAlpha OneMinusSrcAlpha:设置混合模式为标准透明混合(源像素 Alpha 作为权重,与背景混合),确保 UI 的半透明区域正确显示。

三、代码部分

代码如下():

Shader "UI/Dissolve"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" { }
        _NoiseTex ("Noise Texture", 2D) = "white" { }
        _DissolveThreshold ("Dissolve Threshold", Range(0, 1)) = 0.5
        _BurnColor ("Burn Color", Color) = (1, 0, 0, 1)
        _BurnWidth ("Burn Width", float) = 0.1
        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255
        _ColorMask ("Color Mask", Float) = 15
    }
 
    SubShader
    {
        Tags { "Queue" = "Transparent"}
 
        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
        ColorMask [_ColorMask]
        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
 
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
 
            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
 
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
 
            sampler2D _MainTex;
            sampler2D _NoiseTex;
            float _DissolveThreshold;
            float4 _BurnColor;
            float _BurnWidth;
            float _BurnIntensity;
 
            v2f vert(appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex.xyz);
                o.uv = v.uv;
                return o;
            }
 
            float4 frag(v2f i) : SV_Target
            {
                float4 noiseCol = tex2D(_NoiseTex, i.uv);
                clip(noiseCol.r - _DissolveThreshold);
 
                float4 col = tex2D(_MainTex, i.uv);
 
                float burnRate = 1 - smoothstep(0, _BurnWidth, noiseCol.r - _DissolveThreshold);
                float4 burnColor = lerp(_BurnColor, float4(0, 0, 0, 1), burnRate);
                col = lerp(col, burnColor, burnRate * step(0.0001, _DissolveThreshold));
 
                return col;
            }
            ENDCG
        }
    }
}

总结

该 Shader 的核心原理是:
通过噪声纹理定义溶解的形状,用阈值控制溶解的进度(哪些区域保留 / 消失),在溶解边缘通过颜色混合生成燃烧效果,同时通过模板测试和透明混合适配 UI 系统的渲染规则。
当调节_DissolveThreshold从 0 到 1 时,UI 元素会沿着噪声纹理的随机图案逐渐消失,且边缘始终伴随燃烧效果,实现自然的 “溶解消失” 动画。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐