250 lines
9.1 KiB
GLSL
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"
|
|
}
|