File size: 1,349 Bytes
e31641a
 
 
 
 
f0ea7a1
e31641a
f0ea7a1
f9085b1
e31641a
f9085b1
c9f1ab0
f9085b1
 
 
 
c9f1ab0
f9085b1
 
 
 
 
bc345be
f9085b1
 
 
 
bc345be
 
 
f9085b1
 
e31641a
 
 
c9f1ab0
 
 
 
 
 
 
 
 
 
e31641a
c9f1ab0
e31641a
 
c9f1ab0
 
e31641a
 
f9085b1
c9f1ab0
 
 
 
 
d216aef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
struct Params {
  time : f32,
  power : f32,
}

@group(0) @binding(0)
var<uniform> params : Params;

@group(0) @binding(1)
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;
}

@compute @workgroup_size(8,8)
fn main(@builtin(global_invocation_id) 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;
}