runmat_plot/gpu/shaders/vertex/
image_direct.rs1pub const SHADER: &str = r#"// Image shader with direct data->viewport mapping
2
3struct DirectUniforms {
4 data_min: vec2<f32>,
5 data_max: vec2<f32>,
6 viewport_min: vec2<f32>,
7 viewport_max: vec2<f32>,
8 viewport_px: vec2<f32>,
9 log_flags: vec2<u32>,
10 _pad: vec2<u32>,
11}
12
13@group(0) @binding(0)
14var<uniform> uDirect: DirectUniforms;
15
16@group(1) @binding(0)
17var imgSampler: sampler;
18
19@group(1) @binding(1)
20var imgTex: texture_2d<f32>;
21
22struct VSIn {
23 @location(0) position: vec3<f32>,
24 @location(3) uv: vec2<f32>,
25}
26
27struct VSOut {
28 @builtin(position) clip_position: vec4<f32>,
29 @location(0) uv: vec2<f32>,
30}
31
32fn transform_axis(value: f32, is_log: u32) -> f32 {
33 if (is_log != 0u) {
34 if (value <= 0.0) {
35 return 1e30;
36 }
37 return log(value) / log(10.0);
38 }
39 return value;
40}
41
42@vertex
43fn vs_main(input: VSIn) -> VSOut {
44 var out: VSOut;
45 let data_min = vec2<f32>(
46 transform_axis(uDirect.data_min.x, uDirect.log_flags.x),
47 transform_axis(uDirect.data_min.y, uDirect.log_flags.y)
48 );
49 let data_max = vec2<f32>(
50 transform_axis(uDirect.data_max.x, uDirect.log_flags.x),
51 transform_axis(uDirect.data_max.y, uDirect.log_flags.y)
52 );
53 let position = vec2<f32>(
54 transform_axis(input.position.x, uDirect.log_flags.x),
55 transform_axis(input.position.y, uDirect.log_flags.y)
56 );
57 let data_range = data_max - data_min;
58 let viewport_range = uDirect.viewport_max - uDirect.viewport_min;
59 let normalized = (position - data_min) / data_range;
60 let ndc = uDirect.viewport_min + normalized * viewport_range;
61 out.clip_position = vec4<f32>(ndc, 0.0, 1.0);
62 out.uv = input.uv;
63 return out;
64}
65
66@fragment
67fn fs_main(input: VSOut) -> @location(0) vec4<f32> {
68 let color = textureSample(imgTex, imgSampler, input.uv);
69 return color;
70}
71"#;