struct Params { time : f32, power : f32, } @group(0) @binding(0) var params : Params; @group(0) @binding(1) var pixels : array; fn mandelbulb(p: vec3, 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( sin(theta * power) * cos(phi * power), sin(theta * power) * sin(phi * power), cos(theta * power) ) + p; } return 0.5 * log(r) * r / dr; } @compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id : vec3) { let w = 256u; let h = 256u; if (id.x >= w || id.y >= h) { return; } let uv = (vec2(id.xy) / vec2(w, h)) * 2.0 - 1.0; let ro = vec3(0.0, 0.0, -4.0 + sin(params.time)); let rd = normalize(vec3(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; }