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