SAIMA/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader
GrassTE 626f792f11 Squashed commit of the following:
commit 9559cc8882161192a43be22670a8ff69db1ea13a
Author: Roman <1325980292@qq.com>
Date:   Sat Aug 27 19:22:38 2022 +0800

    短学期Log

    任务:替换和实装美术素材
    1.在教程场景布置图标和文字提示内容
    DONE
    2.制作GamePlay中背景元素的动画并实装
    DONE
    3.替换拆迁障碍物美术素材
    DONE

    任务:实装音乐和音效
    1.为两个场景添加音乐,并且在GamePlay场景不重开音乐。
    DONE
    2.实装人摔地音效
    DONE
    3.实装人跑动音效
    效果不好
    DONE
    4.实装人马分离音效
    DONE
    *.补充实装人降落到马上的音效
    DONE
    5.实装创烂障碍物音效
    DONE
    6.实装圣火点燃音效
    DONE
    7.实装马磕磕碰碰音效
    DONE
    8.实装马似音效
    DONE
    9.实装马着地音效
    DONE
    10.实装马起跳音效
    DONE
    11.实装马蹄点地音效
    效果不好
    DONE

    任务:实装特效
    1.实装后处理
    DONE
    2.实装日夜更替
    DONE
    3.实装树叶飘落
    DONE
    4.实装圣火粒子
    效果不好
    DONE
    5.实装破碎灰尘
    效果不好
    DONE
    6.实装马蹄灰尘
    DONE
    7.实装红黑闪特效
    DONE

    任务:完善没写的零散逻辑
    1.在教程场景,若人马分离障碍处没接到人,过一个转场然后复位人和马
    **:仍然存在问题,当如此,人的动画失效。这个问题现在不好修,等待人的死亡动画实装后再修
    已修复
    DONE

    2.在教程场景,点燃圣火仅有进入触发器后加载转场然后转移场景的功能,没有点燃圣火的过程,现补充其逻辑
    DONE

    3.开发GamePlay距离记录和重开系统
    DONE

    4.策划要在点燃圣火时镜头放大,体现标题感
    URP相机不太好做
    ABANDON

    5.人的死亡动画逻辑之前没做
    DONE

    任务:测试并修复Bug
    DONE

    修复Bug
    1.在教程场景,可破坏障碍物的碎片的层级不对,创烂瞬间会有层级突变的问题。在GamePlay层级,也出现了这个问题。
    已修复
    DONE
    2.现在的高障碍实在太高了,基本有80%以上的概率导致马翻,应该调低障碍物、或者调大马的跳跃力度。
    DONE
    3.跑步动画和跑步音效完全对不上
    加快跑步动画
    DONE
    4.原爆破给力范围太大,会导致旧的碎片也被波及
    已修复
    DONE

commit cab00851df5e4da70b981c564888c53d86de1f95
Author: Roman <1325980292@qq.com>
Date:   Sat Aug 27 02:51:21 2022 +0800

    短学期Log

    任务:替换和实装美术素材
    1.在教程场景布置图标和文字提示内容
    DONE
    2.制作GamePlay中背景元素的动画并实装
    DONE
    3.替换拆迁障碍物美术素材
    DONE

    任务:实装音乐和音效
    1.为两个场景添加音乐,并且在GamePlay场景不重开音乐。
    DONE
    2.实装人摔地音效
    DONE
    3.实装人跑动音效
    DONE
    4.实装人马分离音效
    DONE
    5.实装创烂障碍物音效
    DOING
    6.实装圣火点燃音效
    7.实装马磕磕碰碰音效
    8.实装马似音效
    9.实装马着地音效
    10.实装马起跳音效

    任务:实装特效
    ……

    任务:完善没写的零散逻辑
    1.在教程场景,若人马分离障碍处没接到人,过一个转场然后复位人和马
    **:仍然存在问题,当如此,人的动画失效。这个问题现在不好修,等待人的死亡动画实装后再修
    WAIT
    2.在教程场景,点燃圣火仅有进入触发器后加载转场然后转移场景的功能,没有点燃圣火的过程,现补充其逻辑
    DONE
    3.开发GamePlay距离记录和重开系统
    ……

    修复Bug
    1.在教程场景,可破坏障碍物的碎片的层级不对,创烂瞬间会有层级突变的问题。在GamePlay层级,也出现了这个问题。
    2.现在的高障碍实在太高了,基本有80%以上的概率导致马翻,应该调低障碍物、或者调大马的跳跃力度。

