From 0d565d98ac1ba44cd7fbd4675701b822f88041e4 Mon Sep 17 00:00:00 2001
From: ickk <git@ickk.io>
Date: Sun, 27 Nov 2022 06:02:43 +1100
Subject: [PATCH] factor

---
 src/render/unified/shader.wgsl | 32 +++++++++++++++-----------------
 1 file changed, 15 insertions(+), 17 deletions(-)

diff --git a/src/render/unified/shader.wgsl b/src/render/unified/shader.wgsl
index 7ff2276..4c54689 100644
--- a/src/render/unified/shader.wgsl
+++ b/src/render/unified/shader.wgsl
@@ -65,21 +65,19 @@ fn median3(v: vec3<f32>) -> f32 {
     return max(min(v.x, v.y), min(max(v.x, v.y), v.z));
 }
 
-fn sample_subpixel(coords: vec2<f32>, dim: vec2<f32>, arr: i32, scale: f32) -> f32 {
-    var contrib = 0.;
-    // collect a few samples
+fn sample_sdf(coords: vec2<f32>, arr: i32, scale: f32) -> f32 {
     let sample = textureSample(font_texture, font_sampler, vec2(coords.xy), arr);
-    contrib += clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
-    let sample = textureSample(font_texture, font_sampler, vec2(coords.xy) + vec2(-dim.x, dim.y) / 3., arr);
-    contrib += clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
-    let sample = textureSample(font_texture, font_sampler, vec2(coords.xy) + vec2(-dim.x, -dim.y) / 3., arr);
-    contrib += clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
-    let sample = textureSample(font_texture, font_sampler, vec2(coords.xy) + vec2(dim.x, dim.y) / 3., arr);
-    contrib += clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
-    let sample = textureSample(font_texture, font_sampler, vec2(coords.xy) + vec2(dim.x, -dim.y) / 3., arr);
-    contrib += clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
-    // take the average
-    return (contrib / 5.);
+    return clamp((median3(sample.rgb) - 0.5) * scale + 0.5, 0., 1.);
+}
+
+fn sample_subpixel(coords: vec2<f32>, dim: vec2<f32>, arr: i32, scale: f32) -> f32 {
+    return 0.2 * (
+        sample_sdf(coords.xy, arr, scale)
+        + sample_sdf(coords.xy + vec2(-dim.x, dim.y) / 3., arr, scale)
+        + sample_sdf(coords.xy + vec2(-dim.x, -dim.y) / 3., arr, scale)
+        + sample_sdf(coords.xy + vec2(dim.x, dim.y) / 3., arr, scale)
+        + sample_sdf(coords.xy + vec2(dim.x, -dim.y) / 3., arr, scale)
+    );
 }
 
 @fragment
@@ -104,9 +102,9 @@ fn fragment(in: VertexOutput) -> @location(0) vec4<f32> {
         let scale = dot(msdf_unit, 0.5 / fwidth(in.uv.xy));
         let subpixel_dimensions = vec2(fwidth(in.uv.x) / 3., fwidth(in.uv.y));
 
-        let red = sample_subpixel(vec2(in.uv.x - subpixel_dimensions.x, 1.0 - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
-        let green = sample_subpixel(vec2(in.uv.x, 1.0 - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
-        let blue = sample_subpixel(vec2(in.uv.x + subpixel_dimensions.y, 1.0 - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
+        let red = sample_subpixel(vec2(in.uv.x - subpixel_dimensions.x, 1. - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
+        let green = sample_subpixel(vec2(in.uv.x, 1. - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
+        let blue = sample_subpixel(vec2(in.uv.x + subpixel_dimensions.y, 1. - in.uv.y), subpixel_dimensions, i32(in.uv.z), scale);
         let alpha = (red + green + blue) / 3.;
 
         return vec4(red * in.color.r, green * in.color.g, blue * in.color.b, alpha);
-- 
GitLab