keid-render-basic-0.1.7.0: src/Render/Font/EvanwSdf/Code.hs
module Render.Font.EvanwSdf.Code
( vert
, frag
) where
import RIO
import Render.Code (Code, glsl)
import Render.DescSets.Set0.Code (set0binding0, set0binding1, set0binding2)
vert :: Code
vert = fromString
[glsl|
#version 450
${set0binding0}
layout(location = 0) in vec4 iVert;
layout(location = 1) in vec4 iFrag;
layout(location = 2) in vec4 iColor;
layout(location = 3) in vec4 iOutlineColor;
layout(location = 4) in ivec2 iTextureIds;
layout(location = 5) in vec2 iSdf;
layout(location = 0) out vec2 fTexCoord;
layout(location = 1) flat out vec4 fColor;
layout(location = 2) flat out vec4 fOutlineColor;
layout(location = 3) flat out ivec2 fTextureIds;
layout(location = 4) flat out vec2 fSdf;
vec2 positions[6] = vec2[](
vec2(-0.5, 0.5),
vec2(0.5, 0.5),
vec2(-0.5, -0.5),
vec2(0.5, -0.5),
vec2(-0.5, -0.5),
vec2(0.5, 0.5)
);
vec2 texCoords[6] = vec2[](
vec2(0.0, 0.0),
vec2(1.0, 0.0),
vec2(0.0, 1.0),
vec2(1.0, 1.0),
vec2(0.0, 1.0),
vec2(1.0, 0.0)
);
void main() {
vec2 pos = positions[gl_VertexIndex];
gl_Position
= scene.projection
* scene.view
// TODO: * iModel
* vec4(iVert.xy + pos * iVert.zw, 0, 1.0);
vec2 uv = texCoords[gl_VertexIndex];
fTexCoord = iFrag.xy + uv * iFrag.zw;
fColor = iColor;
fOutlineColor = iOutlineColor;
fTextureIds = iTextureIds;
fSdf = iSdf;
}
|]
frag :: Code
frag = fromString
[glsl|
#version 450
#extension GL_EXT_nonuniform_qualifier : enable
${set0binding1}
${set0binding2}
layout(location = 0) in vec2 fTexCoord;
layout(location = 1) flat in vec4 fColor;
layout(location = 2) flat in vec4 fOutlineColor;
layout(location = 3) flat in ivec2 fTextureIds;
layout(location = 4) flat in vec2 fSdf;
layout(location = 0) out vec4 outColor;
void main() {
float sdf = texture(
sampler2D(
textures[nonuniformEXT(fTextureIds.t)],
samplers[nonuniformEXT(fTextureIds.s)]
),
fTexCoord
).r;
float smoothing = fSdf[0];
float outlineWidth = fSdf[1];
float outerEdgeCenter = 0.5 - outlineWidth;
float alpha = smoothstep(
outerEdgeCenter - smoothing,
outerEdgeCenter + smoothing,
sdf
);
float border = smoothstep(
0.5 - smoothing,
0.5 + smoothing,
sdf
);
outColor = mix(fOutlineColor, fColor, border);
outColor *= alpha;
}
|]