44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
var msdfFrag = `// Pixi texture info\r
|
|
varying vec2 vTextureCoord;\r
|
|
uniform sampler2D uSampler;\r
|
|
\r
|
|
// Tint\r
|
|
uniform vec4 uColor;\r
|
|
\r
|
|
// on 2D applications fwidth is screenScale / glyphAtlasScale * distanceFieldRange\r
|
|
uniform float uFWidth;\r
|
|
\r
|
|
void main(void) {\r
|
|
\r
|
|
// To stack MSDF and SDF we need a non-pre-multiplied-alpha texture.\r
|
|
vec4 texColor = texture2D(uSampler, vTextureCoord);\r
|
|
\r
|
|
// MSDF\r
|
|
float median = texColor.r + texColor.g + texColor.b -\r
|
|
min(texColor.r, min(texColor.g, texColor.b)) -\r
|
|
max(texColor.r, max(texColor.g, texColor.b));\r
|
|
// SDF\r
|
|
median = min(median, texColor.a);\r
|
|
\r
|
|
float screenPxDistance = uFWidth * (median - 0.5);\r
|
|
float alpha = clamp(screenPxDistance + 0.5, 0.0, 1.0);\r
|
|
if (median < 0.01) {\r
|
|
alpha = 0.0;\r
|
|
} else if (median > 0.99) {\r
|
|
alpha = 1.0;\r
|
|
}\r
|
|
\r
|
|
// Gamma correction for coverage-like alpha\r
|
|
float luma = dot(uColor.rgb, vec3(0.299, 0.587, 0.114));\r
|
|
float gamma = mix(1.0, 1.0 / 2.2, luma);\r
|
|
float coverage = pow(uColor.a * alpha, gamma); \r
|
|
\r
|
|
// NPM Textures, NPM outputs\r
|
|
gl_FragColor = vec4(uColor.rgb, coverage);\r
|
|
}\r
|
|
`;
|
|
export {
|
|
msdfFrag as default
|
|
};
|
|
//# sourceMappingURL=msdf.frag.mjs.map
|