Files
JJBB/Assets/Project/Shader/ParticleAlphaDissolve.shader
2024-08-23 15:49:34 +08:00

86 lines
2.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Author: Blastom
// 仅用于摄像机拍摄UI面板的RenderTexture
// 该材质会向颜色Buffer中写入Alpha值因此不会在没有背景时被剔除
Shader "Zhanyou/Particles/ParticleAlphaDissolve"
{
Properties
{
_TintColor ("Tint Color", Color) = (0.5, 0.5, 0.5, 0.5)
_MainTex ("Particle Texture", 2D) = "white" {}
// 溶解贴图RGB为颜色A为溶解开始数值
_DissolveTex ("Dissolve Tex", 2D) = "white" {}
// 部分溶解的渐变区域值
_DissolveFade ("Dissolve Fade", Range(0, 1)) = 0.1
// 完全溶解的Alpha数值
_DissolveEnd ("Dissolve End", Range(0, 1)) = 0.5
}
Category {
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
//BlendOp Add, Max
Blend SrcAlpha OneMinusSrcAlpha//, One One
Cull Off
Lighting Off
ZWrite Off
//ColorMask RGB
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#pragma multi_compile_particles
#include "UnityCG.cginc"
sampler2D _MainTex;
fixed4 _TintColor;
struct appdata_t {
float4 vertex : POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float2 dissolveCoord : TEXCOORD1;
UNITY_FOG_COORDS(2)
};
uniform float4 _MainTex_ST;
uniform sampler2D _DissolveTex;
uniform half4 _DissolveTex_ST;
uniform half _DissolveFade;
uniform half _DissolveEnd;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.dissolveCoord = TRANSFORM_TEX(v.texcoord, _DissolveTex);
UNITY_TRANSFER_FOG(o, o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// 对齐AlphaWriteAlpha不乘以2
fixed4 col = i.color * _TintColor * tex2D(_MainTex, i.texcoord);
fixed4 dissolve = tex2D(_DissolveTex, i.dissolveCoord);
if (dissolve.a <= _DissolveEnd + _DissolveFade)
{
float alpha = max(0.0, (dissolve.a - _DissolveEnd) / _DissolveFade);
col.a *= alpha;
col.rgb = lerp(lerp(dissolve.rgb, col.rgb, alpha), dissolve.rgb, alpha * alpha);
}
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
}