3#define_import_path bevy_post_process::effect_stack::vignette 5#import bevy_post_process::effect_stack::chromatic_aberration::source_texture 9struct VignetteSettings { 15 edge_compensation: f32, 20const VISUAL_THRESHOLD: f32 = 1e-4; 23@group(0) @binding(4) var<uniform> vignette_settings: VignetteSettings; 25fn vignette(uv: vec2<f32>, color: vec3<f32>) -> vec3<f32> { 26 let intensity = vignette_settings.intensity; 27 if (intensity < VISUAL_THRESHOLD) { 30 let radius = vignette_settings.radius; 31 let smoothness = vignette_settings.smoothness; 32 let roundness = vignette_settings.roundness; 33 let edge_comp = vignette_settings.edge_compensation; 36 let dims = textureDimensions(source_texture); 37 let resolution = vec2<f32>(dims.xy); 38 let screen_aspect = resolution.x / resolution.y; 44 let aspect_ratio = resolution / min(resolution.x, resolution.y); 47 let centered_uv = uv - 0.5; 54 let offset = (vignette_settings.center - 0.5) * vec2<f32>(1.0, resolution.y / resolution.x); 56 let uv_from_center = centered_uv - offset; 57 var scale_vec = aspect_ratio * vec2<f32>(1.0, 1.0 / roundness); 60 if (screen_aspect >= 1.0) { 61 let compensation_factor = mix(1.0, 1.0 / screen_aspect, edge_comp); 62 scale_vec.x *= compensation_factor; 64 let compensation_factor = mix(1.0, screen_aspect, edge_comp); 65 scale_vec.y *= compensation_factor; 68 let final_uv = uv_from_center * scale_vec; 71 let dist = length(final_uv) * (1.0 / radius); 72 let base_curve = 1.0 - (dist * dist); 73 let clamped_factor = clamp(base_curve, 0.0, 1.0); 74 let factor = pow(clamped_factor, smoothness); 77 return mix(color, vignette_settings.color.rgb, (1.0 - factor) * intensity);