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); }