CodexCapsule / world.wgsl
LordXido's picture
Update world.wgsl
c9f1ab0 verified
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;
}