LordXido commited on
Commit
e31641a
·
verified ·
1 Parent(s): e65cab1

Update world.wgsl

Browse files
Files changed (1) hide show
  1. world.wgsl +38 -11
world.wgsl CHANGED
@@ -1,15 +1,20 @@
 
 
 
 
 
1
  @group(0) @binding(0)
2
- var<storage, read_write> field : array<f32>;
3
 
4
  @group(0) @binding(1)
5
- var<uniform> params : vec2<f32>; // power, time
6
 
7
- fn mandelbulb(p: vec3<f32>, power: f32) -> f32 {
8
  var z = p;
9
  var dr = 1.0;
10
  var r = 0.0;
11
 
12
- for (var i = 0; i < 8; i++) {
13
  r = length(z);
14
  if (r > 2.0) { break; }
15
 
@@ -26,16 +31,38 @@ fn mandelbulb(p: vec3<f32>, power: f32) -> f32 {
26
  ) + p;
27
  }
28
 
29
- return clamp(1.0 - r / dr, 0.0, 1.0);
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
 
32
- @compute @workgroup_size(64)
33
  fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
34
- let i = gid.x;
35
- if (i >= arrayLength(&field)) { return; }
 
 
 
 
 
 
 
36
 
37
- let x = f32(i) / f32(arrayLength(&field)) * 2.0 - 1.0;
38
- let p = vec3<f32>(x, 0.0, sin(params.y) * 0.5);
39
 
40
- field[i] = mandelbulb(p, params.x);
 
 
 
41
  }
 
1
+ struct Params {
2
+ time : f32,
3
+ power : f32,
4
+ }
5
+
6
  @group(0) @binding(0)
7
+ var<uniform> params : Params;
8
 
9
  @group(0) @binding(1)
10
+ var<storage, read_write> pixels : array<f32>;
11
 
12
+ fn mandelbulbDE(p: vec3<f32>, power: f32) -> f32 {
13
  var z = p;
14
  var dr = 1.0;
15
  var r = 0.0;
16
 
17
+ for (var i = 0; i < 10; i++) {
18
  r = length(z);
19
  if (r > 2.0) { break; }
20
 
 
31
  ) + p;
32
  }
33
 
34
+ return 0.5 * log(r) * r / dr;
35
+ }
36
+
37
+ fn raymarch(ro: vec3<f32>, rd: vec3<f32>) -> f32 {
38
+ var t = 0.0;
39
+ for (var i = 0; i < 64; i++) {
40
+ let p = ro + rd * t;
41
+ let d = mandelbulbDE(p, params.power);
42
+ if (d < 0.001) { return 1.0 - f32(i) / 64.0; }
43
+ t += d;
44
+ if (t > 10.0) { break; }
45
+ }
46
+ return 0.0;
47
  }
48
 
49
+ @compute @workgroup_size(8,8)
50
  fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
51
+ let width = 256u;
52
+ let height = 256u;
53
+
54
+ if (gid.x >= width || gid.y >= height) { return; }
55
+
56
+ let uv = (vec2<f32>(gid.xy) / vec2<f32>(width, height)) * 2.0 - 1.0;
57
+
58
+ let ro = vec3<f32>(0.0, 0.0, -4.0 + sin(params.time) * 0.5);
59
+ let rd = normalize(vec3<f32>(uv, 1.5));
60
 
61
+ let c = raymarch(ro, rd);
62
+ let idx = (gid.y * width + gid.x) * 4u;
63
 
64
+ pixels[idx + 0u] = c;
65
+ pixels[idx + 1u] = c * 0.8;
66
+ pixels[idx + 2u] = c * 1.2;
67
+ pixels[idx + 3u] = 1.0;
68
  }