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}