Text rendering
Some checks failed
CI / React UI Build (push) Successful in 40s
CI / Native Windows Build And Tests (push) Failing after 2m28s
CI / Windows Release Package (push) Has been skipped

This commit is contained in:
2026-05-21 15:39:37 +10:00
parent 09efe2d6a0
commit df0a77ef01
8 changed files with 107 additions and 52 deletions

View File

@@ -46,7 +46,7 @@
"id": "scale",
"label": "Scale",
"type": "float",
"default": 0.42,
"default": 1,
"min": 0.1,
"max": 3,
"step": 0.01,
@@ -72,7 +72,7 @@
0,
0,
0,
0.8
1
],
"description": "Text outline color and alpha."
},
@@ -80,10 +80,10 @@
"id": "outlineWidth",
"label": "Outline Width",
"type": "float",
"default": 0.12,
"default": 0.22,
"min": 0,
"max": 0.5,
"step": 0.01,
"max": 1,
"step": 0.02,
"description": "Width of the SDF outline around the text."
},
{

View File

@@ -16,11 +16,18 @@ float sdfCoverage(float2 uv, float edge, float aa)
return smoothstep(edge - aa, edge + aa, distance);
}
float coverage(float distance, float edge, float aa)
{
return smoothstep(edge - aa, edge + aa, distance);
}
float4 shadeVideo(ShaderContext context)
{
float2 resolution = max(context.outputResolution, float2(1.0, 1.0));
float aspect = resolution.x / resolution.y;
float2 textSize = float2(0.72 * scale, 0.09 * scale * aspect);
float textHeight = 0.09 * scale * aspect;
float textWidth = textHeight * max(titleTextTextureAspect, 0.01) / aspect;
float2 textSize = float2(textWidth, textHeight);
float2 safeTextSize = max(textSize, float2(0.0001, 0.0001));
float2 textUv = (context.uv - position) / safeTextSize;
bool insideTextRect = textUv.x >= 0.0 && textUv.x <= 1.0 && textUv.y >= 0.0 && textUv.y <= 1.0;
@@ -30,20 +37,15 @@ float4 shadeVideo(ShaderContext context)
float aa = max(fwidth(distance) * (1.75 + softness * 5.0), 0.0025);
float2 pixelTextUv = (1.0 / resolution) / safeTextSize;
float2 sampleOffset = pixelTextUv * 0.38;
float msdfDistance = sampleTitleTextMsdf(textUv);
float fill = (
sdfCoverage(textUv, edge, aa) * 2.0 +
sdfCoverage(textUv + float2(sampleOffset.x, sampleOffset.y), edge, aa) +
sdfCoverage(textUv + float2(-sampleOffset.x, sampleOffset.y), edge, aa) +
sdfCoverage(textUv + float2(sampleOffset.x, -sampleOffset.y), edge, aa) +
sdfCoverage(textUv + float2(-sampleOffset.x, -sampleOffset.y), edge, aa)) / 6.0;
float outlineDistance = outlineWidth * 0.16;
float outlineEdge = edge - outlineDistance;
float outline = (
sdfCoverage(textUv, outlineEdge, aa) * 2.0 +
sdfCoverage(textUv + float2(sampleOffset.x, sampleOffset.y), outlineEdge, aa) +
sdfCoverage(textUv + float2(-sampleOffset.x, sampleOffset.y), outlineEdge, aa) +
sdfCoverage(textUv + float2(sampleOffset.x, -sampleOffset.y), outlineEdge, aa) +
sdfCoverage(textUv + float2(-sampleOffset.x, -sampleOffset.y), outlineEdge, aa)) / 6.0;
coverage(msdfDistance, edge, aa) * 2.0 +
coverage(sampleTitleTextMsdf(textUv + float2(sampleOffset.x, sampleOffset.y)), edge, aa) +
coverage(sampleTitleTextMsdf(textUv + float2(-sampleOffset.x, sampleOffset.y)), edge, aa) +
coverage(sampleTitleTextMsdf(textUv + float2(sampleOffset.x, -sampleOffset.y)), edge, aa) +
coverage(sampleTitleTextMsdf(textUv + float2(-sampleOffset.x, -sampleOffset.y)), edge, aa)) / 6.0;
float outlineEdge = edge - min(outlineWidth * 0.7, 0.48);
float outline = coverage(distance, outlineEdge, aa);
float outlineAlpha = saturate(outline - fill) * outlineColor.a;
float fillAlpha = fill * fillColor.a;
float textAlpha = max(fillAlpha, outlineAlpha);