slimecing

a fighting game featuring slimes and swords
Log | Files | Refs | README

TMP_SDF.shader (10047B)


      1 Shader "TextMeshPro/Distance Field" {
      2 
      3 Properties {
      4 	_FaceTex			("Face Texture", 2D) = "white" {}
      5 	_FaceUVSpeedX		("Face UV Speed X", Range(-5, 5)) = 0.0
      6 	_FaceUVSpeedY		("Face UV Speed Y", Range(-5, 5)) = 0.0
      7 	_FaceColor			("Face Color", Color) = (1,1,1,1)
      8 	_FaceDilate			("Face Dilate", Range(-1,1)) = 0
      9 
     10 	_OutlineColor		("Outline Color", Color) = (0,0,0,1)
     11 	_OutlineTex			("Outline Texture", 2D) = "white" {}
     12 	_OutlineUVSpeedX	("Outline UV Speed X", Range(-5, 5)) = 0.0
     13 	_OutlineUVSpeedY	("Outline UV Speed Y", Range(-5, 5)) = 0.0
     14 	_OutlineWidth		("Outline Thickness", Range(0, 1)) = 0
     15 	_OutlineSoftness	("Outline Softness", Range(-1,1)) = 0
     16 
     17 	_Bevel				("Bevel", Range(0,1)) = 0.5
     18 	_BevelOffset		("Bevel Offset", Range(-0.5,0.5)) = 0
     19 	_BevelWidth			("Bevel Width", Range(-.5,0.5)) = 0
     20 	_BevelClamp			("Bevel Clamp", Range(0,1)) = 0
     21 	_BevelRoundness		("Bevel Roundness", Range(0,1)) = 0
     22 
     23 	_LightAngle			("Light Angle", Range(0.0, 6.2831853)) = 3.1416
     24 	_SpecularColor		("Specular", Color) = (1,1,1,1)
     25 	_SpecularPower		("Specular", Range(0,4)) = 2.0
     26 	_Reflectivity		("Reflectivity", Range(5.0,15.0)) = 10
     27 	_Diffuse			("Diffuse", Range(0,1)) = 0.5
     28 	_Ambient			("Ambient", Range(1,0)) = 0.5
     29 
     30 	_BumpMap 			("Normal map", 2D) = "bump" {}
     31 	_BumpOutline		("Bump Outline", Range(0,1)) = 0
     32 	_BumpFace			("Bump Face", Range(0,1)) = 0
     33 
     34 	_ReflectFaceColor	("Reflection Color", Color) = (0,0,0,1)
     35 	_ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
     36 	_Cube 				("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
     37 	_EnvMatrixRotation	("Texture Rotation", vector) = (0, 0, 0, 0)
     38 		
     39 
     40 	_UnderlayColor		("Border Color", Color) = (0,0,0, 0.5)
     41 	_UnderlayOffsetX	("Border OffsetX", Range(-1,1)) = 0
     42 	_UnderlayOffsetY	("Border OffsetY", Range(-1,1)) = 0
     43 	_UnderlayDilate		("Border Dilate", Range(-1,1)) = 0
     44 	_UnderlaySoftness	("Border Softness", Range(0,1)) = 0
     45 
     46 	_GlowColor			("Color", Color) = (0, 1, 0, 0.5)
     47 	_GlowOffset			("Offset", Range(-1,1)) = 0
     48 	_GlowInner			("Inner", Range(0,1)) = 0.05
     49 	_GlowOuter			("Outer", Range(0,1)) = 0.05
     50 	_GlowPower			("Falloff", Range(1, 0)) = 0.75
     51 
     52 	_WeightNormal		("Weight Normal", float) = 0
     53 	_WeightBold			("Weight Bold", float) = 0.5
     54 
     55 	_ShaderFlags		("Flags", float) = 0
     56 	_ScaleRatioA		("Scale RatioA", float) = 1
     57 	_ScaleRatioB		("Scale RatioB", float) = 1
     58 	_ScaleRatioC		("Scale RatioC", float) = 1
     59 
     60 	_MainTex			("Font Atlas", 2D) = "white" {}
     61 	_TextureWidth		("Texture Width", float) = 512
     62 	_TextureHeight		("Texture Height", float) = 512
     63 	_GradientScale		("Gradient Scale", float) = 5.0
     64 	_ScaleX				("Scale X", float) = 1.0
     65 	_ScaleY				("Scale Y", float) = 1.0
     66 	_PerspectiveFilter	("Perspective Correction", Range(0, 1)) = 0.875
     67 
     68 	_VertexOffsetX		("Vertex OffsetX", float) = 0
     69 	_VertexOffsetY		("Vertex OffsetY", float) = 0
     70 	
     71 	_MaskCoord			("Mask Coordinates", vector) = (0, 0, 32767, 32767)
     72 	_ClipRect			("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
     73 	_MaskSoftnessX		("Mask SoftnessX", float) = 0
     74 	_MaskSoftnessY		("Mask SoftnessY", float) = 0
     75 
     76 	_StencilComp		("Stencil Comparison", Float) = 8
     77 	_Stencil			("Stencil ID", Float) = 0
     78 	_StencilOp			("Stencil Operation", Float) = 0
     79 	_StencilWriteMask	("Stencil Write Mask", Float) = 255
     80 	_StencilReadMask	("Stencil Read Mask", Float) = 255
     81 
     82 	_ColorMask			("Color Mask", Float) = 15
     83 }
     84 
     85 SubShader {
     86 
     87 	Tags
     88 	{
     89 		"Queue"="Transparent"
     90 		"IgnoreProjector"="True"
     91 		"RenderType"="Transparent"
     92 	}
     93 
     94 	Stencil
     95 	{
     96 		Ref [_Stencil]
     97 		Comp [_StencilComp]
     98 		Pass [_StencilOp] 
     99 		ReadMask [_StencilReadMask]
    100 		WriteMask [_StencilWriteMask]
    101 	}
    102 
    103 	Cull [_CullMode]
    104 	ZWrite Off
    105 	Lighting Off
    106 	Fog { Mode Off }
    107 	ZTest [unity_GUIZTestMode]
    108 	Blend One OneMinusSrcAlpha
    109 	ColorMask [_ColorMask]
    110 
    111 	Pass {
    112 		CGPROGRAM
    113 		#pragma target 3.0
    114 		#pragma vertex VertShader
    115 		#pragma fragment PixShader
    116 		#pragma shader_feature __ BEVEL_ON
    117 		#pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
    118 		#pragma shader_feature __ GLOW_ON
    119 
    120 		#pragma multi_compile __ UNITY_UI_CLIP_RECT
    121 		#pragma multi_compile __ UNITY_UI_ALPHACLIP
    122 
    123 
    124 		#include "UnityCG.cginc"
    125 		#include "UnityUI.cginc"
    126 		#include "TMPro_Properties.cginc"
    127 		#include "TMPro.cginc"
    128 
    129 		struct vertex_t {
    130 			float4	position		: POSITION;
    131 			float3	normal			: NORMAL;
    132 			fixed4	color			: COLOR;
    133 			float2	texcoord0		: TEXCOORD0;
    134 			float2	texcoord1		: TEXCOORD1;
    135 		};
    136 
    137 
    138 		struct pixel_t {
    139 			float4	position		: SV_POSITION;
    140 			fixed4	color			: COLOR;
    141 			float2	atlas			: TEXCOORD0;		// Atlas
    142 			float4	param			: TEXCOORD1;		// alphaClip, scale, bias, weight
    143 			float4	mask			: TEXCOORD2;		// Position in object space(xy), pixel Size(zw)
    144 			float3	viewDir			: TEXCOORD3;
    145 			
    146 		#if (UNDERLAY_ON || UNDERLAY_INNER)
    147 			float4	texcoord2		: TEXCOORD4;		// u,v, scale, bias
    148 			fixed4	underlayColor	: COLOR1;
    149 		#endif
    150 			float4 textures			: TEXCOORD5;
    151 		};
    152 
    153 		// Used by Unity internally to handle Texture Tiling and Offset.
    154 		float4 _FaceTex_ST;
    155 		float4 _OutlineTex_ST;
    156 
    157 		pixel_t VertShader(vertex_t input)
    158 		{
    159 			float bold = step(input.texcoord1.y, 0);
    160 
    161 			float4 vert = input.position;
    162 			vert.x += _VertexOffsetX;
    163 			vert.y += _VertexOffsetY;
    164 
    165 			float4 vPosition = UnityObjectToClipPos(vert);
    166 
    167 			float2 pixelSize = vPosition.w;
    168 			pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
    169 			float scale = rsqrt(dot(pixelSize, pixelSize));
    170 			scale *= abs(input.texcoord1.y) * _GradientScale * 1.5;
    171 			if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
    172 
    173 			float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
    174 			weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
    175 
    176 			float bias =(.5 - weight) + (.5 / scale);
    177 
    178 			float alphaClip = (1.0 - _OutlineWidth*_ScaleRatioA - _OutlineSoftness*_ScaleRatioA);
    179 		
    180 		#if GLOW_ON
    181 			alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB);
    182 		#endif
    183 
    184 			alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight;
    185 
    186 		#if (UNDERLAY_ON || UNDERLAY_INNER)
    187 			float4 underlayColor = _UnderlayColor;
    188 			underlayColor.rgb *= underlayColor.a;
    189 
    190 			float bScale = scale;
    191 			bScale /= 1 + ((_UnderlaySoftness*_ScaleRatioC) * bScale);
    192 			float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
    193 
    194 			float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
    195 			float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
    196 			float2 bOffset = float2(x, y);
    197 		#endif
    198 
    199 			// Generate UV for the Masking Texture
    200 			float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
    201 			float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
    202 
    203 			// Support for texture tiling and offset
    204 			float2 textureUV = UnpackUV(input.texcoord1.x);
    205 			float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
    206 			float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
    207 
    208 			pixel_t output = {
    209 				vPosition,
    210 				input.color,
    211 				input.texcoord0,
    212 				float4(alphaClip, scale, bias, weight),
    213 				half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)),
    214 				mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz),
    215 			#if (UNDERLAY_ON || UNDERLAY_INNER)
    216 				float4(input.texcoord0 + bOffset, bScale, bBias),
    217 				underlayColor,
    218 			#endif
    219 				float4(faceUV, outlineUV),
    220 			};
    221 
    222 			return output;
    223 		}
    224 
    225 
    226 		fixed4 PixShader(pixel_t input) : SV_Target
    227 		{
    228 			float c = tex2D(_MainTex, input.atlas).a;
    229 		
    230 		#ifndef UNDERLAY_ON
    231 			clip(c - input.param.x);
    232 		#endif
    233 
    234 			float	scale	= input.param.y;
    235 			float	bias	= input.param.z;
    236 			float	weight	= input.param.w;
    237 			float	sd = (bias - c) * scale;
    238 
    239 			float outline = (_OutlineWidth * _ScaleRatioA) * scale;
    240 			float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
    241 
    242 			half4 faceColor = _FaceColor;
    243 			half4 outlineColor = _OutlineColor;
    244 
    245 			faceColor.rgb *= input.color.rgb;
    246 			
    247 			faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
    248 			outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
    249 
    250 			faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
    251 
    252 		#if BEVEL_ON
    253 			float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
    254 			float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
    255 
    256 			float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
    257 			bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
    258 			n = normalize(n- bump);
    259 
    260 			float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
    261 
    262 			float3 col = GetSpecular(n, light);
    263 			faceColor.rgb += col*faceColor.a;
    264 			faceColor.rgb *= 1-(dot(n, light)*_Diffuse);
    265 			faceColor.rgb *= lerp(_Ambient, 1, n.z*n.z);
    266 
    267 			fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
    268 			faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
    269 		#endif
    270 
    271 		#if UNDERLAY_ON
    272 			float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
    273 			faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a);
    274 		#endif
    275 
    276 		#if UNDERLAY_INNER
    277 			float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
    278 			faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a);
    279 		#endif
    280 
    281 		#if GLOW_ON
    282 			float4 glowColor = GetGlowColor(sd, scale);
    283 			faceColor.rgb += glowColor.rgb * glowColor.a;
    284 		#endif
    285 
    286 		// Alternative implementation to UnityGet2DClipping with support for softness.
    287 		#if UNITY_UI_CLIP_RECT
    288 			half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
    289 			faceColor *= m.x * m.y;
    290 		#endif
    291 
    292 		#if UNITY_UI_ALPHACLIP
    293 			clip(faceColor.a - 0.001);
    294 		#endif
    295 
    296   		return faceColor * input.color.a;
    297 		}
    298 
    299 		ENDCG
    300 	}
    301 }
    302 
    303 Fallback "TextMeshPro/Mobile/Distance Field"
    304 CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
    305 }