| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | Shader "KriptoFX/BFX/BFX_Decal"{	Properties	{		[HDR] _TintColor("Tint Color", Color) = (1,1,1,1)		_MainTex("NormalAlpha", 2D) = "white" {}		_LookupFade("Lookup Fade Texture", 2D) = "white" {}		_Cutout("Cutout", Range(0, 1)) = 1		_CutoutTex("CutoutDepth(XZ)", 2D) = "white" {}	[Space]		_SunPos("Sun Pos", Vector) = (1, 0.5, 1, 0)		//[Toggle(CLAMP_SIDE_SURFACE)] _ClampSideSurface("Clamp side surface", Int) = 0	}	SubShader	{		Tags{ "Queue" = "AlphaTest"}		Blend DstColor SrcColor		//Blend SrcAlpha OneMinusSrcAlpha		Cull Front		ZTest Always		ZWrite Off		Pass		{			CGPROGRAM				#pragma vertex vert				#pragma fragment frag				#pragma multi_compile_fog				#pragma multi_compile_instancing				#pragma multi_compile _ USE_CUSTOM_DECAL_LAYERS				#pragma shader_feature CLAMP_SIDE_SURFACE				#pragma multi_compile _ USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE				#include "UnityCG.cginc"				sampler2D _MainTex;				sampler2D _Flowmap;				sampler2D _LookupFade;				sampler2D _CutoutTex;				float4 _MainTex_ST;				float4 _MainTex_NextFrame;				float4 _CutoutTex_ST;				UNITY_INSTANCING_BUFFER_START(Props)					UNITY_DEFINE_INSTANCED_PROP(half4, _TintColor)					UNITY_DEFINE_INSTANCED_PROP(half, _Cutout)					UNITY_DEFINE_INSTANCED_PROP(float, _LightIntencity)				UNITY_INSTANCING_BUFFER_END(Props)				half4 _CutoutColor;				half4 _FresnelColor;				half4 _DistortionSpeedScale;				UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture);				UNITY_DECLARE_DEPTH_TEXTURE(_LayerDecalDepthTexture);				half InterpolationValue;				half _AlphaPow;				half _DistortSpeed;				half _DistortScale;				float4 _SunPos;				half _DepthMul;				half3 _DecalForwardDir;				struct appdata_t {					float4 vertex : POSITION;					float4 normal : NORMAL;					half4 color : COLOR;					UNITY_VERTEX_INPUT_INSTANCE_ID				};				struct v2f {					float4 vertex : SV_POSITION;					half4 color : COLOR;					float4 screenUV : TEXCOORD0;					float4 ray : TEXCOORD1;					float3 rayCameraOffset : TEXCOORD2;					float3 viewDir : TEXCOORD3;					float4 screenPos : TEXCOORD4;					UNITY_FOG_COORDS(5)					UNITY_VERTEX_INPUT_INSTANCE_ID					UNITY_VERTEX_OUTPUT_STEREO				};				v2f vert(appdata_t v)				{					v2f o;					UNITY_SETUP_INSTANCE_ID(v);					UNITY_TRANSFER_INSTANCE_ID(v, o);					UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);					o.vertex = UnityObjectToClipPos(v.vertex);					o.color = v.color;					o.screenUV = ComputeScreenPos(o.vertex);					o.viewDir = normalize(ObjSpaceViewDir(v.vertex));					o.screenPos = ComputeGrabScreenPos(o.vertex);					UNITY_TRANSFER_FOG(o,o.vertex);					float3 viewRay = UnityObjectToViewPos(v.vertex).xyz;					o.ray.w = viewRay.z;					viewRay *= -1;					o.ray.xyz = mul((float3x3)mul(unity_WorldToObject, UNITY_MATRIX_I_V), viewRay);					o.rayCameraOffset = mul(mul(unity_WorldToObject, UNITY_MATRIX_I_V), float4(0, 0, 0, 1)).xyz;					return o;				}				half4 frag(v2f i) : SV_Target				{					UNITY_SETUP_INSTANCE_ID(i);#if USE_CUSTOM_DECAL_LAYERS					float depth = SAMPLE_DEPTH_TEXTURE(_LayerDecalDepthTexture, (i.screenUV.xy / i.screenUV.w));					float depthMask = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, (i.screenUV.xy / i.screenUV.w));					float fade = depth < depthMask - 0.0005 ? 0 : 1;	#if USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE						fade = 1 - fade;						depth = depthMask;	#endif#else					float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, (i.screenUV.xy / i.screenUV.w));#endif					i.ray /= i.ray.w;					float zEye = LinearEyeDepth(depth);					float3 decalSpaceScenePos = i.rayCameraOffset + i.ray.xyz * zEye;					float3 stepVal = saturate((0.5 - abs(decalSpaceScenePos.xyz)) * 10000);					half lookupHeight = tex2D(_LookupFade, float2(decalSpaceScenePos.y + 0.5, 0));					float projClipFade = stepVal.x * stepVal.y * stepVal.z * lookupHeight;#if USE_CUSTOM_DECAL_LAYERS					projClipFade *= fade;#endif#if CLAMP_SIDE_SURFACE#ifdef UNITY_UV_STARTS_AT_TOP					half3 n = normalize(cross(ddx(decalSpaceScenePos), ddy(decalSpaceScenePos) * _ProjectionParams.x));#else					half3 n = normalize(cross(ddx(decalSpaceScenePos), -ddy(decalSpaceScenePos) * _ProjectionParams.x));#endif					half angle = abs(dot(n, _DecalForwardDir));					angle = angle > 0.1 ? 1 : 0;					projClipFade *= angle;					//return float4(saturate(angle), 0, 0, 1);#endif					float2 uv = decalSpaceScenePos.xz + 0.5;					float2 uvMain = uv * _MainTex_ST.xy + _MainTex_ST.zw;					float2 uvCutout = (decalSpaceScenePos.xz + 0.5) * _CutoutTex_ST.xy + _CutoutTex_ST.zw;					half4 normAlpha = tex2D(_MainTex, uvMain);					half4 res = 0;					res.a = saturate(normAlpha.w * 2);					if (res.a < 0.1 || projClipFade < 0.1) discard;					normAlpha.xy = normAlpha.xy * 2 - 1;					float3 normal = normalize(float3(normAlpha.x, 1, normAlpha.y));					half3 mask = tex2D(_CutoutTex, uvCutout).xyz;					half cutout = 0.5 + UNITY_ACCESS_INSTANCED_PROP(Props, _Cutout) * i.color.a * 0.5;					half alphaMask = saturate((mask.r - (cutout * 2 - 1)) * 20) * res.a;					half colorMask = saturate((mask.r - (cutout * 2 - 1)) * 5) * res.a;					res.a = alphaMask;					res.a = saturate(res.a * projClipFade);					float intencity = UNITY_ACCESS_INSTANCED_PROP(Props, _LightIntencity);					float light = max(0.001, dot(normal, normalize(_SunPos.xyz)));					light = pow(light, 150) * 3 * intencity;					light *= (1 - mask.z * colorMask);					float4 tintColor = UNITY_ACCESS_INSTANCED_PROP(Props, _TintColor);					#if !UNITY_COLORSPACE_GAMMA							tintColor = tintColor * 1.35;					#endif					res.rgb = lerp(tintColor.rgb, tintColor.rgb * 0.25, mask.z * colorMask) + light;					half fresnel = (1 - dot(normal, normalize(i.viewDir)));					fresnel = pow(fresnel + 0.1, 5);					UNITY_APPLY_FOG_COLOR(i.fogCoord, res, half4(1, 1, 1, 1));					return lerp(0.5, res, res.a * tintColor.a);					return res;				}			ENDCG	}	}}
 |