70 lines
2.0 KiB
GLSL
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);
|
|
}
|
|
*/
|
|
}
|