commit 3f0c9dd791c66e7222d6dbb72d8b762b73f06aed
Merge: e6888a7 bc74426
Author: Roman <1325980292@qq.com>
Date:   Fri Aug 26 18:13:00 2022 +0800

    Merge branch 'Saipo' of https://e.coding.net/gensokyogroup/saima/SAIMA into Roman

    # Conflicts:
    #	UserSettings/EditorUserSettings.asset
    #	UserSettings/Layouts/CurrentMaximizeLayout.dwlt
    #	UserSettings/Layouts/default-2021.dwlt

commit e6888a748dc7188bd3c2f7ce4bceade7402f8cec
Author: Roman <1325980292@qq.com>
Date:   Fri Aug 26 18:11:05 2022 +0800

    任务:编写教程和开始场景
    分析:分为五个阶段,每个阶段一屏宽。前四个阶段是教程阶段,分别仅放一种障碍(第一个无障碍)和提示,提示参照茶杯头教程关。
    每个阶段间有明显间断、镜头固定,但当马通过该阶段的障碍后,镜头右移一个阶段。马不能倒退,相机左侧有空气墙。
    到达最终阶段后,按流程点燃圣火进入游戏

    设计:
    1.搭建核心场景,放置障碍物。
    DONE
    2.设计教程及开始场景管理器
    (1.控制相机,使马每通过一个阶段,相机运动到记录的位置
    DONE
    (2.给相机左侧添加空气墙
    DONE
    (3.管理器要明确记录此时玩家处于哪个阶段
    DONE
    (4.当玩家进入点燃圣火触发器,切断操控,等待动画结束或者一些信号,触发从右向左的渐变黑幕遮挡全屏,随后转场到新场景。
    DONE

    至此,基本逻辑完成,需要补充大量细节、替换大量美术素材。

    修复问题:
    1.人马分离障碍连续出现可能导致致命问题,修复使其不能连续出现
    DONE
    2.GamePlay中,远处的山需要补充运动逻辑
    DONE

commit 5d922db6142634cdd20aa7801c0b3c1c4994360c
Author: Roman <1325980292@qq.com>
Date:   Wed Aug 24 17:59:05 2022 +0800

    任务:制作人物动画逻辑
    1.当人物处于Normal时,重复播放骑在马上的动画
    2.当人物被射出,播放一次跳上动画,之后停在最后一帧,等待落到平台上。
    3.当人物进入Walk态,开始重复播放跑步动画。
    4.当人物开始降落,触发一次跳下动画,停在最后一帧
    5.当Recover结束,状态恢复为Normal,重回到骑在马上动画
    DONE

commit d1fe07492af5ce6ea736ef738eb3e38170a08066
Merge: 436eaf0 5e10767
Author: Roman <1325980292@qq.com>
Date:   Wed Aug 24 10:42:58 2022 +0800

    Merge branch 'Saipo' of https://e.coding.net/gensokyogroup/saima/SAIMA into Roman

    # Conflicts:
    #	UserSettings/Layouts/default-2021.dwlt

commit 436eaf01046248372e887eb8276f38e021915790
Author: Roman <1325980292@qq.com>
Date:   Wed Aug 24 10:40:51 2022 +0800

    为了拉取的提交,少量修改
2022-08-27 21:30:16 +08:00

248 lines
7.6 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 "TextMeshPro/Mobile/Distance Field - Masking" {
Properties {
[HDR]_FaceColor ("Face Color", Color) = (1,1,1,1)
_FaceDilate ("Face Dilate", Range(-1,1)) = 0
[HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_OutlineWidth ("Outline Thickness", Range(0,1)) = 0
_OutlineSoftness ("Outline Softness", Range(0,1)) = 0
[HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5)
_UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
_UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
_UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
_UnderlaySoftness ("Border Softness", Range(0,1)) = 0
_WeightNormal ("Weight Normal", float) = 0
_WeightBold ("Weight Bold", float) = .5
_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
_ScaleX ("Scale X", float) = 1
_ScaleY ("Scale Y", float) = 1
_PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
_Sharpness ("Sharpness", Range(-1,1)) = 0
_VertexOffsetX ("Vertex OffsetX", float) = 0
_VertexOffsetY ("Vertex OffsetY", float) = 0
_ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
_MaskSoftnessX ("Mask SoftnessX", float) = 0
_MaskSoftnessY ("Mask SoftnessY", float) = 0
_MaskTex ("Mask Texture", 2D) = "white" {}
_MaskInverse ("Inverse", float) = 0
_MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
_MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
_MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
_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]
}
Cull [_CullMode]
ZWrite Off
Lighting Off
Fog { Mode Off }
ZTest [unity_GUIZTestMode]
Blend One OneMinusSrcAlpha
ColorMask [_ColorMask]
Pass {
CGPROGRAM
#pragma vertex VertShader
#pragma fragment PixShader
#pragma shader_feature __ OUTLINE_ON
#pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
#pragma multi_compile __ UNITY_UI_CLIP_RECT
#pragma multi_compile __ UNITY_UI_ALPHACLIP
#include "UnityCG.cginc"
#include "UnityUI.cginc"
#include "TMPro_Properties.cginc"
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;
fixed4 outlineColor : COLOR1;
float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
#if (UNDERLAY_ON | UNDERLAY_INNER)
float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
#endif
};
float _MaskWipeControl;
float _MaskEdgeSoftness;
fixed4 _MaskEdgeColor;
bool _MaskInverse;
pixel_t VertShader(vertex_t input)
{
float bold = step(input.texcoord1.y, 0);
float4 vert = input.vertex;
vert.x += _VertexOffsetX;
vert.y += _VertexOffsetY;
float4 vPosition = UnityObjectToClipPos(vert);
float2 pixelSize = vPosition.w;
pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
float scale = rsqrt(dot(pixelSize, pixelSize));
scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1);
if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
float layerScale = scale;
scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
float bias = (0.5 - weight) * scale - 0.5;
float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
float opacity = input.color.a;
#if (UNDERLAY_ON | UNDERLAY_INNER)
opacity = 1.0;
#endif
fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
faceColor.rgb *= faceColor.a;
fixed4 outlineColor = _OutlineColor;
outlineColor.a *= opacity;
outlineColor.rgb *= outlineColor.a;
outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
#if (UNDERLAY_ON | UNDERLAY_INNER)
layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
float2 layerOffset = float2(x, y);
#endif
// Generate UV for the Masking Texture
float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
// Structure for pixel shader
pixel_t output = {
vPosition,
faceColor,
outlineColor,
float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y),
half4(scale, bias - outline, bias + outline, bias),
half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)),
#if (UNDERLAY_ON | UNDERLAY_INNER)
float4(input.texcoord0 + layerOffset, input.color.a, 0),
half2(layerScale, layerBias),
#endif
};
return output;
}
// PIXEL SHADER
fixed4 PixShader(pixel_t input) : SV_Target
{
half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
half4 c = input.faceColor * saturate(d - input.param.w);
#ifdef OUTLINE_ON
c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
c *= saturate(d - input.param.y);
#endif
#if UNDERLAY_ON
d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
#endif
#if UNDERLAY_INNER
half sd = saturate(d - input.param.z);
d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
#endif
// Alternative implementation to UnityGet2DClipping with support for softness.
//#if UNITY_UI_CLIP_RECT
half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
c *= m.x * m.y;
//#endif
float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a);
float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl;
a = saturate(t / _MaskEdgeSoftness);
c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a);
c *= a;
#if (UNDERLAY_ON | UNDERLAY_INNER)
c *= input.texcoord1.z;
#endif
#if UNITY_UI_ALPHACLIP
clip(c.a - 0.001);
#endif
return c;
}
ENDCG
}
}
CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
}