Text background color on some letters

Any update on this? I’m also trying to get the highlight to not show up on top of the text and using the trick don’t work.

<font=“Caveat SDF”>The patterned walls are made from <mark=“#F8C100EE”>layers of petrified Navajo sandstone which date back to the Jurassic period.

I’m using TextMeshPro 3.0.3 and URP 10

2 Likes

Anybody here?

2 Likes

I would also be very interested in a less hacky solution to this. It seems like a fairly basic feature compared to some other things TMP can already do. Just adding my reply in the hopes that it’s coming soon. Not holding my breath, though… Threads about this go back more than three years.

4 Likes

I am reading this posts / threads and addressing this sorting issue which affects underline, strikethrough and mark is on my shorter term list of stuff to address.

4 Likes

Thanks, being able to give the text is a flat background color is something I need too
(Appreciate all your efforts!)

I found a hacky way to make the highlight appear behind the text. It’ll cost an extra draw call but at least looks good.

Simply replace your TextMeshPro component by this one :slight_smile:

using System;
using System;
using TMPro;
using UnityEngine;
using UnityEngine.TextCore;

public class TextMeshProHighlightHack : TextMeshPro
{
    private Vector3[] Vertices;
    private Vector2[] UVs;
    private Color32[] Colors32;
    private int[] Triangles;

    private MeshFilter HighlightMeshFiter;

    protected override void GenerateTextMesh()
    {
        Vertices = new Vector3[0];
        UVs = new Vector2[0];
        Colors32 = new Color32[0];
        Triangles = new int[0];
    
        base.GenerateTextMesh();

        var m = new Mesh
        {
            vertices = Vertices,
            uv = UVs,
            colors32 = Colors32,
            triangles = Triangles
        };

        if (HighlightMeshFiter == null)
        {
            MeshRenderer mr;
            Transform highlightTransform = transform.Find("Highlight");
        
            if (highlightTransform == null)
            {
                var go = new GameObject("Highlight") {hideFlags = HideFlags.DontSave};
                go.transform.SetParent(transform, false);
                HighlightMeshFiter = go.AddComponent<MeshFilter>();
                mr = go.AddComponent<MeshRenderer>();
            }
            else
            {
                HighlightMeshFiter = highlightTransform.gameObject.GetComponent<MeshFilter>();
                mr = highlightTransform.gameObject.GetComponent<MeshRenderer>();
            }
        
            // In order to support the 'color' attribute (ex: <mark color=#RRGGBBAA>)
            // you might want to use a Shader using vertex colors here
            mr.material = new Material(Shader.Find("Unlit/Color"));
        }

        HighlightMeshFiter.mesh = m;
    }

   protected override void DrawTextHighlight(Vector3 start, Vector3 end, ref int index, Color32 highlightColor)
    {
        start += new Vector3(-.3f, .2f, .1f);
        end += new Vector3(.3f, -.4f, .1f);
        
        Array.Resize(ref Vertices, Vertices.Length + 4);
        Array.Resize(ref UVs, UVs.Length + 4);
        Array.Resize(ref Colors32, Colors32.Length + 4);
        Array.Resize(ref Triangles, Triangles.Length + 6);

        int vertIndex = Vertices.Length - 4;

        // UNDERLINE VERTICES FOR (3) LINE SEGMENTS
        #region HIGHLIGHT VERTICES
        Vector3[] vertices = Vertices;

        // Front Part of the Underline
        vertices[vertIndex + 0] = start; // BL
        vertices[vertIndex + 1] = new Vector3(start.x, end.y, start.z); // TL
        vertices[vertIndex + 2] = end; // TR
        vertices[vertIndex + 3] = new Vector3(end.x, start.y, end.z); // BR
        #endregion

        // UNDERLINE UV0
        #region HANDLE UV0
        Vector2[] uvs0 = UVs;

        // UVs for the Quad
        uvs0[0 + vertIndex] = new Vector2(0.01f, 0.01f); // BL
        uvs0[1 + vertIndex] = new Vector2(0.01f, .99f); // TL
        uvs0[2 + vertIndex] = new Vector2(.99f, .99f); // TR
        uvs0[3 + vertIndex] = new Vector2(.99f, 0.01f); // BR
        #endregion

        // HIGHLIGHT VERTEX COLORS
        #region
        // Alpha is the lower of the vertex color or tag color alpha used.
        highlightColor.a = m_fontColor32.a < highlightColor.a ? m_fontColor32.a : highlightColor.a;

        Color32[] colors32 = Colors32;
        colors32[0 + vertIndex] = highlightColor;
        colors32[1 + vertIndex] = highlightColor;
        colors32[2 + vertIndex] = highlightColor;
        colors32[3 + vertIndex] = highlightColor;
        #endregion
        
        Array.Resize(ref Triangles, Triangles.Length + 6);

        Triangles = new int[6 * Vertices.Length / 4];

        int index_X6 = 0;
        int index_X4 = 0;
        while (index_X4 / 4 < Vertices.Length / 4)
        {
            Triangles[index_X6 + 0] = index_X4 + 0;
            Triangles[index_X6 + 1] = index_X4 + 1;
            Triangles[index_X6 + 2] = index_X4 + 2;
            Triangles[index_X6 + 3] = index_X4 + 2;
            Triangles[index_X6 + 4] = index_X4 + 3;
            Triangles[index_X6 + 5] = index_X4 + 0;

            index_X4 += 4;
            index_X6 += 6;
        }
    }
}
1 Like

