NLDClient-yudde/ProjectNLD/Assets/Code/Shaders/Others/shader_mix.shader

321 lines
11 KiB
Plaintext

Shader "NLD/Particles/shader_mix"
{
Properties
{
[Header(Option)]
// [Enum(UnityEngine.Rendering.BlendOp)] _BlendOp ("BlendOp", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _BlendSrc ("Blend mode Source", Int) = 5
[Enum(UnityEngine.Rendering.BlendMode)] _BlendDst ("Blend mode Destination", Int) = 10
[Enum(Off,0,On,1)] _ZWrite("ZWrite", Int) = 0
[Enum(UnityEngine.Rendering.CompareFunction)]_ZTestMode ("ZTestMode", Float) = 4
[Enum(UnityEngine.Rendering.CullMode)]_CullMode ("CullMode", float) = 0
_AlphaClip("AlphaClip", Range(0, 1.0)) = 0.1
[Header(Custom)]
[MainTexture] _BaseMap("主贴图", 2D) = "white" {}
[HDR][MainColor] _BaseColor("主贴图颜色", Color) = (1,1,1,1)
_BaseColorScale("主贴图颜色强度", Float) = 1
_UVMoveX("主贴图 UV移动X", Float) = 0
_UVMoveY("主贴图 UV移动Y", Float) = 0
[MaterialToggle(_TEX2_ON)] _Toggle2("附加贴图 启用", Float) = 0
_BaseMap2("附加贴图", 2D) = "white" {}
[HDR] _BaseColor2("附加贴图 颜色", Color) = (1,1,1,1)
_BlendProgress("附加贴图 混合进度", Range(0, 1.0)) = 0.5
_UVMove2X("附加贴图 UV移动X", Float) = 0
_UVMove2Y("附加贴图 UV移动Y", Float) = 0
[MaterialToggle(_DISTORTION_ON)] _Toggle3("扭曲 启用", Float) = 0
_DistortionMap("扭曲贴图", 2D) = "white" {}
_DistortionMaxStrength("扭曲 强度", Float) = 0.1
_DistortionStrength("扭曲 强度", Range(-1,1)) = 0
_DistortionMoveX("扭曲 UV流动X", Float) = 1
_DistortionMoveY("扭曲 UV流动Y", Float) = 1
[MaterialToggle(_MASK_ON)] _Toggle4("Alpha遮罩 启用", Float) = 0
_MaskMap("Alpha遮罩贴图", 2D) = "white" {}
_MaskStrength("Alpha遮罩 强度", Range(0, 1.0)) = 0.1
_MaskMoveX("Alpha遮罩 UV流动X", Float) = 1
_MaskMoveY("Alpha遮罩 UV流动Y", Float) = 1
[MaterialToggle(_DISSOLVE_ON)] _Toggle5("溶解 启用", Float) = 0
_DissolveMap("溶解贴图", 2D) = "white" {}
_DissolveLength("溶解 范围", Range(0, 1.0)) = 0.1
_DissolveProgress("溶解 进度", Range(0, 1.0)) = 0
[MaterialToggle(_POLAR_ON)] _Toggle6("极坐标 启用", Float) = 0
_PolarScale("极坐标 缩放", Range(-1, 5)) = 0
[MaterialToggle(_CUSTOMDATA_ON)] _Toggle1("使用粒子 Custom Data", Float) = 0
}
SubShader
{
Tags
{
"RenderType" = "Transparent"
"Queue"="Transparent"
"PreviewType" = "Plane"
"RenderPipeline" = "UniversalPipeline"
}
Pass
{
Name "Universal Forward"
Tags
{
// none
}
Cull [_CullMode]
ZWrite [_ZWrite]
ZTest [_ZTestMode]
// BlendOp [_BlendOp]
Blend [_BlendSrc] [_BlendDst]
// AlphaToMask On
HLSLPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#pragma multi_compile _CUSTOMDATA_OFF _CUSTOMDATA_ON
#pragma multi_compile _TEX2_OFF _TEX2_ON
#pragma multi_compile _DISTORTION_OFF _DISTORTION_ON
#pragma multi_compile _MASK_OFF _MASK_ON
#pragma multi_compile _DISSOLVE_OFF _DISSOLVE_ON
#pragma multi_compile _POLAR_OFF _POLAR_ON
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
struct appdata
{
float4 positionOS : POSITION;
float4 color: COLOR;
float4 uv : TEXCOORD0;
#if _CUSTOMDATA_ON
float4 customData: TEXCOORD1;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
half4 vColor: COLOR;
half2 uv : TEXCOORD0;
#if _TEX2_ON
half2 uv2 : TEXCOORD1;
#endif
#if _DISTORTION_ON
half2 uvDistortion : TEXCOORD2;
#endif
#if _MASK_ON
half2 uvMask : TEXCOORD3;
#endif
#if _DISSOLVE_ON
half2 uvDissolve : TEXCOORD4;
half dissolveProgress : TEXCOORD5;
#endif
#if _CUSTOMDATA_ON
half4 customData: TEXCOORD6;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
#if _TEX2_ON
TEXTURE2D(_BaseMap2);
SAMPLER(sampler_BaseMap2);
#endif
#if _DISTORTION_ON
TEXTURE2D(_DistortionMap);
SAMPLER(sampler_DistortionMap);
#endif
#if _MASK_ON
TEXTURE2D(_MaskMap);
SAMPLER(sampler_MaskMap);
#endif
#if _DISSOLVE_ON
TEXTURE2D(_DissolveMap);
SAMPLER(sampler_DissolveMap);
#endif
CBUFFER_START(UnityPerMaterial)
half4 _BaseMap_ST;
half4 _BaseColor;
half _UVMoveX;
half _UVMoveY;
half _BaseColorScale;
half _AlphaClip;
#if _TEX2_ON
half4 _BaseMap2_ST;
half4 _BaseColor2;
half _BlendProgress;
half _UVMove2X;
half _UVMove2Y;
#endif
#if _DISTORTION_ON
half4 _DistortionMap_ST;
half _DistortionMaxStrength;
half _DistortionStrength;
half _DistortionMoveX;
half _DistortionMoveY;
#endif
#if _MASK_ON
half4 _MaskMap_ST;
half _MaskStrength;
half _MaskMoveX;
half _MaskMoveY;
#endif
#if _DISSOLVE_ON
half4 _DissolveMap_ST;
half _DissolveLength;
half _DissolveProgress;
#endif
#if _POLAR_ON
half _PolarScale;
#endif
CBUFFER_END
v2f vert(appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = TransformObjectToHClip(v.positionOS.xyz);
o.vColor = half4(v.color) * _BaseColor * _BaseColorScale;
half time = _TimeParameters.x;
o.uv = TRANSFORM_TEX(v.uv.xy, _BaseMap);
#if _CUSTOMDATA_ON
o.uv.x += v.customData.x;
o.uv.y += v.customData.y;
o.customData = v.customData;
#else
o.uv.x = mad(time, _UVMoveX, o.uv.x);
o.uv.y = mad(time, _UVMoveY, o.uv.y);
#endif
#if _TEX2_ON
o.uv2 = TRANSFORM_TEX(v.uv.xy, _BaseMap2);
o.uv2.x = mad(time, _UVMove2X, o.uv2.x);
o.uv2.y = mad(time, _UVMove2Y, o.uv2.y);
#endif
#if _DISTORTION_ON
o.uvDistortion = TRANSFORM_TEX(v.uv.xy, _DistortionMap);
o.uvDistortion.x = mad(time, _DistortionMoveX, o.uvDistortion.x);
o.uvDistortion.y = mad(time, _DistortionMoveY, o.uvDistortion.y);
#endif
#if _MASK_ON
o.uvMask = TRANSFORM_TEX(v.uv.xy, _MaskMap);
o.uvMask.x = mad(time, _MaskMoveX, o.uvMask.x);
o.uvMask.y = mad(time, _MaskMoveY, o.uvMask.y);
#endif
#if _DISSOLVE_ON
o.uvDissolve = TRANSFORM_TEX(v.uv.xy, _DissolveMap);
#if _CUSTOMDATA_ON
o.dissolveProgress = v.customData.z;
#else
o.dissolveProgress = _DissolveProgress;
#endif
#endif
return o;
}
half4 frag(v2f IN) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
half2 uv = IN.uv;
#if _DISTORTION_ON
half4 distortionColor = SAMPLE_TEXTURE2D(_DistortionMap, sampler_DistortionMap, IN.uvDistortion);
half2 distortion = mad(distortionColor.xy, 2.0, -1.0) * (_DistortionStrength * _DistortionMaxStrength);
uv += distortion;
#endif
#if _POLAR_ON
half2 polarUV = uv - 0.5;
half polar = length(polarUV);
half angle = atan2(polarUV.x, polarUV.y) * (0.5 / PI);
uv = half2(polar * 2.0, angle);
#if _CUSTOMDATA_ON
uv.x += IN.customData.w;
#else
uv.x += _PolarScale;
#endif
#endif
half4 col = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv);
col *= IN.vColor;
#if _TEX2_ON
half4 col2 = SAMPLE_TEXTURE2D(_BaseMap2, sampler_BaseMap2, IN.uv2);
col2 *= _BaseColor2;
col2.a *= IN.vColor.a;
col = lerp(col, col2, _BlendProgress);
#endif
#if _DISSOLVE_ON
half dissolve = SAMPLE_TEXTURE2D(_DissolveMap, sampler_DissolveMap, IN.uvDissolve).r;
half dissolveProgress = IN.dissolveProgress;
clip(dissolve - dissolveProgress);
half dissolveLength = min(_DissolveLength, dissolveProgress);
half dissolveEdge = dissolveLength + dissolveProgress;
half edgeFade = saturate((dissolve - dissolveProgress) * rcp(dissolveLength));
half isInEdge = step(dissolve, dissolveEdge);
col.a *= lerp(1.0, edgeFade, isInEdge);
#endif
#if _MASK_ON
half maskAlpha = SAMPLE_TEXTURE2D(_MaskMap, sampler_MaskMap, IN.uvMask).a;
col.a = lerp(col.a, col.a * maskAlpha, _MaskStrength);
#endif
clip(col.a - _AlphaClip);
return col;
}
ENDHLSL
}
}
}