Cutout shader in order to get depth and shadows

I’m using textmesh pro also ingame and I’m getting ugly post processing effects on the gui because of missing depth information. Is there a working cutout shader for the signed distance fields out there? I found this thread: http://digitalnativestudios.com/forum/index.php?topic=506.msg3800#msg3800 but the solution proposed there doesn’t work anymore, since all shaders are now vertex fragment shaders.

There hasn’t been any fundamental changes to the surface shaders which would prevent this previous user implementation to work.

Hi Stephan,

thanks for the quick reply. I somehow missed the surface shaders in the plugin. Then it should indeed be no problem. Thanks a lot, I’ll post the modified shader once finished :slight_smile:

Edit: Alrighty, that was actually really easy. Here is the modified shader for mobile surface:

// Simplified version of the SDF Surface shader :
// - No support for Bevel, Bump or envmap
// - Diffuse only lighting
// - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH.

Shader "TextMeshPro/Mobile/Distance Field (Cutout)" {

Properties {
    _FaceTex            ("Fill Texture", 2D) = "white" {}
    _FaceColor            ("Fill Color", Color) = (1,1,1,1)
    _FaceDilate            ("Face Dilate", Range(-1,1)) = 0

    _OutlineColor        ("Outline Color", Color) = (0,0,0,1)
    _OutlineTex            ("Outline Texture", 2D) = "white" {}
    _OutlineWidth        ("Outline Thickness", Range(0, 1)) = 0
    _OutlineSoftness        ("Outline Softness", Range(0,1)) = 0

    _GlowColor            ("Color", Color) = (0, 1, 0, 0.5)
    _GlowOffset            ("Offset", Range(-1,1)) = 0
    _GlowInner            ("Inner", Range(0,1)) = 0.05
    _GlowOuter            ("Outer", Range(0,1)) = 0.05
    _GlowPower            ("Falloff", Range(1, 0)) = 0.75

    _WeightNormal        ("Weight Normal", float) = 0
    _WeightBold            ("Weight Bold", float) = 0.5

    // Should not be directly exposed to the user
    _ShaderFlags        ("Flags", float) = 0
    _ScaleRatioA        ("Scale RatioA", float) = 1
    _ScaleRatioB        ("Scale RatioB", float) = 1
    _ScaleRatioC        ("Scale RatioC", float) = 1

    _MainTex            ("Font Atlas", 2D) = "white" {}
    _TextureWidth        ("Texture Width", float) = 512
    _TextureHeight        ("Texture Height", float) = 512
    _GradientScale        ("Gradient Scale", float) = 5.0
    _ScaleX                ("Scale X", float) = 1.0
    _ScaleY                ("Scale Y", float) = 1.0
    _PerspectiveFilter    ("Perspective Correction", Range(0, 1)) = 0.875

    _VertexOffsetX        ("Vertex OffsetX", float) = 0
    _VertexOffsetY        ("Vertex OffsetY", float) = 0
   
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
   
    //_MaskCoord        ("Mask Coords", vector) = (0,0,0,0)
    //_MaskSoftness        ("Mask Softness", float) = 0
}

SubShader {

    Tags {
        "Queue"="AlphaTest"
        "IgnoreProjector"="True"
        "RenderType"="TransparentCutout"
    }

    LOD 300
    Cull [_CullMode]

    CGPROGRAM
    #pragma surface PixShader Lambert vertex:VertShader noforwardadd nolightmap nodirlightmap fullforwardshadows addshadow alphatest:_Cutoff
    #pragma target 3.0
    #pragma shader_feature __ GLOW_ON

    #include "TMPro_Properties.cginc"
    #include "TMPro.cginc"

    half _FaceShininess;
    half _OutlineShininess;

    struct Input
    {
        fixed4    color        : COLOR;
        float2    uv_MainTex;
        float2    uv2_FaceTex;
        float2  uv2_OutlineTex;
        float2    param;                    // Weight, Scale
        float3    viewDirEnv;       
    };

    #include "TMPro_Surface.cginc"

    ENDCG

    // Pass to render object as a shadow caster
    Pass
    {
        Name "Caster"
        Tags { "LightMode" = "ShadowCaster" "RenderType"="TransparentCutout"}
        Offset 1, 1

        Fog {Mode Off}
        ZWrite On ZTest LEqual Cull Off

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile_shadowcaster
        #include "UnityCG.cginc"

        struct v2f {
            V2F_SHADOW_CASTER;
            float2    uv            : TEXCOORD1;
            float2    uv2            : TEXCOORD3;
            float    alphaClip    : TEXCOORD2;
        };

        uniform float4 _MainTex_ST;
        uniform float4 _OutlineTex_ST;
        float _OutlineWidth;
        float _FaceDilate;
        float _ScaleRatioA;

        v2f vert( appdata_base v )
        {
            v2f o;
            TRANSFER_SHADOW_CASTER(o)
            o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
            o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
            o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2.0;
            return o;
        }

        uniform sampler2D _MainTex;

        float4 frag(v2f i) : COLOR
        {
            fixed4 texcol = tex2D(_MainTex, i.uv).a;
            clip(texcol.a - i.alphaClip);
            SHADOW_CASTER_FRAGMENT(i)
        }
        ENDCG
    }
}

CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
}
5 Likes