Damn I wasn’t expecting to see this still in the works in 2021.

I’m looking to use a more unorthodox method for work and am hoping that there might be some solution that someone has tried.

I am using TextMeshProUGUI and have some highlight boxes that I would like to position and size the same as either individual words, a grouping of words, if not some specific text lines.

Since the highlight boxes are rect’s with images with some nice round corners if like to keep them as I don’t see a way to round out or even change the visuals of the highlight to something other than solid color.

I am having major trouble with getting the position and converting the text mesh info to something i can convert for the highlight box rect.

Is there anyone who has accomplished this or something similar?

this would help a ton.

1 Like

Unfortunately, it did not work for me. It resulted in a very small text of white color and red outline.
I’d appreciate a native solution for this too.

1 Like
using System;
using TMPro;
using UnityEngine;

public class TextMeshProHighlight : TextMeshPro
{
    private Vector3[] Vertices;
    private Vector2[] UVs;
    private Color32[] Colors32;
    private int[] Triangles;

    private MeshFilter HighlightMeshFiter;

    protected override void OnDisable()
    {
        base.OnDisable();

        if (HighlightMeshFiter != null)
            HighlightMeshFiter.gameObject.SetActive(false);
    }

    protected override void GenerateTextMesh()
    {
        Vertices = new Vector3[0];
        UVs = new Vector2[0];
        Colors32 = new Color32[0];
        Triangles = new int[0];
      
        base.GenerateTextMesh();

        var m = new Mesh
        {
            vertices = Vertices,
            uv = UVs,
            colors32 = Colors32,
            triangles = Triangles
        };

        if (HighlightMeshFiter == null)
        {
            MeshRenderer mr;
            Transform highlightTransform = transform.Find("Highlight");
          
            if (highlightTransform == null)
            {
                var go = new GameObject("Highlight") {hideFlags = HideFlags.DontSave};
                go.transform.SetParent(transform, false);
                go.layer = LayerMask.NameToLayer("MenuRenderer");
                HighlightMeshFiter = go.AddComponent<MeshFilter>();
                mr = go.AddComponent<MeshRenderer>();
            }
            else
            {
                HighlightMeshFiter = highlightTransform.gameObject.GetComponent<MeshFilter>();
                mr = highlightTransform.gameObject.GetComponent<MeshRenderer>();
            }

            mr.material = new Material(Shader.Find("UI/TextMeshPro/Highlight"))
            {
                mainTexture = Resources.Load<Texture>("Textures/TextHighlight"),
                renderQueue = 4001
            };
        }
      
        HighlightMeshFiter.gameObject.SetActive(true);
        HighlightMeshFiter.mesh = m;
    }

    protected override void DrawTextHighlight(Vector3 start, Vector3 end, ref int index, Color32 highlightColor)
    {
        start += new Vector3(-.3f, .2f, .1f);
        end += new Vector3(.3f, -.4f, .1f);
      
        Array.Resize(ref Vertices, Vertices.Length + 4);
        Array.Resize(ref UVs, UVs.Length + 4);
        Array.Resize(ref Colors32, Colors32.Length + 4);
        Array.Resize(ref Triangles, Triangles.Length + 6);

        int vertIndex = Vertices.Length - 4;

        // UNDERLINE VERTICES FOR (3) LINE SEGMENTS
        #region HIGHLIGHT VERTICES
        Vector3[] vertices = Vertices;

        // Front Part of the Underline
        vertices[vertIndex + 0] = start; // BL
        vertices[vertIndex + 1] = new Vector3(start.x, end.y, start.z); // TL
        vertices[vertIndex + 2] = end; // TR
        vertices[vertIndex + 3] = new Vector3(end.x, start.y, end.z); // BR
        #endregion

        // UNDERLINE UV0
        #region HANDLE UV0
        Vector2[] uvs0 = UVs;

        // UVs for the Quad
        uvs0[0 + vertIndex] = new Vector2(0.01f, 0.01f); // BL
        uvs0[1 + vertIndex] = new Vector2(0.01f, .99f); // TL
        uvs0[2 + vertIndex] = new Vector2(.99f, .99f); // TR
        uvs0[3 + vertIndex] = new Vector2(.99f, 0.01f); // BR
        #endregion

        // HIGHLIGHT VERTEX COLORS
        #region
        // Alpha is the lower of the vertex color or tag color alpha used.
        highlightColor.a = m_fontColor32.a < highlightColor.a ? m_fontColor32.a : highlightColor.a;

        Color32[] colors32 = Colors32;
        colors32[0 + vertIndex] = highlightColor;
        colors32[1 + vertIndex] = highlightColor;
        colors32[2 + vertIndex] = highlightColor;
        colors32[3 + vertIndex] = highlightColor;
        #endregion
      
        Array.Resize(ref Triangles, Triangles.Length + 6);

        Triangles = new int[6 * Vertices.Length / 4];

        int index_X6 = 0;
        int index_X4 = 0;
        while (index_X4 / 4 < Vertices.Length / 4)
        {
            Triangles[index_X6 + 0] = index_X4 + 0;
            Triangles[index_X6 + 1] = index_X4 + 1;
            Triangles[index_X6 + 2] = index_X4 + 2;
            Triangles[index_X6 + 3] = index_X4 + 2;
            Triangles[index_X6 + 4] = index_X4 + 3;
            Triangles[index_X6 + 5] = index_X4 + 0;

            index_X4 += 4;
            index_X6 += 6;
        }
    }

