blob: 0ded6865c63713f68be88bd976f884ebf9a1a7e3 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <impeller/types.glsl>
uniform sampler2D glyph_atlas_sampler;
uniform FragInfo {
vec2 atlas_size;
vec4 text_color;
}
frag_info;
in vec2 v_unit_position;
in vec2 v_source_position;
in vec2 v_source_glyph_size;
out vec4 frag_color;
void main() {
vec2 scale_perspective = v_source_glyph_size / frag_info.atlas_size;
vec2 offset = v_source_position / frag_info.atlas_size;
// Inspired by Metal by Example's SDF text rendering shader:
// https://github.com/metal-by-example/sample-code/blob/master/objc/12-TextRendering/TextRendering/Shaders.metal
// Outline of glyph is the isocontour with value 50%
float edge_distance = 0.5;
// Sample the signed-distance field to find distance from this fragment to the
// glyph outline
float sample_distance =
texture(glyph_atlas_sampler, v_unit_position * scale_perspective + offset)
.a;
// Use local automatic gradients to find anti-aliased anisotropic edge width,
// cf. Gustavson 2012
float edge_width = length(vec2(dFdx(sample_distance), dFdy(sample_distance)));
// Smooth the glyph edge by interpolating across the boundary in a band with
// the width determined above
float insideness = smoothstep(edge_distance - edge_width,
edge_distance + edge_width, sample_distance);
frag_color = frag_info.text_color * insideness;
}