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 page0, image2D page1, image2D page2, image2D page3, image2D page4, image2D page5, image2D page6, image2D page7 } 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.page0, in.uv.xy); if(page == 1) { msdf_sample = texture(input.font.page1, in.uv.xy); } if(page == 2) { msdf_sample = texture(input.font.page2, in.uv.xy); } if(page == 3) { msdf_sample = texture(input.font.page3, in.uv.xy); } if(page == 4) { msdf_sample = texture(input.font.page4, in.uv.xy); } if(page == 5) { msdf_sample = texture(input.font.page5, in.uv.xy); } if(page == 6) { msdf_sample = texture(input.font.page6, in.uv.xy); } if(page == 7) { msdf_sample = texture(input.font.page7, 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 = step(0.5, median); stage.color[0] = float4(in.color.rgb, in.color.a * opacity); }