    protected override void FillCharacterVertexBuffers(int i, int index_X4)
    {
        int materialIndex = m_textInfo.characterInfo[i].materialReferenceIndex;
      
        // TODO: this IF is a workaround to prevent a 'index out of bounds' when changing
        // text opacity with a sprite
      
        if (materialIndex <= m_textInfo.meshInfo.Length - 1)
        {
            index_X4 = m_textInfo.meshInfo[materialIndex].vertexCount;

            // Check to make sure our current mesh buffer allocations can hold these new Quads.
            if (index_X4 >= m_textInfo.meshInfo[materialIndex].vertices.Length)
                m_textInfo.meshInfo[materialIndex].ResizeMeshInfo(Mathf.NextPowerOfTwo((index_X4 + 4) / 4));

            TMP_CharacterInfo[] characterInfoArray = m_textInfo.characterInfo;
            m_textInfo.characterInfo[i].vertexIndex = index_X4;

            // Setup Vertices for Characters
            m_textInfo.meshInfo[materialIndex].vertices[0 + index_X4] = characterInfoArray[i].vertex_BL.position;
            m_textInfo.meshInfo[materialIndex].vertices[1 + index_X4] = characterInfoArray[i].vertex_TL.position;
            m_textInfo.meshInfo[materialIndex].vertices[2 + index_X4] = characterInfoArray[i].vertex_TR.position;
            m_textInfo.meshInfo[materialIndex].vertices[3 + index_X4] = characterInfoArray[i].vertex_BR.position;


            // Setup UVS0
            m_textInfo.meshInfo[materialIndex].uvs0[0 + index_X4] = characterInfoArray[i].vertex_BL.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[1 + index_X4] = characterInfoArray[i].vertex_TL.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[2 + index_X4] = characterInfoArray[i].vertex_TR.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[3 + index_X4] = characterInfoArray[i].vertex_BR.uv;


            // Setup UVS2
            m_textInfo.meshInfo[materialIndex].uvs2[0 + index_X4] = characterInfoArray[i].vertex_BL.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[1 + index_X4] = characterInfoArray[i].vertex_TL.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[2 + index_X4] = characterInfoArray[i].vertex_TR.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[3 + index_X4] = characterInfoArray[i].vertex_BR.uv2;


            // setup Vertex Colors
            m_textInfo.meshInfo[materialIndex].colors32[0 + index_X4] = characterInfoArray[i].vertex_BL.color;
            m_textInfo.meshInfo[materialIndex].colors32[1 + index_X4] = characterInfoArray[i].vertex_TL.color;
            m_textInfo.meshInfo[materialIndex].colors32[2 + index_X4] = characterInfoArray[i].vertex_TR.color;
            m_textInfo.meshInfo[materialIndex].colors32[3 + index_X4] = characterInfoArray[i].vertex_BR.color;

            m_textInfo.meshInfo[materialIndex].vertexCount = index_X4 + 4;
        }
    }

