Files

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