From 3c7077f4484d78292a74024148c3ff03eb35da0a Mon Sep 17 00:00:00 2001 From: hut Date: Mon, 1 Apr 2024 03:45:32 +0200 Subject: [PATCH] even nicer rings --- assets/shaders/jupiters_rings.wgsl | 49 +++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/assets/shaders/jupiters_rings.wgsl b/assets/shaders/jupiters_rings.wgsl index be61819..95fab9f 100644 --- a/assets/shaders/jupiters_rings.wgsl +++ b/assets/shaders/jupiters_rings.wgsl @@ -140,6 +140,53 @@ fn ring_density(radius: f32) -> f32 { return 0.0; } +fn smooth_edge2(start: f32, end: f32, value: f32) -> f32 { + var x: f32 = (value - start) / (end - start); + return 4 * x * x * (1 - x * x); +} + +fn ring_density2(radius: f32) -> f32 { + let halo_inner: f32 = 92.0; + let halo_outer: f32 = 122.5; + let main_inner: f32 = 122.5; + let main_outer: f32 = 129.0; + let amalthea_inner: f32 = 129.0; + let amalthea_outer: f32 = 182.0; + let thebe_inner: f32 = 129.0; + let thebe_outer: f32 = 229.0; + let metis_notch_center: f32 = 128.0; + let metis_notch_width: f32 = 0.6; + + let halo_brightness: f32 = 0.3; + let main_brightness: f32 = 1.0; + let almathea_brightness: f32 = 0.2; + let thebe_brightness: f32 = 0.2; + + let inner_smooth_factor: f32 = 2.0; // Smooth inner edges + let outer_smooth_factor: f32 = 1.5; // Rougher outer edges + + var density: f32 = 0.0; + + if (radius >= halo_inner && radius <= halo_outer) { + density = halo_brightness * smooth_edge2(halo_inner, halo_outer, radius); + } else if (radius >= main_inner && radius <= main_outer) { + var metis_notch_effect: f32 = 1.0; + if (radius > metis_notch_center - metis_notch_width * 0.5 && radius < metis_notch_center + metis_notch_width * 0.5) { + metis_notch_effect = 0.5 * (1.0 - smooth_edge2(metis_notch_center - metis_notch_width * 0.5, metis_notch_center + metis_notch_width * 0.5, radius)); + } + density = main_brightness * metis_notch_effect * smooth_edge2(main_inner, main_outer, radius); + } else { + if (radius >= amalthea_inner && radius <= amalthea_outer) { + density = almathea_brightness * smooth_edge2(amalthea_inner, amalthea_outer, radius); + } + if (radius >= thebe_inner && radius <= thebe_outer) { + density += thebe_brightness * smooth_edge2(thebe_inner, thebe_outer, radius); + } + } + + return density; +} + @fragment fn fragment(in: VertexOutput) -> @location(0) vec4 { let jupiter_percent = jupiter_radius / ring_radius; @@ -148,7 +195,7 @@ fn fragment(in: VertexOutput) -> @location(0) vec4 { let r_uv = 2 * distance(in.uv, vec2(0.5)); let r = r_uv * ring_radius / jupiter_radius * jupiter_radius_Mm; - alpha *= ring_density(r); + alpha *= ring_density2(r); if alpha <= 0.0 { return vec4(color, alpha); }