Skip to content

Commit 86e61a3

Browse files
bruvzgfire
andcommitted
Use MSDF instead of MTSDF for font rendering.
Co-authored-by: K. S. Ernest (iFire) Lee <[email protected]>
1 parent 80a219a commit 86e61a3

File tree

5 files changed

+42
-25
lines changed

5 files changed

+42
-25
lines changed

drivers/gles3/shaders/canvas.glsl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,8 @@ float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, flo
559559

560560
#endif
561561

562-
float msdf_median(float r, float g, float b, float a) {
563-
return min(max(min(r, g), min(max(r, g), b)), a);
562+
float msdf_median(float r, float g, float b) {
563+
return max(min(r, g), min(max(r, g), b));
564564
}
565565

566566
void main() {
@@ -606,14 +606,15 @@ void main() {
606606
vec2 msdf_size = vec2(textureSize(color_texture, 0));
607607
vec2 dest_size = vec2(1.0) / fwidth(uv);
608608
float px_size = max(0.5 * dot((vec2(px_range) / msdf_size), dest_size), 1.0);
609-
float d = msdf_median(msdf_sample.r, msdf_sample.g, msdf_sample.b, msdf_sample.a) - 0.5;
609+
float d = msdf_median(msdf_sample.r, msdf_sample.g, msdf_sample.b);
610610

611611
if (outline_thickness > 0.0) {
612612
float cr = clamp(outline_thickness, 0.0, px_range / 2.0) / px_range;
613-
float a = clamp((d + cr) * px_size, 0.0, 1.0);
613+
d = min(d, msdf_sample.a);
614+
float a = clamp((d - 0.5 + cr) * px_size + 0.5, 0.0, 1.0);
614615
color.a = a * color.a;
615616
} else {
616-
float a = clamp(d * px_size + 0.5, 0.0, 1.0);
617+
float a = clamp((d - 0.5) * px_size + 0.5, 0.0, 1.0);
617618
color.a = a * color.a;
618619
}
619620
} else if (bool(read_draw_data_flags & INSTANCE_FLAGS_USE_LCD)) {

modules/text_server_adv/text_server_adv.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -881,9 +881,15 @@ _FORCE_INLINE_ TextServerAdvanced::FontTexturePosition TextServerAdvanced::find_
881881
}
882882
} else if (p_color_size == 4) {
883883
for (int i = 0; i < texsize * texsize * p_color_size; i += 4) { // FORMAT_RGBA8, Color font, Multichannel(+True) SDF.
884-
w[i + 0] = 255;
885-
w[i + 1] = 255;
886-
w[i + 2] = 255;
884+
if (p_msdf) {
885+
w[i + 0] = 0;
886+
w[i + 1] = 0;
887+
w[i + 2] = 0;
888+
} else {
889+
w[i + 0] = 255;
890+
w[i + 1] = 255;
891+
w[i + 2] = 255;
892+
}
887893
w[i + 3] = 0;
888894
}
889895
} else {

modules/text_server_fb/text_server_fb.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,15 @@ _FORCE_INLINE_ TextServerFallback::FontTexturePosition TextServerFallback::find_
304304
}
305305
} else if (p_color_size == 4) {
306306
for (int i = 0; i < texsize * texsize * p_color_size; i += 4) { // FORMAT_RGBA8, Color font, Multichannel(+True) SDF.
307-
w[i + 0] = 255;
308-
w[i + 1] = 255;
309-
w[i + 2] = 255;
307+
if (p_msdf) {
308+
w[i + 0] = 0;
309+
w[i + 1] = 0;
310+
w[i + 2] = 0;
311+
} else {
312+
w[i + 0] = 255;
313+
w[i + 1] = 255;
314+
w[i + 2] = 255;
315+
}
310316
w[i + 3] = 0;
311317
}
312318
} else {

scene/resources/material.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,8 +1476,8 @@ void vertex() {)";
14761476

14771477
if (flags[FLAG_ALBEDO_TEXTURE_MSDF] && !flags[FLAG_UV1_USE_TRIPLANAR]) {
14781478
code += R"(
1479-
float msdf_median(float r, float g, float b, float a) {
1480-
return min(max(min(r, g), min(max(r, g), b)), a);
1479+
float msdf_median(float r, float g, float b) {
1480+
return max(min(r, g), min(max(r, g), b));
14811481
}
14821482
)";
14831483
}
@@ -1621,10 +1621,12 @@ void fragment() {)";
16211621
code += R"(
16221622
{
16231623
// Albedo Texture MSDF: Enabled
1624-
albedo_tex.rgb = mix(
1625-
vec3(1.0 + 0.055) * pow(albedo_tex.rgb, vec3(1.0 / 2.4)) - vec3(0.055),
1626-
vec3(12.92) * albedo_tex.rgb,
1627-
lessThan(albedo_tex.rgb, vec3(0.0031308)));
1624+
if (!OUTPUT_IS_SRGB) {
1625+
albedo_tex.rgb = mix(
1626+
vec3(1.0 + 0.055) * pow(albedo_tex.rgb, vec3(1.0 / 2.4)) - vec3(0.055),
1627+
vec3(12.92) * albedo_tex.rgb,
1628+
lessThan(albedo_tex.rgb, vec3(0.0031308)));
1629+
}
16281630
vec2 msdf_size = vec2(msdf_pixel_range) / vec2(albedo_texture_size);
16291631
)";
16301632
if (flags[FLAG_USE_POINT_SIZE]) {
@@ -1634,12 +1636,13 @@ void fragment() {)";
16341636
}
16351637
code += R"(
16361638
float px_size = max(0.5 * dot(msdf_size, dest_size), 1.0);
1637-
float d = msdf_median(albedo_tex.r, albedo_tex.g, albedo_tex.b, albedo_tex.a) - 0.5;
1639+
float d = msdf_median(albedo_tex.r, albedo_tex.g, albedo_tex.b);
16381640
if (msdf_outline_size > 0.0) {
16391641
float cr = clamp(msdf_outline_size, 0.0, msdf_pixel_range / 2.0) / msdf_pixel_range;
1640-
albedo_tex.a = clamp((d + cr) * px_size, 0.0, 1.0);
1642+
d = min(d, albedo_tex.a);
1643+
albedo_tex.a = clamp((d - 0.5 + cr) * px_size + 0.5, 0.0, 1.0);
16411644
} else {
1642-
albedo_tex.a = clamp(d * px_size + 0.5, 0.0, 1.0);
1645+
albedo_tex.a = clamp((d - 0.5) * px_size + 0.5, 0.0, 1.0);
16431646
}
16441647
albedo_tex.rgb = vec3(1.0);
16451648
}

