Files
PrinceOfGlory/Assets/D5VR/Shader/VFX/Partcle_Advance.shader
kridoo 6e91a0c7f0 111
2025-09-15 17:32:08 +08:00

250 lines
9.1 KiB
GLSL

//Created by Wans Wu
//2025,04,28s
Shader "WansShader/Partcle/Advance"
{
Properties
{
[Enum(UnityEngine.Rendering.CullMode)]_CullMode("", Float) = 2.0
[Main(Base,_, off, off)] _Base ("Base", Float) = 0
[Sub(Base)]_BaseMap ("", 2D) = "white" {}
[Sub(Base)][HDR]_BaseColor("",Color) = (1,1,1,1)
[SubToggle(Base)]_MixAlpha("RGB混合Alpha",float)=0
[Main(Mask,_USEMASK_ON, off)] _Mask ("Mask", Float) = 0
[SubEnum(Mask,R,0,A,1)]_MaskChannel("",float) = 0
[Sub(Mask)]_MaskTex("",2D) = "white"{}
//[SubToggle(Mask)]_MaskU2("特效控制z",float)=0
[Sub(Mask)]_MaskMinMaxSacle("(X)(Y)(Z)",Vector)=(0,1,1,0)
[Main(Twist,_USENOISE_ON, off)] _Twist ("", Float) = 0
[Sub(Twist)]_NoiseTex("",2D) = "white"{}
[SubToggle(Twist)]_NoiseU2("w",float)=0
[Sub(Twist)]_NoiseScale("X",float) = 1
[Main(Dissolve,_USEDISSOLVE_ON, off)] _Dissolve ("", Float) = 0
[Sub(Dissolve)]_DissolveTex("",2D) = "white" {}
[SubToggle(Dissolve)]_DissolvelU2("2x",float)=0
[Sub(Dissolve)]_DissolveInt("",Range(0,1)) = 0
[Sub(Dissolve)]_DissolveHardness("",Range(0,1)) = 1
[Sub(Dissolve)]_DissolveEdg("",Range(0,1)) = 0
[Sub(Dissolve)][HDR]_DissolveColor("",Color) = (1,1,1,1)
[Main(Flow,_FLOWMAP_ON, off)] _Flow ("", Float) = 0
[Sub(Flow)]_MainMaskFlow("(xy)(zw)",Vector) = (0,0,0,0)
[Sub(Flow)]_NoiseDissFlow("(xy)(zw)",Vector) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Transparent" "RenderPipeline" = "UniversalPipeline""Queue"="Transparent+55"}
LOD 100
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
float4 _BaseMap_ST;
half _MixAlpha;
half _MaskChannel;
float4 _MaskTex_ST;
half4 _MaskMinMaxSacle;
half _MaskU2;
float4 _NoiseTex_ST;
half _NoiseScale;
half _NoiseU2;
half4 _DissolveTex_ST;
half _DissolvelU2;
half _DissolveInt;
half _DissolveHardness;
half _DissolveEdg;
half4 _DissolveColor;
half4 _MainMaskFlow;
half4 _NoiseDissFlow;
half _Alpha;
CBUFFER_END
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
#ifdef _USEMASK_ON
TEXTURE2D(_MaskTex);
SAMPLER(sampler_MaskTex);
#endif
#ifdef _USENOISE_ON
TEXTURE2D(_NoiseTex);
SAMPLER(sampler_NoiseTex);
#endif
#ifdef _USEDISSOLVE_ON
TEXTURE2D(_DissolveTex);
SAMPLER(sampler_DissolveTex);
#endif
ENDHLSL
Pass
{
Name "Forward"
Tags { "LightMode"="UniversalForward" }
Blend SrcAlpha OneMinusSrcAlpha
Cull [_CullMode]
ZWrite Off
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local _USEMASK_ON
#pragma shader_feature_local _USENOISE_ON
#pragma shader_feature_local _USEDISSOLVE_ON
#pragma shader_feature_local _FLOWMAP_ON
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma instancing_options renderinglayer
#pragma instancing_options procedural:vertInstancingSetups
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
half4 color : COLOR;
float4 uv2 : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
#if UNITY_ANY_INSTANCING_ENABLED
uint instanceID : INSTANCEID_SEMANTIC;
#endif
};
struct v2f
{
#ifdef _USEMASK_ON
float4 uv : TEXCOORD0;
#else
float2 uv : TEXCOORD0;
#endif
float4 uv2 : TEXCOORD1;
#if defined(_USENOISE_ON) || defined(_USEDISSOLVE_ON)
float4 noiseDissUV : TEXCOORD2;
#endif
#if defined(_USEDISSOLVE_ON)
float2 dissCoord : TEXCOORD3;
#endif
float4 vertex : SV_POSITION;
half4 color : COLOR;
UNITY_VERTEX_OUTPUT_STEREO
#if UNITY_ANY_INSTANCING_ENABLED
uint instanceID : INSTANCEID_SEMANTIC;
#endif
};
v2f vert (appdata v)
{
v2f o = (v2f)0;
//UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = TransformObjectToHClip(v.vertex.xyz);
#ifdef _FLOWMAP_ON
float2 mainFlow = float2(_MainMaskFlow.x,_MainMaskFlow.y)*_Time.y;
float2 maskFlow = float2(_MainMaskFlow.z,_MainMaskFlow.w)*_Time.y;
float2 noiseFlow = float2(_NoiseDissFlow.x,_NoiseDissFlow.y)*_Time.y;
float2 dissFlow = float2(_NoiseDissFlow.z,_NoiseDissFlow.w)*_Time.y;
#endif
o.uv2 = v.uv2;
//o.uv.xy = TRANSFORM_TEX(v.uv, _BaseMap);
o.uv.xy = v.uv;
#ifdef _FLOWMAP_ON
o.uv.xy += mainFlow;
#endif
#ifdef _USEMASK_ON
o.uv.zw = TRANSFORM_TEX(v.uv +_MaskTex_ST.xy + _MaskTex_ST.zw, _MaskTex);
#ifdef _FLOWMAP_ON
o.uv.zw += maskFlow;
#endif
#endif
#if defined(_USENOISE_ON) || defined(_USEDISSOLVE_ON)
o.noiseDissUV = float4(1,1,1,1);
#endif
#ifdef _USENOISE_ON
o.noiseDissUV.xy = TRANSFORM_TEX(v.uv,_NoiseTex);
#ifdef _FLOWMAP_ON
o.noiseDissUV.xy += noiseFlow;
#endif
#endif
#ifdef _USEDISSOLVE_ON
half hard = _DissolveHardness*0.99f;//防止1-导致分母为0
half edg = _DissolveEdg + 1;
_DissolveInt = lerp(_DissolveInt,o.uv2.z,_DissolvelU2);
_DissolveInt = 1 - _DissolveInt;
o.dissCoord.x = (_DissolveInt * edg + 1 - hard)*(2-hard) - edg;
o.dissCoord.y = _DissolveInt * edg*(2-hard)-1;
o.noiseDissUV.zw = TRANSFORM_TEX(v.uv,_DissolveTex);
#ifdef _FLOWMAP_ON
o.noiseDissUV.zw += dissFlow;
#endif
#endif
o.color = v.color;
return o;
}
half4 frag (v2f i) : SV_Target
{
//UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
float2 mainUV = i.uv.xy;
#ifdef _USENOISE_ON
half4 noiseTex = SAMPLE_TEXTURE2D(_NoiseTex,sampler_NoiseTex,i.noiseDissUV.xy);
half noise = (noiseTex.r);
_NoiseScale = lerp(_NoiseScale,i.uv2.y,_NoiseU2);
mainUV += noiseTex.r*_NoiseScale;
#endif
float4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, mainUV);
float4 col = baseMap *_BaseColor * i.color;
#ifdef _USEMASK_ON
half4 maskTex = SAMPLE_TEXTURE2D(_MaskTex,sampler_MaskTex,i.uv.zw);
half mask = maskTex.r*(1-_MaskChannel)+maskTex.a*(_MaskChannel);
//_MaskScale = lerp(_MaskScale,i.uv2.x,_MaskU2);
mask = lerp(0,mask,_MaskMinMaxSacle.z);
mask = smoothstep(_MaskMinMaxSacle.x,_MaskMinMaxSacle.y,mask);
col *= mask;
#endif
#ifdef _USEDISSOLVE_ON
half4 dissTex = SAMPLE_TEXTURE2D(_DissolveTex,sampler_DissolveTex,i.noiseDissUV.zw);
half dissMask = pow(dissTex.r,1/2.2f);
half hard = _DissolveHardness * 0.99f;//防止1-导致分母为0
half dissColorLerp = saturate((dissMask + i.dissCoord.x) / (1-hard));
col.rgb = lerp(_DissolveColor,col.rgb,dissColorLerp);
half dissAlpha = saturate((dissMask + i.dissCoord.y) / (1-hard));
col.a *= dissAlpha;
#endif
half mixAlpha = lerp(1,baseMap.r,_MixAlpha);
col.a *= mixAlpha ;
return half4(col.rgb* (1 - _Alpha) ,saturate(col.a ));
}
ENDHLSL
}
}
FallBack "Hidden/Universal Render Pipeline/FallbackError"
CustomEditor "LWGUI.LWGUI"
}