prescale.wgsl29 lines · 1.0 KB · raw
1struct PrescaleParams {
2    width_scale: u32,
3    height_scale: u32,
4    original_height: u32,
5    output_height: u32,
6    scanline_multiplier: f32,
7}
8
9@group(0) @binding(0) var texture_in: texture_2d<f32>;
10@group(0) @binding(1) var<uniform> params: PrescaleParams;
11
12@fragment
13fn basic_prescale(@builtin(position) position: vec4f) -> @location(0) vec4f {
14    let top_left = vec2u(position.xy);
15    let input_position = top_left / vec2u(params.width_scale, params.height_scale);
16    return textureLoad(texture_in, input_position, 0);
17}
18
19@fragment
20fn scanlines(@builtin(position) position: vec4f) -> @location(0) vec4f {
21    let top_left = vec2u(position.xy);
22    let input_position = top_left / vec2u(params.width_scale, params.height_scale);
23
24    let texture_color = textureLoad(texture_in, input_position, 0).rgb;
25
26    let crt_line = top_left.y * 2 * params.original_height / params.output_height;
27    let color = select(texture_color, texture_color * params.scanline_multiplier, (crt_line % 2) == 1);
28    return vec4f(color, 1.0);
29}