CabinGame/Luxe/shaders/pixel_text.emsl

50 lines
1.5 KiB
Text
Raw Normal View History

2020-09-12 09:35:28 +00:00
input View {
mat4 mvp,
mat4 proj,
mat4 proj_inverse,
mat4 view,
mat4 world, //geometry.world atm
float2 fov, //fov.x, fov.y
float2 resolution,
float4 target_region,
float4 target_region_size
}
input Font {
image2D pages[8]
}
stage vertex vert(
input { View view },
vertex in { #0 float4 pos, #1 float4 color, #2 float2 uv },
fragment out { float4 color, float2 uv, float page })
{
out.color = in.color;
out.uv = in.uv;
out.page = in.pos.w;
stage.pos = input.view.mvp * float4(in.pos.xyz, 1.0);
}
stage fragment frag(
input { Font font },
fragment in { float4 color, float2 uv, float page })
{
int page = int(in.page);
float4 msdf_sample = texture(input.font.pages[0], in.uv.xy);
if(page == 1) { msdf_sample = texture(input.font.pages[1], in.uv.xy); }
if(page == 2) { msdf_sample = texture(input.font.pages[2], in.uv.xy); }
if(page == 3) { msdf_sample = texture(input.font.pages[3], in.uv.xy); }
if(page == 4) { msdf_sample = texture(input.font.pages[4], in.uv.xy); }
if(page == 5) { msdf_sample = texture(input.font.pages[5], in.uv.xy); }
if(page == 6) { msdf_sample = texture(input.font.pages[6], in.uv.xy); }
if(page == 7) { msdf_sample = texture(input.font.pages[7], in.uv.xy); }
float r = msdf_sample.r;
float g = msdf_sample.g;
float b = msdf_sample.b;
float median = max(min(r, g), min(max(r, g), b));
float opacity = float(median > 0.5);
stage.color[0] = float4(in.color.rgb, in.color.a * opacity);
}