127 lines
3.0 KiB
Plaintext
127 lines
3.0 KiB
Plaintext
|
// Simplified SDF shader:
|
||
|
// - No Shading Option (bevel / bump / env map)
|
||
|
// - No Glow Option
|
||
|
// - Softness is applied on both side of the outline
|
||
|
|
||
|
Shader "Hidden/TextMeshPro/Internal/Distance Field SSD" {
|
||
|
|
||
|
Properties {
|
||
|
_FaceColor ("Face Color", Color) = (1,1,1,1)
|
||
|
_FaceDilate ("Face Dilate", Range(-1,1)) = 0
|
||
|
|
||
|
_OutlineSoftness ("Outline Softness", Range(0,1)) = 0.02
|
||
|
|
||
|
_WeightNormal ("Weight Normal", float) = 0
|
||
|
_WeightBold ("Weight Bold", float) = .5
|
||
|
|
||
|
_MainTex ("Font Atlas", 2D) = "white" {}
|
||
|
_TextureWidth ("Texture Width", float) = 512
|
||
|
_TextureHeight ("Texture Height", float) = 512
|
||
|
_GradientScale ("Gradient Scale", float) = 5
|
||
|
_ScaleX ("Scale X", float) = 1
|
||
|
_ScaleY ("Scale Y", float) = 1
|
||
|
_Sharpness ("Sharpness", Range(-1,1)) = 0
|
||
|
|
||
|
_VertexOffsetX ("Vertex OffsetX", float) = 0
|
||
|
_VertexOffsetY ("Vertex OffsetY", float) = 0
|
||
|
|
||
|
_ColorMask ("Color Mask", Float) = 15
|
||
|
}
|
||
|
|
||
|
SubShader {
|
||
|
Tags
|
||
|
{
|
||
|
"ForceSupported" = "True"
|
||
|
}
|
||
|
|
||
|
Lighting Off
|
||
|
Blend One OneMinusSrcAlpha
|
||
|
Cull Off
|
||
|
ZWrite Off
|
||
|
ZTest Always
|
||
|
|
||
|
Pass {
|
||
|
CGPROGRAM
|
||
|
#pragma vertex VertShader
|
||
|
#pragma fragment PixShader
|
||
|
|
||
|
#include "UnityCG.cginc"
|
||
|
#include "TMP_Properties.cginc"
|
||
|
|
||
|
sampler2D _GUIClipTexture;
|
||
|
uniform float4x4 unity_GUIClipTextureMatrix;
|
||
|
|
||
|
struct vertex_t {
|
||
|
float4 vertex : POSITION;
|
||
|
float3 normal : NORMAL;
|
||
|
fixed4 color : COLOR;
|
||
|
float2 texcoord0 : TEXCOORD0;
|
||
|
float2 texcoord1 : TEXCOORD1;
|
||
|
};
|
||
|
|
||
|
struct pixel_t {
|
||
|
float4 vertex : SV_POSITION;
|
||
|
fixed4 faceColor : COLOR;
|
||
|
float2 texcoord0 : TEXCOORD0;
|
||
|
float2 clipUV : TEXCOORD1;
|
||
|
};
|
||
|
|
||
|
|
||
|
pixel_t VertShader(vertex_t input)
|
||
|
{
|
||
|
// Does not handle simulated bold correctly.
|
||
|
|
||
|
float4 vert = input.vertex;
|
||
|
vert.x += _VertexOffsetX;
|
||
|
vert.y += _VertexOffsetY;
|
||
|
float4 vPosition = UnityObjectToClipPos(vert);
|
||
|
|
||
|
float opacity = input.color.a;
|
||
|
|
||
|
fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
|
||
|
faceColor.rgb *= faceColor.a;
|
||
|
|
||
|
// Generate UV for the Clip Texture
|
||
|
float3 eyePos = UnityObjectToViewPos(input.vertex);
|
||
|
float2 clipUV = mul(unity_GUIClipTextureMatrix, float4(eyePos.xy, 0, 1.0));
|
||
|
|
||
|
// Structure for pixel shader
|
||
|
pixel_t output = {
|
||
|
vPosition,
|
||
|
faceColor,
|
||
|
float2(input.texcoord0.x, input.texcoord0.y),
|
||
|
clipUV,
|
||
|
};
|
||
|
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
half transition(half2 range, half distance)
|
||
|
{
|
||
|
return smoothstep(range.x, range.y, distance);
|
||
|
}
|
||
|
|
||
|
// PIXEL SHADER
|
||
|
fixed4 PixShader(pixel_t input) : SV_Target
|
||
|
{
|
||
|
half distanceSample = tex2D(_MainTex, input.texcoord0).a;
|
||
|
half smoothing = fwidth(distanceSample) * (1 - _Sharpness) + _OutlineSoftness;
|
||
|
half contour = 0.5 - _FaceDilate * 0.5;
|
||
|
half2 edgeRange = half2(contour - smoothing, contour + smoothing);
|
||
|
|
||
|
half4 c = input.faceColor;
|
||
|
|
||
|
half edgeTransition = transition(edgeRange, distanceSample);
|
||
|
c *= edgeTransition;
|
||
|
|
||
|
c *= tex2D(_GUIClipTexture, input.clipUV).a;
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
ENDCG
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
|
||
|
}
|