3import package::effect_stack::chromatic_aberration::source_texture; 7struct VignetteSettings { 13 edge_compensation: f32, 18const VISUAL_THRESHOLD: f32 = 1e-4; 21@group(0) @binding(4) var<uniform> vignette_settings: VignetteSettings; 23fn vignette(uv: vec2<f32>, color: vec3<f32>) -> vec3<f32> { 24 let intensity = vignette_settings.intensity; 25 if (intensity < VISUAL_THRESHOLD) { 28 let radius = vignette_settings.radius; 29 let smoothness = vignette_settings.smoothness; 30 let roundness = vignette_settings.roundness; 31 let edge_comp = vignette_settings.edge_compensation; 34 let dims = textureDimensions(source_texture); 35 let resolution = vec2<f32>(dims.xy); 36 let screen_aspect = resolution.x / resolution.y; 42 let aspect_ratio = resolution / min(resolution.x, resolution.y); 45 let centered_uv = uv - 0.5; 52 let offset = (vignette_settings.center - 0.5) * vec2<f32>(1.0, resolution.y / resolution.x); 54 let uv_from_center = centered_uv - offset; 55 var scale_vec = aspect_ratio * vec2<f32>(1.0, 1.0 / roundness); 58 if (screen_aspect >= 1.0) { 59 let compensation_factor = mix(1.0, 1.0 / screen_aspect, edge_comp); 60 scale_vec.x *= compensation_factor; 62 let compensation_factor = mix(1.0, screen_aspect, edge_comp); 63 scale_vec.y *= compensation_factor; 66 let final_uv = uv_from_center * scale_vec; 69 let dist = length(final_uv) * (1.0 / radius); 70 let base_curve = 1.0 - (dist * dist); 71 let clamped_factor = clamp(base_curve, 0.0, 1.0); 72 let factor = pow(clamped_factor, smoothness); 75 return mix(color, vignette_settings.color.rgb, (1.0 - factor) * intensity);