Backlog/engine/_archive/ui/shaders/FontSDF.frag

70 lines
2.0 KiB
GLSL

#version 460
layout (location = 0) in vec4 color;
layout (location = 1) in vec2 texCoord;
layout (location = 2) flat in int instanceId;
layout (location = 3) in vec2 pixelPosition;
layout (location = 0) out vec4 outFragColor;
layout (set = 1, binding = 0) uniform sampler2D tex;
#include "FontSDFShared.glsl"
#include "FragmentHelpers.glsl"
void main() {
vec4 tex = texture(tex, texCoord);
uint isSdf = fontBuffer.fontInfo[instanceId].isSdf;
vec2 position = fontBuffer.fontInfo[instanceId].position;
vec2 size = fontBuffer.fontInfo[instanceId].size;
if(!scissor(pixelPosition, position, size))
{
discard;
}
if(isSdf == 1)
{
float dist = tex.r;
float width = fwidth(dist);
vec4 textColor = clamp(color, 0.0, 1.0);
float outerEdge = 1.0f - (120.0f / 255.0f);
float alpha = contour(dist, outerEdge, width);
float dscale = 0.354; // half of 1/sqrt2; you can play with this
vec2 uv = texCoord.xy;
vec2 duv = dscale * (dFdx(uv) + dFdy(uv));
vec4 box = vec4(uv - duv, uv + duv);
float asum = getSample(box.xy, outerEdge, width)
+ getSample(box.zw, outerEdge, width)
+ getSample(box.xw, outerEdge, width)
+ getSample(box.zy, outerEdge, width);
// weighted average, with 4 extra points having 0.5 weight each,
// so 1 + 0.5*4 = 3 is the divisor
alpha = (alpha + 0.5 * asum) / 3.0;
textColor = vec4(color.xyz, alpha);//textColor.* alpha);
textColor.xyz = pow(textColor.xyz, vec3(2.2)); // gamma correction
// Premultiplied alpha output.
outFragColor = textColor;
}
else {
float alpha = 1.0;
float gray = dot(color.xyz, vec3(0.2126, 0.7152, 0.0722));
outFragColor = vec4(color.xyz , pow(tex.x / gray, 1/(2.2)) );//textColor.* alpha);
//outFragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
/* debug test.
if(!rect(pixelPosition, position, size))
{
outFragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
*/
}