373 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //--------------------------------------------------------------------------------------------------------------------------------
 | |
| // Cartoon FX
 | |
| // (c) 2012-2020 Jean Moreno
 | |
| //--------------------------------------------------------------------------------------------------------------------------------
 | |
| 
 | |
| Shader "Cartoon FX/Remaster/Particle Procedural Glow"
 | |
| {
 | |
| 	Properties
 | |
| 	{
 | |
| 	//# Blending
 | |
| 	//#
 | |
| 
 | |
| 		[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Blend Source", Float) = 5
 | |
| 		[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Blend Destination", Float) = 10
 | |
| 	
 | |
| 	//# --------------------------------------------------------
 | |
| 
 | |
| 		[Toggle(_CFXR_DISSOLVE)] _UseDissolve ("Enable Dissolve", Float) = 0
 | |
| 	//# IF_KEYWORD _CFXR_DISSOLVE
 | |
| 		[NoScaleOffset] _DissolveTex ("Dissolve Texture", 2D) = "gray" {}
 | |
| 		_DissolveSmooth ("Dissolve Smoothing", Range(0.0001,0.5)) = 0.1
 | |
| 		[ToggleNoKeyword] _InvertDissolveTex ("Invert Dissolve Texture", Float) = 0
 | |
| 	//# END_IF
 | |
| 
 | |
| 	//# --------------------------------------------------------
 | |
| 
 | |
| 	//# Procedural Circle
 | |
| 	//#
 | |
| 
 | |
| 		[KeywordEnum(P0, P2, P4, P8)] _CFXR_GLOW_POW ("Apply Power of", Float) = 0
 | |
| 		_GlowMin ("Circle Min", Float) = 0
 | |
| 		_GlowMax ("Circle Max", Float) = 1
 | |
| 	//#
 | |
| 		_MaxValue ("Max Value", Float) = 10
 | |
| 
 | |
| 	//# --------------------------------------------------------
 | |
| 
 | |
| 		[Toggle(_CFXR_HDR_BOOST)] _HdrBoost ("Enable HDR Multiplier", Float) = 0
 | |
| 	//# IF_KEYWORD _CFXR_HDR_BOOST
 | |
| 		_HdrMultiply ("HDR Multiplier", Float) = 2
 | |
| 	//# END_IF
 | |
| 
 | |
| 	//# --------------------------------------------------------
 | |
| 	
 | |
| 		[Toggle(_FADING_ON)] _UseSP ("Soft Particles", Float) = 0
 | |
| 	//# IF_KEYWORD _FADING_ON
 | |
| 		_SoftParticlesFadeDistanceNear ("Near Fade", Float) = 0
 | |
| 		_SoftParticlesFadeDistanceFar ("Far Fade", Float) = 1
 | |
| 	//# END_IF
 | |
| 
 | |
| 	//# ========================================================
 | |
| 	//# Shadows
 | |
| 	//#
 | |
| 
 | |
| 		[KeywordEnumOff(Off,On,CustomTexture)] _CFXR_DITHERED_SHADOWS ("Dithered Shadows", Float) = 0
 | |
| 	//# IF_KEYWORD _CFXR_DITHERED_SHADOWS_ON || _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 		_ShadowStrength		("Shadows Strength Max", Range(0,1)) = 1.0
 | |
| 		//#	IF_KEYWORD _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 		_DitherCustom		("Dithering 3D Texture", 3D) = "black" {}
 | |
| 		//#	END_IF
 | |
| 	//# END_IF
 | |
| 	}
 | |
| 	
 | |
| 	Category
 | |
| 	{
 | |
| 		Tags
 | |
| 		{
 | |
| 			"Queue"="Transparent"
 | |
| 			"IgnoreProjector"="True"
 | |
| 			"RenderType"="Transparent"
 | |
| 			"PreviewType"="Plane"
 | |
| 		}
 | |
| 		Blend [_SrcBlend] [_DstBlend], One One
 | |
| 		Cull  Off
 | |
| 		ZWrite Off
 | |
| 
 | |
| 		//================================================================================================================================
 | |
| 		// Includes & Code
 | |
| 
 | |
| 		CGINCLUDE
 | |
| 
 | |
| 			#include "UnityCG.cginc"
 | |
| 			#include "UnityStandardUtils.cginc"
 | |
| 
 | |
| 			CBUFFER_START(UnityPerMaterial)
 | |
| 
 | |
| 			half _GlowMin;
 | |
| 			half _GlowMax;
 | |
| 			half _MaxValue;
 | |
| 
 | |
| 			sampler2D _DissolveTex;
 | |
| 			half _InvertDissolveTex;
 | |
| 			half _DissolveSmooth;
 | |
| 
 | |
| 			half _HdrMultiply;
 | |
| 
 | |
| 			half _Cutoff;
 | |
| 
 | |
| 			UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);
 | |
| 			half _SoftParticlesFadeDistanceNear;
 | |
| 			half _SoftParticlesFadeDistanceFar;
 | |
| 			half _EdgeFadePow;
 | |
| 
 | |
| 			float _ShadowStrength;
 | |
| 			sampler3D _DitherMaskLOD;
 | |
| 			sampler3D _DitherCustom;
 | |
| 			float4 _DitherCustom_TexelSize;
 | |
| 
 | |
| 			CBUFFER_END
 | |
| 
 | |
| 			// --------------------------------
 | |
| 			// Input/output
 | |
| 
 | |
| 			struct appdata
 | |
| 			{
 | |
| 				float4 vertex		: POSITION;
 | |
| 				half4 color			: COLOR;
 | |
| 				float4 texcoord		: TEXCOORD0;	//xy = uv, zw = random
 | |
| 				float4 texcoord1	: TEXCOORD1;	//additional particle data: x = dissolve
 | |
| 		#if PASS_SHADOW_CASTER
 | |
| 				float3 normal : NORMAL;
 | |
| 		#endif
 | |
| 			};
 | |
| 
 | |
| 			// vertex to fragment
 | |
| 			struct v2f
 | |
| 			{
 | |
| 				float4 pos				: SV_POSITION;
 | |
| 				half4 color				: COLOR;
 | |
| 				float4 uv_random		: TEXCOORD0;	//uv + particle data
 | |
| 				float4 custom1			: TEXCOORD1;	//additional particle data
 | |
| 		#if (defined(SOFTPARTICLES_ON) && defined(_FADING_ON))
 | |
| 				float4 projPos			: TEXCOORD2;
 | |
| 		#endif
 | |
| 				UNITY_FOG_COORDS(5)		//note: does nothing if fog is not enabled
 | |
| 			};
 | |
| 
 | |
| 			// vertex to fragment (shadow caster)
 | |
| 			struct v2f_shadowCaster
 | |
| 			{
 | |
| 				V2F_SHADOW_CASTER_NOPOS
 | |
| 				half4 color				: COLOR;
 | |
| 				float4 uv_random		: TEXCOORD1;	//uv + particle data
 | |
| 				float4 custom1			: TEXCOORD2;	//additional particle data
 | |
| 			};
 | |
| 
 | |
| 			// --------------------------------
 | |
| 
 | |
| 			#include "CFXR.cginc"
 | |
| 
 | |
| 			// --------------------------------
 | |
| 			// Vertex
 | |
| 		#if PASS_SHADOW_CASTER
 | |
| 			void vertex_program (appdata v, out v2f_shadowCaster o, out float4 opos : SV_POSITION)
 | |
| 		#else
 | |
| 			v2f vertex_program (appdata v)
 | |
| 		#endif
 | |
| 			{
 | |
| 		#if !PASS_SHADOW_CASTER
 | |
| 				v2f o;
 | |
| 				o.pos = UnityObjectToClipPos(v.vertex);
 | |
| 		#endif
 | |
| 
 | |
| 				o.color = v.color;
 | |
| 				o.uv_random = v.texcoord;
 | |
| 				o.custom1 = v.texcoord1;
 | |
| 
 | |
| 		#if PASS_SHADOW_CASTER
 | |
| 				vert(v, o, opos);
 | |
| 		#else
 | |
| 				return vert(v, o);
 | |
| 		#endif
 | |
| 			}
 | |
| 
 | |
| 			// --------------------------------
 | |
| 			// Fragment
 | |
| 		#if PASS_SHADOW_CASTER
 | |
| 			float4 fragment_program (v2f_shadowCaster i, UNITY_VPOS_TYPE vpos : VPOS) : SV_Target
 | |
| 		#else
 | |
| 			half4 fragment_program (v2f i) : SV_Target
 | |
| 		#endif
 | |
| 			{
 | |
| 				// ================================================================
 | |
| 				// Color & Alpha
 | |
| 
 | |
| 				//--------------------------------
 | |
| 				// procedural glow
 | |
| 				float2 uvm = i.uv_random.xy - 0.5;
 | |
| 				half glow = saturate(1 - ((dot(uvm, uvm) * 4)));
 | |
| 			#if _CFXR_GLOW_POW_P2
 | |
| 				glow = pow(glow, 2);
 | |
| 			#elif _CFXR_GLOW_POW_P4
 | |
| 				glow = pow(glow, 4);
 | |
| 			#elif _CFXR_GLOW_POW_P8
 | |
| 				glow = pow(glow, 8);
 | |
| 			#endif
 | |
| 				glow = clamp(lerp(_GlowMin, _GlowMax, glow), 0, _MaxValue) * saturate(glow * 30);
 | |
| 				half4 mainTex = half4(1, 1, 1, glow);
 | |
| 				//--------------------------------
 | |
| 					
 | |
| 			#if _CFXR_HDR_BOOST
 | |
| 				#ifdef UNITY_COLORSPACE_GAMMA
 | |
| 					_HdrMultiply = LinearToGammaSpaceApprox(_HdrMultiply);
 | |
| 				#endif
 | |
| 				mainTex.rgb *= _HdrMultiply * GLOBAL_HDR_MULTIPLIER;
 | |
| 			#endif
 | |
| 					
 | |
| 				half3 particleColor = mainTex.rgb * i.color.rgb;
 | |
| 				half particleAlpha = mainTex.a * i.color.a;
 | |
| 
 | |
| 				// ================================================================
 | |
| 				// Dissolve
 | |
| 
 | |
| 			#if _CFXR_DISSOLVE
 | |
| 				half dissolveTex = tex2D(_DissolveTex, i.uv_random.xy).r;
 | |
| 				dissolveTex = _InvertDissolveTex <= 0 ? 1 - dissolveTex : dissolveTex;
 | |
| 				half dissolveTime = i.custom1.x;
 | |
| 			#else
 | |
| 				half dissolveTex = 0;
 | |
| 				half dissolveTime = 0;
 | |
| 			#endif
 | |
| 
 | |
| 				// ================================================================
 | |
| 				//
 | |
| 
 | |
| 			#if PASS_SHADOW_CASTER
 | |
| 				return frag(i, vpos, particleColor, particleAlpha, dissolveTex, dissolveTime);
 | |
| 			#else
 | |
| 				return frag(i, particleColor, particleAlpha, dissolveTex, dissolveTime);
 | |
| 			#endif
 | |
| 			}
 | |
| 
 | |
| 		ENDCG
 | |
| 
 | |
| 		//====================================================================================================================================
 | |
| 		// Universal Rendering Pipeline
 | |
| 
 | |
| 		SubShader
 | |
| 		{
 | |
| 			Pass
 | |
| 			{
 | |
| 				Name "BASE"
 | |
| 				Tags { "LightMode"="UniversalForward" }
 | |
| 
 | |
| 				CGPROGRAM
 | |
| 
 | |
| 				#pragma vertex vertex_program
 | |
| 				#pragma fragment fragment_program
 | |
| 				
 | |
| 				#pragma target 2.0
 | |
| 				
 | |
| 				#pragma multi_compile_particles
 | |
| 				#pragma multi_compile_fog
 | |
| 				
 | |
| 				#pragma shader_feature _ _CFXR_GLOW_POW_P2 _CFXR_GLOW_POW_P4 _CFXR_GLOW_POW_P8
 | |
| 				#pragma shader_feature _ _CFXR_HDR_BOOST
 | |
| 				#pragma shader_feature _ _CFXR_DISSOLVE
 | |
| 
 | |
| 				#pragma shader_feature _FADING_ON
 | |
| 				#pragma shader_feature _ _ALPHATEST_ON
 | |
| 				#pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON _CFXR_ADDITIVE
 | |
| 
 | |
| 				ENDCG
 | |
| 			}
 | |
| 
 | |
| 			//--------------------------------------------------------------------------------------------------------------------------------
 | |
| 
 | |
| 			Pass
 | |
| 			{
 | |
| 				Name "ShadowCaster"
 | |
| 				Tags { "LightMode" = "ShadowCaster" }
 | |
| 
 | |
| 				BlendOp Add
 | |
| 				Blend One Zero
 | |
| 				ZWrite On
 | |
| 				Cull Off
 | |
| 			
 | |
| 				CGPROGRAM
 | |
| 
 | |
| 				#pragma multi_compile PASS_SHADOW_CASTER
 | |
| 
 | |
| 				#pragma vertex vertex_program
 | |
| 				#pragma fragment fragment_program
 | |
| 
 | |
| 				#pragma shader_feature _ _CFXR_GLOW_POW_P2 _CFXR_GLOW_POW_P4 _CFXR_GLOW_POW_P8
 | |
| 				#pragma shader_feature _ _CFXR_DISSOLVE
 | |
| 
 | |
| 				#pragma shader_feature _FADING_ON
 | |
| 				#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
 | |
| 
 | |
| 				#pragma multi_compile_shadowcaster
 | |
| 				#pragma shader_feature _ _CFXR_DITHERED_SHADOWS_ON _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 
 | |
| 			#if _CFXR_DITHERED_SHADOWS_ON || _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 				#pragma target 3.0		//needed for VPOS
 | |
| 			#endif
 | |
| 
 | |
| 				ENDCG
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		//====================================================================================================================================
 | |
| 		// Built-in Rendering Pipeline
 | |
| 
 | |
| 		SubShader
 | |
| 		{
 | |
| 			Pass
 | |
| 			{
 | |
| 				Name "BASE"
 | |
| 				Tags { "LightMode"="ForwardBase" }
 | |
| 
 | |
| 				CGPROGRAM
 | |
| 
 | |
| 				#pragma vertex vertex_program
 | |
| 				#pragma fragment fragment_program
 | |
| 				
 | |
| 				#pragma target 2.0
 | |
| 				
 | |
| 				#pragma multi_compile_particles
 | |
| 				#pragma multi_compile_fog
 | |
| 				
 | |
| 				#pragma shader_feature _ _CFXR_GLOW_POW_P2 _CFXR_GLOW_POW_P4 _CFXR_GLOW_POW_P8
 | |
| 				#pragma shader_feature _ _CFXR_HDR_BOOST
 | |
| 				#pragma shader_feature _ _CFXR_DISSOLVE
 | |
| 
 | |
| 				#pragma shader_feature _FADING_ON
 | |
| 				#pragma shader_feature _ _ALPHATEST_ON
 | |
| 				#pragma shader_feature _ _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON _CFXR_ADDITIVE
 | |
| 
 | |
| 				ENDCG
 | |
| 			}
 | |
| 
 | |
| 			//--------------------------------------------------------------------------------------------------------------------------------
 | |
| 
 | |
| 			Pass
 | |
| 			{
 | |
| 				Name "ShadowCaster"
 | |
| 				Tags { "LightMode" = "ShadowCaster" }
 | |
| 
 | |
| 				BlendOp Add
 | |
| 				Blend One Zero
 | |
| 				ZWrite On
 | |
| 				Cull Off
 | |
| 			
 | |
| 				CGPROGRAM
 | |
| 
 | |
| 				#pragma multi_compile PASS_SHADOW_CASTER
 | |
| 
 | |
| 				#pragma vertex vertex_program
 | |
| 				#pragma fragment fragment_program
 | |
| 
 | |
| 				#pragma shader_feature _ _CFXR_GLOW_POW_P2 _CFXR_GLOW_POW_P4 _CFXR_GLOW_POW_P8
 | |
| 				#pragma shader_feature _ _CFXR_DISSOLVE
 | |
| 
 | |
| 				#pragma shader_feature _FADING_ON
 | |
| 				#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
 | |
| 
 | |
| 				#pragma multi_compile_shadowcaster
 | |
| 				#pragma shader_feature _ _CFXR_DITHERED_SHADOWS_ON _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 
 | |
| 			#if _CFXR_DITHERED_SHADOWS_ON || _CFXR_DITHERED_SHADOWS_CUSTOMTEXTURE
 | |
| 				#pragma target 3.0		//needed for VPOS
 | |
| 			#endif
 | |
| 
 | |
| 				ENDCG
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	CustomEditor "CartoonFX.MaterialInspector"
 | |
| }
 | |
| 
 | 