servers/rendering/renderer_rd/shaders/canvas.glsl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ void light_blend_compute(uint light_base, vec4 light_color, inout vec3 color) {
462462
}
463463
}
464464

465-
float msdf_median(float r, float g, float b, float a) {
466-
return min(max(min(r, g), min(max(r, g), b)), a);
465+
float msdf_median(float r, float g, float b) {
466+
return max(min(r, g), min(max(r, g), b));
467467
}
468468

469469
void main() {
@@ -513,14 +513,15 @@ void main() {
513513
vec2 msdf_size = vec2(textureSize(sampler2D(color_texture, texture_sampler), 0));
514514
vec2 dest_size = vec2(1.0) / fwidth(uv);
515515
float px_size = max(0.5 * dot((vec2(px_range) / msdf_size), dest_size), 1.0);
516-
float d = msdf_median(msdf_sample.r, msdf_sample.g, msdf_sample.b, msdf_sample.a) - 0.5;
516+
float d = msdf_median(msdf_sample.r, msdf_sample.g, msdf_sample.b);
517517

518518
if (outline_thickness > 0) {
519519
float cr = clamp(outline_thickness, 0.0, px_range / 2) / px_range;
520-
float a = clamp((d + cr) * px_size, 0.0, 1.0);
520+
d = min(d, msdf_sample.a);
521+
float a = clamp((d - 0.5 + cr) * px_size + 0.5, 0.0, 1.0);
521522
color.a = a * color.a;
522523
} else {
523-
float a = clamp(d * px_size + 0.5, 0.0, 1.0);
524+
float a = clamp((d - 0.5) * px_size + 0.5, 0.0, 1.0);
524525
color.a = a * color.a;
525526
}
526527
} else if (bool(draw_data.flags & INSTANCE_FLAGS_USE_LCD)) {

0 commit comments

Comments
 (0)