Unity UGUI Image 溶解效果Shader
Properties 块定义了可在 Unity Inspector 面板中调节的参数,是控制溶解效果的 “开关”:_MainTex:UI 元素的主纹理(如按钮、图片的原始纹理)。_NoiseTex:噪声纹理(关键!用于控制溶解的形状,通常是黑白灰的随机纹理)。_DissolveThreshold:溶解阈值(范围 0~1),控制溶解程度:值越小,溶解区域越少;值越大,溶解区域越多(当为 1 时完全消
提示:可直接复制使用哦
一、属性定义
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 元素会沿着噪声纹理的随机图案逐渐消失,且边缘始终伴随燃烧效果,实现自然的 “溶解消失” 动画。
更多推荐
所有评论(0)