UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

44 lines (42 loc) 1.72 kB
var msdf_default = ` uniform sampler2D texture_msdfMap; float median(float r, float g, float b) { return max(min(r, g), min(max(r, g), b)); } uniform float font_sdfIntensity; uniform float font_pxrange; #ifndef LIT_MSDF_TEXT_ATTRIBUTE uniform vec4 outline_color; uniform float outline_thickness; uniform vec4 shadow_color; uniform vec2 shadow_offset; #else varying vec4 outline_color; varying float outline_thickness; varying vec4 shadow_color; varying vec2 shadow_offset; #endif vec4 applyMsdf(vec4 color) { color.rgb = gammaCorrectInput(color.rgb); vec3 tsample = texture2D(texture_msdfMap, vUv0).rgb; vec2 uvShdw = vUv0 - shadow_offset; vec3 ssample = texture2D(texture_msdfMap, uvShdw).rgb; float sigDist = median(tsample.r, tsample.g, tsample.b); float sigDistShdw = median(ssample.r, ssample.g, ssample.b); float edge = 0.5 - 0.5 * font_sdfIntensity; vec2 unitRange = vec2(font_pxrange) / vec2(textureSize(texture_msdfMap, 0)); float screenPxRange = max(0.5 * dot(unitRange, 1.0 / max(fwidth(vUv0), vec2(1e-6))), 2.5); float inside = clamp(screenPxRange * (sigDist - edge) + 0.5, 0.0, 1.0); float outline = clamp(screenPxRange * (sigDist + outline_thickness - edge) + 0.5, 0.0, 1.0); float shadow = clamp(screenPxRange * (sigDistShdw + outline_thickness - edge) + 0.5, 0.0, 1.0); vec4 tcolor = (outline > inside) ? outline * vec4(outline_color.a * outline_color.rgb, outline_color.a) : vec4(0.0); tcolor = mix(tcolor, color, inside); vec4 scolor = (shadow > outline) ? shadow * vec4(shadow_color.a * shadow_color.rgb, shadow_color.a) : tcolor; tcolor = mix(scolor, tcolor, outline); tcolor.rgb = gammaCorrectOutput(tcolor.rgb); return tcolor; } `; export { msdf_default as default };