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" }