174 lines
5.2 KiB
Plaintext
174 lines
5.2 KiB
Plaintext
Shader "SGame/Particles/AlphaBlend_DepthCap"
|
|
{
|
|
Properties
|
|
{
|
|
[Enum(Off, 0, On, 1)] _ZWrite("深度写入", Float) = 0
|
|
[Enum(Off, 0, On, 2)] _ZTest ("深度测试", Float) = 2
|
|
_TintColor ("颜色", Color) = (0.5,0.5,0.5,0.5)
|
|
_MainTex ("基础贴图(RGB: 颜色,A: Alpha)", 2D) = "white" {}
|
|
[MaterialToggle]_CutOff ("透贴开关", Float) = 0
|
|
_CutOffAlpha ("透贴Alpha阈值", Range(0, 1)) = 0
|
|
[MaterialToggle]_GlowCustomData ("加亮CustomData", Float) = 0
|
|
_Glow("加亮", Range(0,10)) = 1
|
|
_AngleRange ("单边区域角度", Range(0, 360)) = 360
|
|
|
|
[Space(15)]
|
|
[MaterialToggle] _SphereDuelMask ("扇形双边遮罩开关", Float) = 0
|
|
_AngleDuelRange ("双边区域角度", Range(0, 360)) = 360
|
|
// _AngleProc ("扇形遮罩百分比", Range(0, 1)) = 0
|
|
[Space(15)]
|
|
[MaterialToggle] _UVCutOn ("UV 线性剔除开关", Float) = 0
|
|
_InnerCutOut ("内圈剔除", Range(0, 1)) = 0
|
|
|
|
[Space(15)]
|
|
[HideInInspector] _HorizontalLine ("地平面分割线", Float) = -5000
|
|
[HideInInspector] _HorizontalClip ("地平面切割", Float) = 0
|
|
[Enum(Double, 0, Front, 1, Back, 2)]_CullMode ("面剔除", Float) = 0
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"Queue"="Overlay"
|
|
"RenderType" = "Transparent"
|
|
"IgnoreProjector" = "True"
|
|
"PreviewType" = "Plane"
|
|
"PerformanceChecks" = "False"
|
|
"RenderPipeline" = "UniversalPipeline"
|
|
}
|
|
|
|
Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha
|
|
Cull [_CullMode] Lighting Off
|
|
ZWrite [_ZWrite] ZTest[_ZTest]
|
|
|
|
HLSLINCLUDE
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl"
|
|
|
|
#pragma multi_compile __ _CUTOFF_ON
|
|
#pragma multi_compile __ _SPHEREDUELMASK_ON
|
|
|
|
TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _MainTex_ST;
|
|
half4 _TintColor; half _Glow;
|
|
half _CutOffAlpha;
|
|
|
|
half _HorizontalClip;
|
|
half _HorizontalLine;
|
|
half _GlowCustomData;
|
|
|
|
half _AngleRange;
|
|
half _AngleDuelRange;
|
|
half _InnerCutOut;
|
|
|
|
half _UVCutOn;
|
|
CBUFFER_END
|
|
|
|
struct Attributes
|
|
{
|
|
float4 vertex : POSITION;
|
|
half4 color : COLOR;
|
|
float2 texcoord : TEXCOORD0;
|
|
float4 texcoord2 : TEXCOORD1;
|
|
float4 texcoord3 : TEXCOORD2;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
};
|
|
struct Varyings
|
|
{
|
|
float4 vertex : SV_POSITION;
|
|
half4 color : COLOR;
|
|
float4 texcoord : TEXCOORD0;
|
|
half3 worldPos : TEXCOORD1;
|
|
float texCustomData : FLOAT;
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
inline Varyings vert (Attributes v)
|
|
{
|
|
Varyings o = (Varyings)0;
|
|
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
VertexPositionInputs vertexInput = GetVertexPositionInputs(v.vertex.xyz);
|
|
o.vertex = vertexInput.positionCS;
|
|
o.worldPos.xyz = vertexInput.positionWS;
|
|
|
|
o.texcoord.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
|
|
o.texcoord.zw = v.texcoord.xy;
|
|
o.texCustomData = v.texcoord3.y;
|
|
o.color = v.color;
|
|
|
|
return o;
|
|
}
|
|
|
|
inline half4 frag (Varyings i) : SV_Target
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
|
|
half4 col = i.color * _TintColor * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.texcoord);
|
|
half a = col.a;
|
|
half glowOffset = _GlowCustomData * i.texCustomData * _Glow + (1 - _GlowCustomData) * _Glow;
|
|
col *= glowOffset;
|
|
#if defined(_CUTOFF_ON)
|
|
clip(col.a - _CutOffAlpha);
|
|
#endif
|
|
|
|
#if defined(_SPHEREDUELMASK_ON)
|
|
half dotResDul = dot(half2(0, 1), normalize(i.texcoord.xy - half2(0.5, 0.5)));
|
|
half dotClampDul = step(degrees(acos(dotResDul)), _AngleDuelRange / 2);
|
|
col.rgb *= dotClampDul;
|
|
#else
|
|
//第一象限:step(0.5, i.texcoord.x) * step(dotRes, 0)
|
|
//第二象限:step(i.texcoord.x, 0.5) * step(dotRes, 0)
|
|
//第三象限:step(i.texcoord.x, 0.5) * step(0, dotRes)
|
|
//第三象限:step(i.texcoord.x, 0.5) * step(dotRes, 0)
|
|
|
|
half dotRes = dot(half2(0, -1), normalize(i.texcoord.xy - half2(0.5, 0.5)));
|
|
half dotRes2 = dot(half2(0, 1), normalize(i.texcoord.xy - half2(0.5, 0.5)));
|
|
|
|
// half dotClampOri = step(dotResDul, _AngleRange - 180) -
|
|
half dotClamp = step(degrees(acos(dotRes)), abs(180 - _AngleRange)) * step(0.5, i.texcoord.x) * step(180, _AngleRange);
|
|
half dotClamp2 = step(degrees(acos(dotRes2)), _AngleRange) * step(i.texcoord.x, 0.5);
|
|
// col.rgb = acos(dotRes) / UNITY_PI;
|
|
col.rgb *= dotClamp2 + dotClamp;
|
|
#endif
|
|
|
|
half uvMask = step(_InnerCutOut, i.texcoord.w);
|
|
half mask = step(_InnerCutOut, length(i.texcoord.xy - half2(0.5, 0.5)));
|
|
mask = lerp(mask, uvMask, _UVCutOn);
|
|
|
|
a = step(_HorizontalLine, i.worldPos.y) * a * _HorizontalClip + a * (1 - _HorizontalClip);
|
|
return half4(col.rgb * col.a, clamp(a * mask, 0, 1));
|
|
}
|
|
ENDHLSL
|
|
|
|
Pass
|
|
{
|
|
|
|
Tags { "LightMode" = "UniversalForward" }
|
|
HLSLPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
ENDHLSL
|
|
}
|
|
|
|
Pass
|
|
{
|
|
//剔除不受 扭曲影响Pass,默认用脚本Disable掉
|
|
|
|
Tags { "LightMode" = "ScreenDistortion" }
|
|
HLSLPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
ENDHLSL
|
|
}
|
|
}
|
|
FallBack "Mobile/VertexLit"
|
|
} |