    protected override void FillSpriteVertexBuffers(int i, int index_X4)
    {
        int materialIndex = m_textInfo.characterInfo[i].materialReferenceIndex;
      
        // TODO: this IF is a workaround to prevent a 'index out of bounds' when changing
        // text opacity with a sprite
      
        if (materialIndex <= m_textInfo.meshInfo.Length - 1)
        {
            index_X4 = m_textInfo.meshInfo[materialIndex].vertexCount;

            // Check to make sure our current mesh buffer allocations can hold these new Quads.
            if (index_X4 >= m_textInfo.meshInfo[materialIndex].vertices.Length)
                m_textInfo.meshInfo[materialIndex].ResizeMeshInfo(Mathf.NextPowerOfTwo((index_X4 + 4) / 4));

            TMP_CharacterInfo[] characterInfoArray = m_textInfo.characterInfo;
            m_textInfo.characterInfo[i].vertexIndex = index_X4;

            // Setup Vertices for Characters
            m_textInfo.meshInfo[materialIndex].vertices[0 + index_X4] = characterInfoArray[i].vertex_BL.position;
            m_textInfo.meshInfo[materialIndex].vertices[1 + index_X4] = characterInfoArray[i].vertex_TL.position;
            m_textInfo.meshInfo[materialIndex].vertices[2 + index_X4] = characterInfoArray[i].vertex_TR.position;
            m_textInfo.meshInfo[materialIndex].vertices[3 + index_X4] = characterInfoArray[i].vertex_BR.position;


            // Setup UVS0
            m_textInfo.meshInfo[materialIndex].uvs0[0 + index_X4] = characterInfoArray[i].vertex_BL.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[1 + index_X4] = characterInfoArray[i].vertex_TL.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[2 + index_X4] = characterInfoArray[i].vertex_TR.uv;
            m_textInfo.meshInfo[materialIndex].uvs0[3 + index_X4] = characterInfoArray[i].vertex_BR.uv;


            // Setup UVS2
            m_textInfo.meshInfo[materialIndex].uvs2[0 + index_X4] = characterInfoArray[i].vertex_BL.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[1 + index_X4] = characterInfoArray[i].vertex_TL.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[2 + index_X4] = characterInfoArray[i].vertex_TR.uv2;
            m_textInfo.meshInfo[materialIndex].uvs2[3 + index_X4] = characterInfoArray[i].vertex_BR.uv2;


            // setup Vertex Colors
            m_textInfo.meshInfo[materialIndex].colors32[0 + index_X4] = characterInfoArray[i].vertex_BL.color;
            m_textInfo.meshInfo[materialIndex].colors32[1 + index_X4] = characterInfoArray[i].vertex_TL.color;
            m_textInfo.meshInfo[materialIndex].colors32[2 + index_X4] = characterInfoArray[i].vertex_TR.color;
            m_textInfo.meshInfo[materialIndex].colors32[3 + index_X4] = characterInfoArray[i].vertex_BR.color;

            m_textInfo.meshInfo[materialIndex].vertexCount = index_X4 + 4;
        }
    }
}

Try that. That might work.

oh and here is the shader (amplify)

// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X
Shader "UI/TextMeshPro/Highlight"
{
    Properties
    {
        [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5
        [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1)
        [ASEEnd][ASEBegin]_MainTex("MainTex", 2D) = "white" {}
        [HideInInspector] _texcoord( "", 2D ) = "white" {}

        //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5
        //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16
        //_TessMin( "Tess Min Distance", Float ) = 10
        //_TessMax( "Tess Max Distance", Float ) = 25
        //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16
        //_TessMaxDisp( "Tess Max Displacement", Float ) = 25
    }

    SubShader
    {
        LOD 0

       
        Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Transparent" "Queue"="Transparent" }
       
        Cull Back
        AlphaToMask Off
        HLSLINCLUDE
        #pragma target 2.0

        float4 FixedTess( float tessValue )
        {
            return tessValue;
        }
       
        float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos )
        {
            float3 wpos = mul(o2w,vertex).xyz;
            float dist = distance (wpos, cameraPos);
            float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess;
            return f;
        }

        float4 CalcTriEdgeTessFactors (float3 triVertexFactors)
        {
            float4 tess;
            tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z);
            tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z);
            tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y);
            tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f;
            return tess;
        }

        float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams )
        {
            float dist = distance (0.5 * (wpos0+wpos1), cameraPos);
            float len = distance(wpos0, wpos1);
            float f = max(len * scParams.y / (edgeLen * dist), 1.0);
            return f;
        }

        float DistanceFromPlane (float3 pos, float4 plane)
        {
            float d = dot (float4(pos,1.0f), plane);
            return d;
        }

        bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] )
        {
            float4 planeTest;
            planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f );
            planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f );
            planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f );
            planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) +
                          (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f );
            return !all (planeTest);
        }

        float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos )
        {
            float3 f;
            f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos);
            f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos);
            f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos);

            return CalcTriEdgeTessFactors (f);
        }

        float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams )
        {
            float3 pos0 = mul(o2w,v0).xyz;
            float3 pos1 = mul(o2w,v1).xyz;
            float3 pos2 = mul(o2w,v2).xyz;
            float4 tess;
            tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams);
            tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams);
            tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams);
            tess.w = (tess.x + tess.y + tess.z) / 3.0f;
            return tess;
        }

        float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] )
        {
            float3 pos0 = mul(o2w,v0).xyz;
            float3 pos1 = mul(o2w,v1).xyz;
            float3 pos2 = mul(o2w,v2).xyz;
            float4 tess;

            if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes))
            {
                tess = 0.0f;
            }
            else
            {
                tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams);
                tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams);
                tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams);
                tess.w = (tess.x + tess.y + tess.z) / 3.0f;
            }
            return tess;
        }
        ENDHLSL

       
        Pass
        {
           
            Name "Forward"
            Tags { "LightMode"="UniversalForward" }
           
            Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
            ZWrite Off
            ZTest LEqual
            Offset 0 , 0
            ColorMask RGBA
           

            HLSLPROGRAM
            #define _RECEIVE_SHADOWS_OFF 1
            #pragma multi_compile_instancing
            #define ASE_SRP_VERSION 999999

            #pragma prefer_hlslcc gles
            #pragma exclude_renderers d3d11_9x

            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"

            #if ASE_SRP_VERSION <= 70108
            #define REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR
            #endif

            #define ASE_NEEDS_FRAG_COLOR


            struct VertexInput
            {
                float4 vertex : POSITION;
                float3 ase_normal : NORMAL;
                float4 ase_texcoord : TEXCOORD0;
                half4 ase_color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct VertexOutput
            {
                float4 clipPos : SV_POSITION;
                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                float3 worldPos : TEXCOORD0;
                #endif
                #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                float4 shadowCoord : TEXCOORD1;
                #endif
                #ifdef ASE_FOG
                float fogFactor : TEXCOORD2;
                #endif
                float4 ase_texcoord3 : TEXCOORD3;
                float4 ase_color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
            };

            CBUFFER_START(UnityPerMaterial)
            half4 _MainTex_ST;
            #ifdef TESSELLATION_ON
                float _TessPhongStrength;
                float _TessValue;
                float _TessMin;
                float _TessMax;
                float _TessEdgeLength;
                float _TessMaxDisp;
            #endif
            CBUFFER_END
            sampler2D _MainTex;


                       
            VertexOutput VertexFunction ( VertexInput v  )
            {
                VertexOutput o = (VertexOutput)0;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

                o.ase_texcoord3.xy = v.ase_texcoord.xy;
                o.ase_color = v.ase_color;
               
                //setting value to unused interpolator channels and avoid initialization warnings
                o.ase_texcoord3.zw = 0;
                #ifdef ASE_ABSOLUTE_VERTEX_POS
                    float3 defaultVertexValue = v.vertex.xyz;
                #else
                    float3 defaultVertexValue = float3(0, 0, 0);
                #endif
                float3 vertexValue = defaultVertexValue;
                #ifdef ASE_ABSOLUTE_VERTEX_POS
                    v.vertex.xyz = vertexValue;
                #else
                    v.vertex.xyz += vertexValue;
                #endif
                v.ase_normal = v.ase_normal;

                float3 positionWS = TransformObjectToWorld( v.vertex.xyz );
                float4 positionCS = TransformWorldToHClip( positionWS );

                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                o.worldPos = positionWS;
                #endif
                #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                VertexPositionInputs vertexInput = (VertexPositionInputs)0;
                vertexInput.positionWS = positionWS;
                vertexInput.positionCS = positionCS;
                o.shadowCoord = GetShadowCoord( vertexInput );
                #endif
                #ifdef ASE_FOG
                o.fogFactor = ComputeFogFactor( positionCS.z );
                #endif
                o.clipPos = positionCS;
                return o;
            }

            #if defined(TESSELLATION_ON)
            struct VertexControl
            {
                float4 vertex : INTERNALTESSPOS;
                float3 ase_normal : NORMAL;
                float4 ase_texcoord : TEXCOORD0;
                half4 ase_color : COLOR;

                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct TessellationFactors
            {
                float edge[3] : SV_TessFactor;
                float inside : SV_InsideTessFactor;
            };

            VertexControl vert ( VertexInput v )
            {
                VertexControl o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                o.vertex = v.vertex;
                o.ase_normal = v.ase_normal;
                o.ase_texcoord = v.ase_texcoord;
                o.ase_color = v.ase_color;
                return o;
            }

            TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
            {
                TessellationFactors o;
                float4 tf = 1;
                float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
                float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
                #if defined(ASE_FIXED_TESSELLATION)
                tf = FixedTess( tessValue );
                #elif defined(ASE_DISTANCE_TESSELLATION)
                tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
                #elif defined(ASE_LENGTH_TESSELLATION)
                tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
                #elif defined(ASE_LENGTH_CULL_TESSELLATION)
                tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
                #endif
                o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
                return o;
            }

            [domain("tri")]
            [partitioning("fractional_odd")]
            [outputtopology("triangle_cw")]
            [patchconstantfunc("TessellationFunction")]
            [outputcontrolpoints(3)]
            VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
            {
               return patch[id];
            }

            [domain("tri")]
            VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
            {
                VertexInput o = (VertexInput) 0;
                o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
                o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
                o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z;
                o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z;
                #if defined(ASE_PHONG_TESSELLATION)
                float3 pp[3];
                for (int i = 0; i < 3; ++i)
                    pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
                float phongStrength = _TessPhongStrength;
                o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
                #endif
                UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
                return VertexFunction(o);
            }
            #else
            VertexOutput vert ( VertexInput v )
            {
                return VertexFunction( v );
            }
            #endif

            half4 frag ( VertexOutput IN  ) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID( IN );
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );

                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                float3 WorldPosition = IN.worldPos;
                #endif
                float4 ShadowCoords = float4( 0, 0, 0, 0 );

                #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                    #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
                        ShadowCoords = IN.shadowCoord;
                    #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
                        ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
                    #endif
                #endif
                float2 uv_MainTex = IN.ase_texcoord3.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                half4 tex2DNode5 = tex2D( _MainTex, uv_MainTex );
               
                float3 BakedAlbedo = 0;
                float3 BakedEmission = 0;
                float3 Color = ( tex2DNode5 * IN.ase_color ).rgb;
                float Alpha = ( tex2DNode5.a * IN.ase_color.a );
                float AlphaClipThreshold = 0.5;
                float AlphaClipThresholdShadow = 0.5;

                #ifdef _ALPHATEST_ON
                    clip( Alpha - AlphaClipThreshold );
                #endif

                #ifdef LOD_FADE_CROSSFADE
                    LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
                #endif

                #ifdef ASE_FOG
                    Color = MixFog( Color, IN.fogFactor );
                #endif

                return half4( Color, Alpha );
            }

            ENDHLSL
        }

       
        Pass
        {
           
            Name "DepthOnly"
            Tags { "LightMode"="DepthOnly" }

            ZWrite On
            ColorMask 0
            AlphaToMask Off

            HLSLPROGRAM
            #define _RECEIVE_SHADOWS_OFF 1
            #pragma multi_compile_instancing
            #define ASE_SRP_VERSION 999999

            #pragma prefer_hlslcc gles
            #pragma exclude_renderers d3d11_9x

            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"

           

            struct VertexInput
            {
                float4 vertex : POSITION;
                float3 ase_normal : NORMAL;
                float4 ase_texcoord : TEXCOORD0;
                half4 ase_color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct VertexOutput
            {
                float4 clipPos : SV_POSITION;
                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                float3 worldPos : TEXCOORD0;
                #endif
                #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                float4 shadowCoord : TEXCOORD1;
                #endif
                float4 ase_texcoord2 : TEXCOORD2;
                float4 ase_color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
                UNITY_VERTEX_OUTPUT_STEREO
            };

            CBUFFER_START(UnityPerMaterial)
            half4 _MainTex_ST;
            #ifdef TESSELLATION_ON
                float _TessPhongStrength;
                float _TessValue;
                float _TessMin;
                float _TessMax;
                float _TessEdgeLength;
                float _TessMaxDisp;
            #endif
            CBUFFER_END
            sampler2D _MainTex;


           
            VertexOutput VertexFunction( VertexInput v  )
            {
                VertexOutput o = (VertexOutput)0;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

                o.ase_texcoord2.xy = v.ase_texcoord.xy;
                o.ase_color = v.ase_color;
               
                //setting value to unused interpolator channels and avoid initialization warnings
                o.ase_texcoord2.zw = 0;
                #ifdef ASE_ABSOLUTE_VERTEX_POS
                    float3 defaultVertexValue = v.vertex.xyz;
                #else
                    float3 defaultVertexValue = float3(0, 0, 0);
                #endif
                float3 vertexValue = defaultVertexValue;
                #ifdef ASE_ABSOLUTE_VERTEX_POS
                    v.vertex.xyz = vertexValue;
                #else
                    v.vertex.xyz += vertexValue;
                #endif

                v.ase_normal = v.ase_normal;

                float3 positionWS = TransformObjectToWorld( v.vertex.xyz );

                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                o.worldPos = positionWS;
                #endif

                o.clipPos = TransformWorldToHClip( positionWS );
                #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) && defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                    VertexPositionInputs vertexInput = (VertexPositionInputs)0;
                    vertexInput.positionWS = positionWS;
                    vertexInput.positionCS = clipPos;
                    o.shadowCoord = GetShadowCoord( vertexInput );
                #endif
                return o;
            }

            #if defined(TESSELLATION_ON)
            struct VertexControl
            {
                float4 vertex : INTERNALTESSPOS;
                float3 ase_normal : NORMAL;
                float4 ase_texcoord : TEXCOORD0;
                half4 ase_color : COLOR;

                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct TessellationFactors
            {
                float edge[3] : SV_TessFactor;
                float inside : SV_InsideTessFactor;
            };

            VertexControl vert ( VertexInput v )
            {
                VertexControl o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                o.vertex = v.vertex;
                o.ase_normal = v.ase_normal;
                o.ase_texcoord = v.ase_texcoord;
                o.ase_color = v.ase_color;
                return o;
            }

            TessellationFactors TessellationFunction (InputPatch<VertexControl,3> v)
            {
                TessellationFactors o;
                float4 tf = 1;
                float tessValue = _TessValue; float tessMin = _TessMin; float tessMax = _TessMax;
                float edgeLength = _TessEdgeLength; float tessMaxDisp = _TessMaxDisp;
                #if defined(ASE_FIXED_TESSELLATION)
                tf = FixedTess( tessValue );
                #elif defined(ASE_DISTANCE_TESSELLATION)
                tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, GetObjectToWorldMatrix(), _WorldSpaceCameraPos );
                #elif defined(ASE_LENGTH_TESSELLATION)
                tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams );
                #elif defined(ASE_LENGTH_CULL_TESSELLATION)
                tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, GetObjectToWorldMatrix(), _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes );
                #endif
                o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w;
                return o;
            }

            [domain("tri")]
            [partitioning("fractional_odd")]
            [outputtopology("triangle_cw")]
            [patchconstantfunc("TessellationFunction")]
            [outputcontrolpoints(3)]
            VertexControl HullFunction(InputPatch<VertexControl, 3> patch, uint id : SV_OutputControlPointID)
            {
               return patch[id];
            }

            [domain("tri")]
            VertexOutput DomainFunction(TessellationFactors factors, OutputPatch<VertexControl, 3> patch, float3 bary : SV_DomainLocation)
            {
                VertexInput o = (VertexInput) 0;
                o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z;
                o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z;
                o.ase_texcoord = patch[0].ase_texcoord * bary.x + patch[1].ase_texcoord * bary.y + patch[2].ase_texcoord * bary.z;
                o.ase_color = patch[0].ase_color * bary.x + patch[1].ase_color * bary.y + patch[2].ase_color * bary.z;
                #if defined(ASE_PHONG_TESSELLATION)
                float3 pp[3];
                for (int i = 0; i < 3; ++i)
                    pp[i] = o.vertex.xyz - patch[i].ase_normal * (dot(o.vertex.xyz, patch[i].ase_normal) - dot(patch[i].vertex.xyz, patch[i].ase_normal));
                float phongStrength = _TessPhongStrength;
                o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz;
                #endif
                UNITY_TRANSFER_INSTANCE_ID(patch[0], o);
                return VertexFunction(o);
            }
            #else
            VertexOutput vert ( VertexInput v )
            {
                return VertexFunction( v );
            }
            #endif

            half4 frag(VertexOutput IN  ) : SV_TARGET
            {
                UNITY_SETUP_INSTANCE_ID(IN);
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN );

                #if defined(ASE_NEEDS_FRAG_WORLD_POSITION)
                float3 WorldPosition = IN.worldPos;
                #endif
                float4 ShadowCoords = float4( 0, 0, 0, 0 );

                #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS)
                    #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)
                        ShadowCoords = IN.shadowCoord;
                    #elif defined(MAIN_LIGHT_CALCULATE_SHADOWS)
                        ShadowCoords = TransformWorldToShadowCoord( WorldPosition );
                    #endif
                #endif

                float2 uv_MainTex = IN.ase_texcoord2.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                half4 tex2DNode5 = tex2D( _MainTex, uv_MainTex );
               
                float Alpha = ( tex2DNode5.a * IN.ase_color.a );
                float AlphaClipThreshold = 0.5;

                #ifdef _ALPHATEST_ON
                    clip(Alpha - AlphaClipThreshold);
                #endif

                #ifdef LOD_FADE_CROSSFADE
                    LODDitheringTransition( IN.clipPos.xyz, unity_LODFade.x );
                #endif
                return 0;
            }
            ENDHLSL
        }

   
    }
    CustomEditor "UnityEditor.ShaderGraph.PBRMasterGUI"
    Fallback "Hidden/InternalErrorShader"
   
}
/*ASEBEGIN
Version=18712
0;6;2560;1383;1829.225;868.6758;1;True;False
Node;AmplifyShaderEditor.VertexColorNode;9;-733.9046,187.8119;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SamplerNode;5;-825.0001,-150;Inherit;True;Property;_MainTex;MainTex;0;0;Create;True;0;0;0;False;0;False;-1;None;4caac0564fbc05b48a5ec865e3ac4f45;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-407.4001,59.69999;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-180.3254,149.7495;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;0;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraph.PBRMasterGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ExtraPrePass;0;0;ExtraPrePass;5;False;False;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;0;0;True;1;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;False;False;False;False;False;False;False;False;True;0;False;-1;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;1;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;0;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;2;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraph.PBRMasterGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;ShadowCaster;0;2;ShadowCaster;0;False;False;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;0;0;False;False;False;False;False;False;False;False;True;0;False;-1;False;False;False;False;False;False;True;1;False;-1;True;3;False;-1;False;True;1;LightMode=ShadowCaster;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;3;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraph.PBRMasterGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;DepthOnly;0;3;DepthOnly;0;False;False;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;0;0;False;False;False;False;False;False;False;False;True;0;False;-1;False;True;False;False;False;False;0;False;-1;False;False;False;False;True;1;False;-1;False;False;True;1;LightMode=DepthOnly;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;4;0,0;Float;False;False;-1;2;UnityEditor.ShaderGraph.PBRMasterGUI;0;3;New Amplify Shader;2992e84f91cbeb14eab234972e07ea9d;True;Meta;0;4;Meta;0;False;False;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;True;0;0;False;False;False;False;False;False;False;False;False;True;2;False;-1;False;False;False;False;False;False;False;False;True;1;LightMode=Meta;False;0;Hidden/InternalErrorShader;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;1;87,-1;Half;False;True;-1;2;UnityEditor.ShaderGraph.PBRMasterGUI;0;3;Brink/UI/TextMeshPro/Highlight;2992e84f91cbeb14eab234972e07ea9d;True;Forward;0;1;Forward;8;False;False;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;False;False;False;False;False;False;False;False;True;3;RenderPipeline=UniversalPipeline;RenderType=Transparent=RenderType;Queue=Transparent=Queue=0;True;0;0;True;1;5;False;-1;10;False;-1;1;1;False;-1;10;False;-1;False;False;False;False;False;False;False;False;False;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;2;False;-1;True;3;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=UniversalForward;False;0;Hidden/InternalErrorShader;0;0;Standard;22;Surface;1;  Blend;0;Two Sided;1;Cast Shadows;0;  Use Shadow Threshold;0;Receive Shadows;0;GPU Instancing;1;LOD CrossFade;0;Built-in Fog;0;DOTS Instancing;0;Meta Pass;0;Extra Pre Pass;0;Tessellation;0;  Phong;0;  Strength;0.5,False,-1;  Type;0;  Tess;16,False,-1;  Min;10,False,-1;  Max;25,False,-1;  Edge Length;16,False,-1;  Max Displacement;25,False,-1;Vertex Position,InvertActionOnDeselection;1;0;5;False;True;False;True;False;False;;False;0
WireConnection;7;0;5;0
WireConnection;7;1;9;0
WireConnection;10;0;5;4
WireConnection;10;1;9;4
WireConnection;1;2;7;0
WireConnection;1;3;10;0
ASEEND*/
//CHKSM=3E11D34689E563A032696D7D30809BF572B65D0F

