Created
February 10, 2024 11:36
-
-
Save andanteyk/762b162f808c51bb106243b29a56449a to your computer and use it in GitHub Desktop.
ピクセルフォント囲み/影シェーダ
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
Shader "TextMeshPro/Bitmap_Shadow" { // この名前を変える | |
Properties { | |
_MainTex ("Font Atlas", 2D) = "white" {} | |
_FaceTex ("Font Texture", 2D) = "white" {} | |
[HDR]_FaceColor ("Text Color", Color) = (1,1,1,1) | |
[HDR]_ShadowColor ("Shadow Color", Color) = (0.5,0.5,0.5,1) // 追加 | |
_ShadowFlag ("Shadow Flag", int) = 255 // 追加 | |
// TMP を騙す | |
_GradientScale ("Gradient Scale", float) = 5.0 | |
_TextureWidth ("Texture Width", float) = 512 | |
_TextureHeight ("Texture Height", float) = 512 | |
_WeightNormal ("Weight Normal", float) = 0 | |
_WeightBold ("Weight Bold", float) = 0.5 | |
_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" | |
struct appdata_t { | |
float4 vertex : POSITION; | |
fixed4 color : COLOR; | |
float2 texcoord0 : TEXCOORD0; | |
float2 texcoord1 : TEXCOORD1; | |
}; | |
struct v2f { | |
float4 vertex : SV_POSITION; | |
fixed4 color : COLOR; | |
fixed4 color2 : COLOR1; // 追加 | |
float2 texcoord0 : TEXCOORD0; | |
float2 texcoord1 : TEXCOORD1; | |
float4 mask : TEXCOORD2; | |
float2 texcoord3 : TEXCOORD3; // 追加 | |
}; | |
uniform sampler2D _MainTex; | |
uniform float4 _MainTex_TexelSize; // 追加 | |
uniform sampler2D _FaceTex; | |
uniform float4 _FaceTex_ST; | |
uniform fixed4 _FaceColor; | |
uniform fixed4 _ShadowColor; // 追加 | |
uniform int _ShadowFlag; // 追加 | |
uniform float _VertexOffsetX; | |
uniform float _VertexOffsetY; | |
uniform float4 _ClipRect; | |
uniform float _MaskSoftnessX; | |
uniform float _MaskSoftnessY; | |
float2 UnpackUV(float uv) | |
{ | |
float2 output; | |
output.x = floor(uv / 4096); | |
output.y = uv - 4096 * output.x; | |
return output * 0.001953125; | |
} | |
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)); | |
fixed4 faceColor = v.color; | |
faceColor *= _FaceColor; | |
fixed4 shadowColor = _ShadowColor; // 追加 | |
v2f OUT; | |
OUT.vertex = vPosition; | |
OUT.color = faceColor; | |
OUT.texcoord0 = v.texcoord0; | |
OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(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. | |
float4 clampedRect = clamp(_ClipRect, -2e10, 2e10); | |
OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)); | |
OUT.texcoord3 = _MainTex_TexelSize.xy; // 追加 | |
OUT.color2 = shadowColor; // 追加 | |
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); | |
// ここから追加 | |
fixed4 color2 = tex2D(_MainTex, IN.texcoord0 + float2(+IN.texcoord3.x, 0)); | |
color2 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(+IN.texcoord3.x, 0)).rgb * IN.color2.rgb, IN.color2.a * color2.a * ((_ShadowFlag >> 0) & 1)); | |
fixed4 color3 = tex2D(_MainTex, IN.texcoord0 + float2(-IN.texcoord3.x, 0)); | |
color3 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(-IN.texcoord3.x, 0)).rgb * IN.color2.rgb, IN.color2.a * color3.a * ((_ShadowFlag >> 1) & 1)); | |
fixed4 color4 = tex2D(_MainTex, IN.texcoord0 + float2(0, +IN.texcoord3.y)); | |
color4 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(0, +IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color4.a * ((_ShadowFlag >> 2) & 1)); | |
fixed4 color5 = tex2D(_MainTex, IN.texcoord0 + float2(0, -IN.texcoord3.y)); | |
color5 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(0, -IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color5.a * ((_ShadowFlag >> 3) & 1)); | |
fixed4 color6 = tex2D(_MainTex, IN.texcoord0 + float2(+IN.texcoord3.x, +IN.texcoord3.y)); | |
color6 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(+IN.texcoord3.x, +IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color6.a * ((_ShadowFlag >> 4) & 1)); | |
fixed4 color7 = tex2D(_MainTex, IN.texcoord0 + float2(-IN.texcoord3.x, -IN.texcoord3.y)); | |
color7 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(-IN.texcoord3.x, -IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color7.a * ((_ShadowFlag >> 5) & 1)); | |
fixed4 color8 = tex2D(_MainTex, IN.texcoord0 + float2(-IN.texcoord3.x, +IN.texcoord3.y)); | |
color8 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(-IN.texcoord3.x, +IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color8.a * ((_ShadowFlag >> 6) & 1)); | |
fixed4 color9 = tex2D(_MainTex, IN.texcoord0 + float2(+IN.texcoord3.x, -IN.texcoord3.y)); | |
color9 = fixed4 (tex2D(_FaceTex, IN.texcoord1 + float2(+IN.texcoord3.x, -IN.texcoord3.y)).rgb * IN.color2.rgb, IN.color2.a * color9.a * ((_ShadowFlag >> 7) & 1)); | |
color2 = max(max(max(max(max(max(max(color2, color3), color4), color5), color6), color7), color8), color9); | |
color = fixed4(color.rgb * color.a + color2.rgb * color2.a * (1 - color.a), color.a + color2.a * (1 - 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 | |
#if UNITY_UI_ALPHACLIP | |
clip(color.a - 0.001); | |
#endif | |
return color; | |
} | |
ENDCG | |
} | |
} | |
// 下の行を消す (消さないと標準 GUI が出て ShadowColor が設定できない) | |
// CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment