Spaces:
Running
Running
| struct Params { | |
| time : f32, | |
| power : f32, | |
| } | |
| var<uniform> params : Params; | |
| var<storage, read_write> pixels : array<f32>; | |
| fn mandelbulb(p: vec3<f32>, power: f32) -> f32 { | |
| var z = p; | |
| var dr = 1.0; | |
| var r = 0.0; | |
| for (var i = 0; i < 8; i++) { | |
| r = length(z); | |
| if (r > 2.0) { break; } | |
| let theta = acos(z.z / r); | |
| let phi = atan2(z.y, z.x); | |
| dr = pow(r, power - 1.0) * power * dr + 1.0; | |
| let zr = pow(r, power); | |
| z = zr * vec3<f32>( | |
| sin(theta * power) * cos(phi * power), | |
| sin(theta * power) * sin(phi * power), | |
| cos(theta * power) | |
| ) + p; | |
| } | |
| return 0.5 * log(r) * r / dr; | |
| } | |
| fn main( id : vec3<u32>) { | |
| let w = 256u; | |
| let h = 256u; | |
| if (id.x >= w || id.y >= h) { return; } | |
| let uv = (vec2<f32>(id.xy) / vec2<f32>(w, h)) * 2.0 - 1.0; | |
| let ro = vec3<f32>(0.0, 0.0, -4.0 + sin(params.time)); | |
| let rd = normalize(vec3<f32>(uv, 1.5)); | |
| var t = 0.0; | |
| var hit = 0.0; | |
| for (var i = 0; i < 64; i++) { | |
| let p = ro + rd * t; | |
| let d = mandelbulb(p, params.power); | |
| if (d < 0.001) { hit = 1.0 - f32(i)/64.0; break; } | |
| t += d; | |
| } | |
| let idx = (id.y * w + id.x) * 4u; | |
| pixels[idx] = hit; | |
| pixels[idx + 1] = hit * 0.8; | |
| pixels[idx + 2] = hit * 1.2; | |
| pixels[idx + 3] = 1.0; | |
| } |