Any progress about in-build solution? trick works, but it’s hacky solution.

1 Like

OK so using in a 3D TextMeshPro object causes it to draw over the text, thought I was going crazy looking at some of these examples out there. Will give one of those “hacks” a shot above, the workaround works but has weird Z issues, and setting Z position or sort order in the prefab gets overridden at runtime, and the color doesn’t match what I’m setting it to so its all screwy.

1 Like

Thread necro @Stephan_B is your fix still being planned for release at some point?

1 Like

Yes.

1 Like

Big necro, @Stephan_B , do you have some updates?
Current solution with “font” is quite ugly for me :confused:

1 Like

For anyone still looking for a neater solution to this, this is the cleanest one that I found;

$"<font=\"{text.font.name}\"><mark=#{ColorUtility.ToHtmlStringRGBA(backgroundColor)}>"

Where text is the TMP_Text component and backgroundColor your desired Color.
ColorUtility.ToHtmlStringRGBA is built into Unity, FYI.

Just remember to put your font asset in a correctly named resource folder and all should work fine: Settings, TextMesh Pro Documentation

Example extension method;

    public static class TMPExtensions
    {
        public static string Mark(this TMP_Text component, string text, Color color)
        {
            return $"<font=\"{component.font.name}\"><mark=#{ColorUtility.ToHtmlStringRGBA(color)}>{text}</mark></font>";
        }
    }

use: text.text = text.Mark("some string", backgroundColor);

2 Likes

@Stephan_B I just tested your solution in the 2021.3.6, and this works:
<font="Theinhardt Pan Bold SDF">This <mark=#FF8000>text is <b>high\u00adlighted</b></mark>

Whereas this doesn’t work:
<font="Theinhardt Pan Regular SDF">This <mark=#FF8000>text is <b>high\u00adlighted</b></mark>

See images attached.
That can be helpful for the team to figure it out there ;). I exported the fonts, hope that helps.

Note for those trying this workaround, you have to put your font file under the following folder hierarchy in your project:
Assets
Resources
Fonts & Materials
Theinhardt Pan Bold SDF
Theinhardt Pan Regular SDF

Resources folder can be inside a subfolder of your preference, you can have multiple resources folders and that still works.

8330613–1094619–Custom Fonts SDF for testing mark feature with TMP.unitypackage (4 MB)
8330613--1094622--unity mark feature theinhardt pan regular sdf.PNG
8330613--1094625--unity mark feature theinhardt pan bold sdf.PNG

1 Like

Another thread necro @Stephan_B is your fix still being planned for release at some point?

@Stephan_B
Please save us

Stephan doesn’t work on TMP anymore.