-
-
Notifications
You must be signed in to change notification settings - Fork 275
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: support
TextMeshPro/Bitmap
and TextMeshPro/Mobile/Bitmap
sh…
…aders.
- Loading branch information
Showing
8 changed files
with
661 additions
and
0 deletions.
There are no files selected for viewing
164 changes: 164 additions & 0 deletions
164
.../src/Samples~/TextMeshPro Support (Unity 6)~/TMP_Bitmap-Mobile-SoftMaskable-Unity6.shader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
Shader "Hidden/TextMeshPro/Mobile/Bitmap (SoftMaskable)" { | ||
|
||
Properties { | ||
_MainTex ("Font Atlas", 2D) = "white" {} | ||
_Color ("Text Color", Color) = (1,1,1,1) | ||
_DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0 | ||
|
||
_VertexOffsetX ("Vertex OffsetX", float) = 0 | ||
_VertexOffsetY ("Vertex OffsetY", float) = 0 | ||
_MaskSoftnessX ("Mask SoftnessX", float) = 0 | ||
_MaskSoftnessY ("Mask SoftnessY", float) = 0 | ||
|
||
_ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) | ||
|
||
_StencilComp ("Stencil Comparison", Float) = 8 | ||
_Stencil ("Stencil ID", Float) = 0 | ||
_StencilOp ("Stencil Operation", Float) = 0 | ||
_StencilWriteMask ("Stencil Write Mask", Float) = 255 | ||
_StencilReadMask ("Stencil Read Mask", Float) = 255 | ||
|
||
_CullMode ("Cull Mode", Float) = 0 | ||
_ColorMask ("Color Mask", Float) = 15 | ||
} | ||
|
||
SubShader { | ||
|
||
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } | ||
|
||
Stencil | ||
{ | ||
Ref[_Stencil] | ||
Comp[_StencilComp] | ||
Pass[_StencilOp] | ||
ReadMask[_StencilReadMask] | ||
WriteMask[_StencilWriteMask] | ||
} | ||
|
||
|
||
Lighting Off | ||
Cull [_CullMode] | ||
ZTest [unity_GUIZTestMode] | ||
ZWrite Off | ||
Fog { Mode Off } | ||
Blend SrcAlpha OneMinusSrcAlpha | ||
ColorMask[_ColorMask] | ||
|
||
Pass { | ||
CGPROGRAM | ||
#pragma vertex vert | ||
#pragma fragment frag | ||
#pragma fragmentoption ARB_precision_hint_fastest | ||
|
||
#pragma multi_compile __ UNITY_UI_CLIP_RECT | ||
#pragma multi_compile __ UNITY_UI_ALPHACLIP | ||
|
||
|
||
#include "UnityCG.cginc" | ||
#include "UnityUI.cginc" | ||
|
||
#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask | ||
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask | ||
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask | ||
|
||
struct appdata_t | ||
{ | ||
float4 vertex : POSITION; | ||
fixed4 color : COLOR; | ||
float2 texcoord0 : TEXCOORD0; | ||
float2 texcoord1 : TEXCOORD1; | ||
}; | ||
|
||
struct v2f | ||
{ | ||
float4 vertex : POSITION; | ||
fixed4 color : COLOR; | ||
float2 texcoord0 : TEXCOORD0; | ||
float4 mask : TEXCOORD2; | ||
EDITOR_ONLY(float4 worldPosition : TEXCOORD3;) // Add for soft mask | ||
}; | ||
|
||
sampler2D _MainTex; | ||
fixed4 _Color; | ||
float _DiffusePower; | ||
|
||
uniform float _VertexOffsetX; | ||
uniform float _VertexOffsetY; | ||
uniform float4 _ClipRect; | ||
uniform float _MaskSoftnessX; | ||
uniform float _MaskSoftnessY; | ||
uniform float _UIMaskSoftnessX; | ||
uniform float _UIMaskSoftnessY; | ||
uniform int _UIVertexColorAlwaysGammaSpace; | ||
|
||
v2f vert (appdata_t v) | ||
{ | ||
v2f OUT; | ||
float4 vert = v.vertex; | ||
vert.x += _VertexOffsetX; | ||
vert.y += _VertexOffsetY; | ||
|
||
vert.xy += (vert.w * 0.5) / _ScreenParams.xy; | ||
if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) | ||
{ | ||
v.color.rgb = UIGammaToLinear(v.color.rgb); | ||
} | ||
OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert)); | ||
OUT.color = v.color; | ||
OUT.color *= _Color; | ||
OUT.color.rgb *= _DiffusePower; | ||
OUT.texcoord0 = v.texcoord0; | ||
|
||
float2 pixelSize = OUT.vertex.w; | ||
//pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); | ||
|
||
// Clamp _ClipRect to 16bit. | ||
const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); | ||
const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); | ||
OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); | ||
|
||
EDITOR_ONLY(OUT.worldPosition = v.vertex); // Add for soft mask | ||
|
||
return OUT; | ||
} | ||
|
||
fixed4 frag (v2f IN) : COLOR | ||
{ | ||
fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a); | ||
|
||
// Alternative implementation to UnityGet2DClipping with support for softness. | ||
#if UNITY_UI_CLIP_RECT | ||
half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); | ||
color *= m.x * m.y; | ||
#endif | ||
|
||
color *= SoftMask(IN.vertex, IN.worldPosition, color.a); // Add for soft mask | ||
|
||
#if UNITY_UI_ALPHACLIP | ||
clip(color.a - 0.001); | ||
#endif | ||
|
||
return color; | ||
} | ||
ENDCG | ||
} | ||
} | ||
|
||
SubShader { | ||
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } | ||
Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off } | ||
Blend SrcAlpha OneMinusSrcAlpha | ||
BindChannels { | ||
Bind "Color", color | ||
Bind "Vertex", vertex | ||
Bind "TexCoord", texcoord0 | ||
} | ||
Pass { | ||
SetTexture [_MainTex] { | ||
constantColor [_Color] combine constant * primary, constant * texture | ||
} | ||
} | ||
} | ||
|
||
CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" | ||
} |
9 changes: 9 additions & 0 deletions
9
...Samples~/TextMeshPro Support (Unity 6)~/TMP_Bitmap-Mobile-SoftMaskable-Unity6.shader.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
154 changes: 154 additions & 0 deletions
154
Packages/src/Samples~/TextMeshPro Support (Unity 6)~/TMP_Bitmap-SoftMaskable-Unity6.shader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
Shader "Hidden/TextMeshPro/Bitmap (SoftMaskable)" { | ||
|
||
Properties { | ||
_MainTex ("Font Atlas", 2D) = "white" {} | ||
_FaceTex ("Font Texture", 2D) = "white" {} | ||
_FaceColor ("Text Color", Color) = (1,1,1,1) | ||
|
||
_VertexOffsetX ("Vertex OffsetX", float) = 0 | ||
_VertexOffsetY ("Vertex OffsetY", float) = 0 | ||
_MaskSoftnessX ("Mask SoftnessX", float) = 0 | ||
_MaskSoftnessY ("Mask SoftnessY", float) = 0 | ||
|
||
_ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767) | ||
|
||
_StencilComp ("Stencil Comparison", Float) = 8 | ||
_Stencil ("Stencil ID", Float) = 0 | ||
_StencilOp ("Stencil Operation", Float) = 0 | ||
_StencilWriteMask ("Stencil Write Mask", Float) = 255 | ||
_StencilReadMask ("Stencil Read Mask", Float) = 255 | ||
|
||
_CullMode ("Cull Mode", Float) = 0 | ||
_ColorMask ("Color Mask", Float) = 15 | ||
} | ||
|
||
SubShader{ | ||
|
||
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } | ||
|
||
Stencil | ||
{ | ||
Ref[_Stencil] | ||
Comp[_StencilComp] | ||
Pass[_StencilOp] | ||
ReadMask[_StencilReadMask] | ||
WriteMask[_StencilWriteMask] | ||
} | ||
|
||
|
||
Lighting Off | ||
Cull [_CullMode] | ||
ZTest [unity_GUIZTestMode] | ||
ZWrite Off | ||
Fog { Mode Off } | ||
Blend SrcAlpha OneMinusSrcAlpha | ||
ColorMask[_ColorMask] | ||
|
||
Pass { | ||
CGPROGRAM | ||
#pragma vertex vert | ||
#pragma fragment frag | ||
|
||
#pragma multi_compile __ UNITY_UI_CLIP_RECT | ||
#pragma multi_compile __ UNITY_UI_ALPHACLIP | ||
|
||
|
||
#include "UnityCG.cginc" | ||
#include "UnityUI.cginc" | ||
|
||
#include "Packages/com.coffee.softmask-for-ugui/Shaders/SoftMask.cginc" // Add for soft mask | ||
#pragma shader_feature_local _ SOFTMASK_EDITOR // Add for soft mask | ||
#pragma shader_feature_local _ SOFTMASKABLE // Add for soft mask | ||
|
||
struct appdata_t | ||
{ | ||
float4 vertex : POSITION; | ||
fixed4 color : COLOR; | ||
float4 texcoord0 : TEXCOORD0; | ||
float2 texcoord1 : TEXCOORD1; | ||
}; | ||
|
||
struct v2f | ||
{ | ||
float4 vertex : SV_POSITION; | ||
fixed4 color : COLOR; | ||
float2 texcoord0 : TEXCOORD0; | ||
float2 texcoord1 : TEXCOORD1; | ||
float4 mask : TEXCOORD2; | ||
EDITOR_ONLY(float4 worldPosition : TEXCOORD3;) // Add for soft mask | ||
}; | ||
|
||
uniform sampler2D _MainTex; | ||
uniform sampler2D _FaceTex; | ||
uniform float4 _FaceTex_ST; | ||
uniform fixed4 _FaceColor; | ||
|
||
uniform float _VertexOffsetX; | ||
uniform float _VertexOffsetY; | ||
uniform float4 _ClipRect; | ||
uniform float _MaskSoftnessX; | ||
uniform float _MaskSoftnessY; | ||
uniform float _UIMaskSoftnessX; | ||
uniform float _UIMaskSoftnessY; | ||
uniform int _UIVertexColorAlwaysGammaSpace; | ||
|
||
v2f vert (appdata_t v) | ||
{ | ||
float4 vert = v.vertex; | ||
vert.x += _VertexOffsetX; | ||
vert.y += _VertexOffsetY; | ||
|
||
vert.xy += (vert.w * 0.5) / _ScreenParams.xy; | ||
|
||
float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert)); | ||
|
||
if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace()) | ||
{ | ||
v.color.rgb = UIGammaToLinear(v.color.rgb); | ||
} | ||
fixed4 faceColor = v.color; | ||
faceColor *= _FaceColor; | ||
|
||
v2f OUT; | ||
OUT.vertex = vPosition; | ||
OUT.color = faceColor; | ||
OUT.texcoord0 = v.texcoord0; | ||
OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex); | ||
float2 pixelSize = vPosition.w; | ||
pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1])); | ||
|
||
// Clamp _ClipRect to 16bit. | ||
const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); | ||
const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY)); | ||
OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)); | ||
|
||
EDITOR_ONLY(OUT.worldPosition = v.vertex); // Add for soft mask | ||
|
||
return OUT; | ||
} | ||
|
||
fixed4 frag (v2f IN) : SV_Target | ||
{ | ||
fixed4 color = tex2D(_MainTex, IN.texcoord0); | ||
color = fixed4 (tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a); | ||
|
||
// Alternative implementation to UnityGet2DClipping with support for softness. | ||
#if UNITY_UI_CLIP_RECT | ||
half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw); | ||
color *= m.x * m.y; | ||
#endif | ||
|
||
color *= SoftMask(IN.vertex, IN.worldPosition, color.a); // Add for soft mask | ||
|
||
#if UNITY_UI_ALPHACLIP | ||
clip(color.a - 0.001); | ||
#endif | ||
|
||
return color; | ||
} | ||
ENDCG | ||
} | ||
} | ||
|
||
CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" | ||
} |
9 changes: 9 additions & 0 deletions
9
...es/src/Samples~/TextMeshPro Support (Unity 6)~/TMP_Bitmap-SoftMaskable-Unity6.shader.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.