@yali-engine/clouds 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clouds-shaders.gen.d.ts +7 -2
- package/dist/clouds-shaders.gen.js +7 -2
- package/dist/clouds-shaders.gen.js.map +1 -1
- package/dist/clouds.d.ts +37 -1
- package/dist/clouds.js +278 -7
- package/dist/clouds.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/shafts.d.ts +33 -0
- package/dist/shafts.js +123 -0
- package/dist/shafts.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/** Linked from shaders/clouds/clouds.wesl. */
|
|
2
2
|
export declare const cloudsShader: {
|
|
3
|
-
readonly hash: "
|
|
4
|
-
readonly wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;";
|
|
3
|
+
readonly hash: "23dcb67d558117a2";
|
|
4
|
+
readonly wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\nsmap: vec4f,\namb: vec4f,\nevolve: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(18) var shadow_out: texture_storage_2d<rgba16float, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nvar wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (cp.evolve.x > 0.0 && wx.x > 0.004) {\nlet w2 = textureSampleLevel(weather_tex, clamp_smp, (xz + cp.evolve.zw - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).x;\nwx.x = saturate(wx.x * (1.0 + (w2 - 0.5) * 2.0 * cp.evolve.x));\n}\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET - cp.evolve.y, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603 - cp.amb.rgb;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet diffuse = max(s.y, 0.0) / (1.0 + 0.1125 * tau) / PI;\nlet scatter = sun * (ms + diffuse * powder) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\n@compute @workgroup_size(8, 8) fn shadow_map(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shadow_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nif (cp.smap.w < 3.5 && id.y % 4u != u32(cp.smap.w)) {\nreturn;\n}\nlet rel = cp.smap.xy - cp.eye.xy + ((vec2f(id.xy) + 0.5) / vec2f(n) - 0.5) * cp.smap.z;\nlet o = vec3f(rel.x, PLANET, rel.y);\nlet s = cp.sun.xyz;\nlet sy = max(s.y, 0.05);\nlet t0 = cp.layer.x / sy;\nlet t1 = min(cp.layer.y / sy, t0 + 40.0);\nlet steps = 16u;\nlet dt = (t1 - t0) / f32(steps);\nvar tau = 0.0;\nfor (var i = 0u; i < steps; i++) {\ntau += density(o + s * (t0 + dt * (f32(i) + 0.5)), true, 1.0) * dt;\n}\nlet light = max(exp(-tau), 0.7 * exp(-0.25 * tau));\ntextureStore(shadow_out, vec2i(id.xy), vec4f(select(1.0, light, s.y > 0.0), 0.0, 0.0, 1.0));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\n@group(0) @binding(19) var<storage, read_write> sh_rows: array<vec4f>;\nvar<workgroup> sh_wg: array<array<vec3f, 9>, 64>;\nfn sh_basis(d: vec3f) -> array<f32, 9> {\nreturn array<f32, 9>(0.282095, 0.488603 * d.y, 0.488603 * d.z, 0.488603 * d.x, 1.092548 * d.x * d.y, 1.092548 * d.y * d.z, 0.315392 * (3.0 * d.z * d.z - 1.0), 1.092548 * d.x * d.z, 0.546274 * (d.x * d.x - d.y * d.y));\n}\nfn sh_reduce(li: u32, acc: array<vec3f, 9>) {\nsh_wg[li] = acc;\nworkgroupBarrier();\nfor (var s = 32u; s > 0u; s >>= 1u) {\nif (li < s) {\nfor (var k = 0u; k < 9u; k++) {\nsh_wg[li][k] += sh_wg[li + s][k];\n}\n}\nworkgroupBarrier();\n}\n}\n@compute @workgroup_size(64) fn pano_sh(@builtin(workgroup_id) wg: vec3u, @builtin(local_invocation_index) li: u32) {\nlet n = vec2u(cp.pano.zw);\nlet row = wg.x;\nvar acc: array<vec3f, 9>;\nlet v = (f32(row) + 0.5) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet d_omega = (2.0 * PI / f32(n.x)) * (2.0 * v / f32(n.y));\nfor (var x = li; x < n.x; x += 64u) {\nlet az = 2.0 * PI * (f32(x) + 0.5) / f32(n.x);\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet c = textureLoad(pano_prev, vec2i(i32(x), i32(row)), 0);\nlet sky = sky_view_at(sky_view, clamp_smp, d, cp.sun.xyz, cp.eye.z) * lighting.view.rgb;\nlet delta = c.rgb - sky * (1.0 - c.a);\nlet y = sh_basis(d);\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += delta * (y[k] * d_omega);\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nsh_rows[row * 9u + li] = vec4f(sh_wg[0][li], 0.0);\n}\n}\n@compute @workgroup_size(64) fn pano_sh_sum(@builtin(local_invocation_index) li: u32) {\nlet rows = u32(cp.pano.w);\nvar acc: array<vec3f, 9>;\nfor (var r = li; r < rows; r += 64u) {\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += sh_rows[r * 9u + k].rgb;\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nlet band = select(select(1.0 / 4.0, 2.0 / 3.0, li >= 1u && li <= 3u), 1.0, li == 0u);\nsh_rows[rows * 9u + li] = vec4f(sh_wg[0][li] * band, 0.0);\n}\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;";
|
|
5
|
+
};
|
|
6
|
+
/** Linked from shaders/clouds/shafts.wesl. */
|
|
7
|
+
export declare const shaftsShader: {
|
|
8
|
+
readonly hash: "c067ed30af3fab0a";
|
|
9
|
+
readonly wgsl: "const FOUR_PI = 12.5663706;\nconst SAMPLES = 8u;\nstruct ShaftParams {\ninv_view_proj: mat4x4f,\nsun: vec4f,\nsmap: vec4f,\nrange: vec4f,\n}\n@group(0) @binding(0) var<uniform> sh: ShaftParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var scene_depth: texture_depth_2d;\n@group(0) @binding(3) var shadow_map: texture_2d<f32>;\n@group(0) @binding(4) var smp: sampler;\nstruct ShaftOut { @builtin(position) clip: vec4f }\n@vertex fn vs(@builtin(vertex_index) i: u32) -> ShaftOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: ShaftOut;\no.clip = vec4f(p, 0.0, 1.0);\nreturn o;\n}\nfn sunlit(x: vec3f, l: vec3f) -> f32 {\nlet at = x - l * ((x.y - sh.range.x) / max(l.y, 0.05));\nlet uv = (at.xz - sh.smap.xy) * sh.smap.z + 0.5;\nlet edge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y));\nreturn mix(1.0, textureSampleLevel(shadow_map, smp, uv, 0.0).r, saturate(edge * 16.0));\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@fragment fn fs(in: ShaftOut) -> @location(0) vec4f {\nlet fog = lighting.fog;\nlet fog2 = lighting.fog2;\nlet l = sh.sun.xyz;\nif (sh.smap.w < 0.5 || (fog.x <= 0.0 && fog2.x <= 0.0) || fog2.y <= 0.0 || l.y <= 0.0) {\ndiscard;\n}\nlet px = vec2i(in.clip.xy);\nlet size = vec2f(textureDimensions(scene_depth));\nlet ndc = vec2f(in.clip.x / size.x * 2.0 - 1.0, 1.0 - in.clip.y / size.y * 2.0);\nlet d = textureLoad(scene_depth, px, 0);\nlet w4 = sh.inv_view_proj * vec4f(ndc, select(d, 1.0, d <= 0.0), 1.0);\nlet q = w4.xyz / w4.w;\nlet dir = normalize(q);\nvar dist = select(length(q), fog2.w, d <= 0.0);\nif (dir.y > 1e-4) {\ndist = min(dist, sh.range.y / dir.y);\n}\ndist = min(dist, sh.range.z);\nif (dist <= 1.0) {\ndiscard;\n}\nlet t_end = exp(-(lighting.fog_air.rgb * (fog2.x * dist) + vec3f(height_fog_depth(fog, dir, dist))));\nlet g = fog2.z;\nlet c = dot(dir, l);\nlet phase = (1.0 - g * g) / (FOUR_PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\nlet sun_in = lighting.sun_color.rgb * (phase * fog2.y) * (vec3f(1.0) - t_end);\nif (dot(sun_in, vec3f(0.2126, 0.7152, 0.0722)) * lighting.env.z < 4e-4) {\ndiscard;\n}\nlet sigma = max(-log(max(dot(t_end, vec3f(0.3333)), 1e-4)) / dist, 1e-6);\nlet j = ign(in.clip.xy, sh.sun.w);\nvar lit = 0.0;\nvar wsum = 0.0;\nfor (var i = 0u; i < SAMPLES; i++) {\nlet t = (f32(i) + j) / f32(SAMPLES) * dist;\nlet w = exp(-sigma * t);\nlit += w * sunlit(dir * t, l);\nwsum += w;\n}\nlet shade = 1.0 - lit / wsum;\nreturn vec4f(-sun_in * shade * sh.range.w * lighting.env.z, 0.0);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn height_fog_depth(fog: vec4f, dir: vec3f, dist: f32) -> f32 {\nif (fog.x <= 0.0) {\nreturn 0.0;\n}\nlet falloff = max(fog.y, 1e-5);\nlet len = max(dist - fog.w, 0.0);\nlet h0 = fog.z + dir.y * min(dist, fog.w);\nlet k = falloff * dir.y * len;\nlet shape = select((1.0 - exp(-k)) / k, 1.0 - 0.5 * k, abs(k) < 1e-3);\nreturn fog.x * exp(-falloff * h0) * len * shape;\n}";
|
|
5
10
|
};
|
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
// Regenerate with `node tools/shaders-gen.mjs`; CI runs it with --check.
|
|
3
3
|
/** Linked from shaders/clouds/clouds.wesl. */
|
|
4
4
|
export const cloudsShader = {
|
|
5
|
-
hash: '
|
|
6
|
-
wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nlet wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet scatter = sun * (ms * powder * 2.5) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;",
|
|
5
|
+
hash: '23dcb67d558117a2',
|
|
6
|
+
wgsl: "const PI = 3.14159265;\nconst PLANET = 6360.0;\nstruct CloudParams {\ninv_view_proj: mat4x4f,\nprev_view_proj: mat4x4f,\nsun: vec4f,\neye: vec4f,\nlayer: vec4f,\nshape: vec4f,\nsize: vec4f,\nquality: vec4f,\nlook: vec4f,\npano: vec4f,\nwmap: vec4f,\nsmap: vec4f,\namb: vec4f,\nevolve: vec4f,\n}\n@group(0) @binding(0) var<uniform> cp: CloudParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var sky_view: texture_2d<f32>;\n@group(0) @binding(3) var clamp_smp: sampler;\n@group(0) @binding(4) var shape_tex: texture_3d<f32>;\n@group(0) @binding(5) var detail_tex: texture_3d<f32>;\n@group(0) @binding(6) var wrap_smp: sampler;\n@group(0) @binding(7) var shape_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(8) var detail_out: texture_storage_3d<rgba8unorm, write>;\n@group(0) @binding(9) var current_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(10) var current: texture_2d<f32>;\n@group(0) @binding(11) var history: texture_2d<f32>;\n@group(0) @binding(12) var history_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(13) var pano_out: texture_storage_2d<rgba16float, write>;\n@group(0) @binding(14) var scene_depth: texture_depth_2d;\n@group(0) @binding(15) var pano_prev: texture_2d<f32>;\n@group(0) @binding(16) var weather_tex: texture_2d<f32>;\n@group(0) @binding(17) var weather_out: texture_storage_2d<rgba8unorm, write>;\n@group(0) @binding(18) var shadow_out: texture_storage_2d<rgba16float, write>;\nfn pcg(v: u32) -> u32 {\nlet state = v * 747796405u + 2891336453u;\nlet word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\nreturn (word >> 22u) ^ word;\n}\nfn hash3(c: vec3i, seed: u32) -> vec3f {\nlet h = pcg(bitcast<u32>(c.x) ^ pcg(bitcast<u32>(c.y) ^ pcg(bitcast<u32>(c.z) ^ seed)));\nlet h2 = pcg(h);\nlet h3 = pcg(h2);\nreturn vec3f(f32(h), f32(h2), f32(h3)) / 4294967296.0;\n}\nfn wrap3(c: vec3i, period: i32) -> vec3i {\nreturn ((c % period) + period) % period;\n}\nfn perlin(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nlet u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\nvar n: array<f32, 8>;\nfor (var k = 0; k < 8; k++) {\nlet o = vec3i(k & 1, (k >> 1) & 1, (k >> 2) & 1);\nlet g = normalize(hash3(wrap3(i + o, period), seed) * 2.0 - 1.0);\nn[k] = dot(g, f - vec3f(o));\n}\nlet x0 = mix(mix(n[0], n[1], u.x), mix(n[2], n[3], u.x), u.y);\nlet x1 = mix(mix(n[4], n[5], u.x), mix(n[6], n[7], u.x), u.y);\nreturn mix(x0, x1, u.z) * 1.4;\n}\nfn worley(p: vec3f, period: i32, seed: u32) -> f32 {\nlet i = vec3i(floor(p));\nlet f = fract(p);\nvar d = 8.0;\nfor (var k = 0; k < 27; k++) {\nlet o = vec3i(k % 3 - 1, (k / 3) % 3 - 1, k / 9 - 1);\nlet q = vec3f(o) + hash3(wrap3(i + o, period), seed) - f;\nd = min(d, dot(q, q));\n}\nreturn 1.0 - saturate(sqrt(d));\n}\nfn worley_fbm(p: vec3f, period: i32, seed: u32) -> f32 {\nreturn worley(p, period, seed) * 0.625 + worley(p * 2.0, period * 2, seed + 1u) * 0.25 + worley(p * 4.0, period * 4, seed + 2u) * 0.125;\n}\nfn remap(v: f32, a: f32, b: f32, c: f32, d: f32) -> f32 {\nreturn c + (v - a) / max(b - a, 1e-5) * (d - c);\n}\n@compute @workgroup_size(4, 4, 4) fn gen_shape(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shape_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\nvar pf = 0.0;\nvar amp = 0.5;\nvar per = 4;\nfor (var o = 0; o < 4; o++) {\npf += amp * perlin(uvw * f32(per), per, 11u + u32(o));\namp *= 0.5;\nper *= 2;\n}\npf = saturate(pf * 0.5 + 0.5);\nlet w4 = worley_fbm(uvw * 4.0, 4, 101u);\nlet w8 = worley_fbm(uvw * 8.0, 8, 211u);\nlet w16 = worley_fbm(uvw * 16.0, 16, 307u);\nlet pw = saturate(remap(pf, w4 - 1.0, 1.0, 0.0, 1.0));\ntextureStore(shape_out, vec3i(id), vec4f(pw, w4, w8, w16));\n}\n@compute @workgroup_size(4, 4, 4) fn gen_detail(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(detail_out);\nif (any(id >= n)) {\nreturn;\n}\nlet uvw = (vec3f(id) + 0.5) / vec3f(n);\ntextureStore(detail_out, vec3i(id), vec4f(worley_fbm(uvw * 2.0, 2, 401u), worley_fbm(uvw * 4.0, 4, 503u), worley_fbm(uvw * 8.0, 8, 601u), 1.0));\n}\nfn hash2(p: vec2f) -> f32 {\nlet q = vec2<i32>(floor(p));\nreturn f32(pcg(bitcast<u32>(q.x) ^ pcg(bitcast<u32>(q.y) + 0x9e3779b9u))) / 4294967296.0;\n}\nfn vnoise(p: vec2f) -> f32 {\nlet i = floor(p);\nlet f = fract(p);\nlet u = f * f * (3.0 - 2.0 * f);\nreturn mix(mix(hash2(i), hash2(i + vec2f(1.0, 0.0)), u.x), mix(hash2(i + vec2f(0.0, 1.0)), hash2(i + vec2f(1.0, 1.0)), u.x), u.y);\n}\nfn fbm2(p0: vec2f) -> f32 {\nvar p = p0;\nvar a = 0.5;\nvar s = 0.0;\nfor (var i = 0; i < 4; i++) {\ns += a * vnoise(p);\np = mat2x2f(1.6, 1.2, -1.2, 1.6) * p + vec2f(3.1, 1.7);\na *= 0.5;\n}\nreturn s / 0.9375;\n}\nfn weather(xz: vec2f) -> vec2f {\nlet q = xz / cp.look.x;\nlet w = fbm2(q);\nlet cov = saturate(remap(w, 1.0 - cp.layer.z * 1.15, 1.0, 0.0, 1.0));\nlet kind = saturate(0.5 + (fbm2(q * 0.37 + vec2f(13.0, 7.0)) - 0.5) * 2.0 * cp.look.y);\nreturn vec2f(cov, kind);\n}\nfn profile(h: f32, kind: f32) -> f32 {\nlet base = saturate(remap(h, 0.0, 0.08, 0.0, 1.0));\nlet top = saturate(remap(h, 0.25 + 0.6 * kind, 0.35 + 0.65 * kind, 1.0, 0.0));\nreturn base * top;\n}\n@compute @workgroup_size(8, 8) fn gen_weather(@builtin(global_invocation_id) id: vec3u) {\nlet n = u32(cp.wmap.w);\nif (id.x >= n || id.y >= n) {\nreturn;\n}\nlet xz = cp.wmap.xy + ((vec2f(id.xy) + 0.5) / f32(n) - 0.5) * cp.wmap.z;\ntextureStore(weather_out, vec2i(id.xy), vec4f(weather(xz), 0.0, 1.0));\n}\nfn base_cloud(p: vec3f, far: f32) -> vec4f {\nlet r = length(p);\nlet h = (r - PLANET - cp.layer.x) / (cp.layer.y - cp.layer.x);\nif (h <= 0.0 || h >= 1.0) {\nreturn vec4f(0.0);\n}\nlet xz = p.xz + cp.eye.xy + cp.shape.zw;\nvar wx = textureSampleLevel(weather_tex, clamp_smp, (xz - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).xy;\nif (cp.evolve.x > 0.0 && wx.x > 0.004) {\nlet w2 = textureSampleLevel(weather_tex, clamp_smp, (xz + cp.evolve.zw - cp.wmap.xy) / cp.wmap.z + 0.5, 0.0).x;\nwx.x = saturate(wx.x * (1.0 + (w2 - 0.5) * 2.0 * cp.evolve.x));\n}\nif (wx.x <= 0.004) {\nreturn vec4f(0.0, h, xz);\n}\nlet prof = profile(h, wx.y);\nif (prof <= 0.0) {\nreturn vec4f(0.0, h, xz);\n}\nlet q = vec3f(xz.x, r - PLANET - cp.evolve.y, xz.y) / (cp.shape.x * far);\nlet s = textureSampleLevel(shape_tex, wrap_smp, q, 0.0);\nlet fb = s.g * 0.625 + s.b * 0.25 + s.a * 0.125;\nlet base = saturate(remap(s.r, fb - 1.0, 1.0, 0.0, 1.0));\nreturn vec4f(saturate(remap(base * prof, 1.0 - wx.x, 1.0, 0.0, 1.0)) * wx.x, h, xz);\n}\nfn eroded(b: vec4f, alt: f32) -> f32 {\nlet d = textureSampleLevel(detail_tex, wrap_smp, vec3f(b.z, alt, b.w) / cp.shape.y, 0.0);\nlet df = d.r * 0.625 + d.g * 0.25 + d.b * 0.125;\nlet e = mix(df, 1.0 - df, saturate(b.y * 5.0));\nreturn saturate(remap(b.x, e * 0.35 * cp.look.w, 1.0, 0.0, 1.0)) * cp.layer.w;\n}\nfn density(p: vec3f, full: bool, far: f32) -> f32 {\nlet b = base_cloud(p, far);\nif (b.x <= 0.0) {\nreturn 0.0;\n}\nif (full) {\nreturn eroded(b, length(p) - PLANET);\n}\nreturn b.x * cp.layer.w;\n}\nfn hg(c: f32, g: f32) -> f32 {\nreturn (1.0 - g * g) / (4.0 * PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\n}\nfn phase(c: f32, k: f32) -> f32 {\nreturn mix(hg(c, -0.2 * k), hg(c, 0.75 * k), 0.6);\n}\nfn sun_depth(p: vec3f, steps: u32) -> f32 {\nlet s = cp.sun.xyz;\nvar tau = 0.0;\nvar t = 0.0;\nvar dt = 0.06;\nfor (var i = 0u; i < steps; i++) {\nlet m = t + dt * 0.5;\ntau += density(p + s * m, i < 2u, 1.0) * dt;\nt += dt;\ndt *= 2.1;\n}\nreturn tau;\n}\nfn ambient(h: f32) -> vec3f {\nlet up = lighting.sh[0].rgb * 0.282095 + lighting.sh[1].rgb * 0.488603 - cp.amb.rgb;\nreturn max(up, vec3f(0.0)) * mix(0.45, 1.0, h);\n}\nfn march(d: vec3f, jitter: f32, steps_max: f32, steps_min: f32, sun_steps: u32, octaves: u32) -> vec4f {\nlet o = vec3f(0.0, cp.eye.z, 0.0);\nlet b = dot(o, d);\nlet rb = PLANET + cp.layer.x;\nlet rt = PLANET + cp.layer.y;\nlet cb = dot(o, o) - rb * rb;\nlet ct = dot(o, o) - rt * rt;\nif (d.y < -0.05 || cb > 0.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet t0 = -b + sqrt(max(b * b - cb, 0.0));\nvar t1 = -b + sqrt(max(b * b - ct, 0.0));\nt1 = min(t1, t0 + 40.0);\nif (t0 > 220.0) {\nreturn vec4f(0.0, 0.0, 0.0, 1.0);\n}\nlet n = mix(steps_max, steps_min, saturate(d.y));\nlet dt = (t1 - t0) / n;\nlet s = cp.sun.xyz;\nlet cosv = dot(d, s);\nlet sun = lighting.sun_color.rgb;\nvar light = vec3f(0.0);\nvar trans = 1.0;\nvar dist_sum = 0.0;\nvar weight = 0.0;\nvar t = t0 + dt * jitter;\nvar empty = 0u;\nvar last = dt;\nlet rays = u32(n) * 2u;\nfor (var i = 0u; i < rays; i++) {\nif (t >= t1 || trans < 0.01) {\nbreak;\n}\nvar p = o + d * t;\nlet far = 1.0 + smoothstep(25.0, 75.0, t);\nvar cb = base_cloud(p, far);\nif (cb.x <= 0.0) {\nempty++;\nlast = dt * select(1.0, 2.0, empty > 2u);\nt += last;\ncontinue;\n}\nif (empty > 0u || i == 0u) {\nvar a = t - last;\nvar bb = t;\nfor (var k = 0u; k < 3u; k++) {\nlet m = 0.5 * (a + bb);\nif (base_cloud(o + d * m, far).x > 0.0) {\nbb = m;\n} else {\na = m;\n}\n}\nt = bb;\np = o + d * t;\ncb = base_cloud(p, far);\n}\nempty = 0u;\nlet sigma = select(cb.x * cp.layer.w, eroded(cb, length(p) - PLANET), t < 30.0);\nif (sigma > 0.0) {\nlet h = (length(p) - rb) / (rt - rb);\nlet tau = sun_depth(p, sun_steps);\nvar ms = 0.0;\nvar a = 1.0;\nvar bb = 1.0;\nvar c = 1.0;\nfor (var k = 0u; k < octaves; k++) {\nms += a * exp(-tau * bb) * phase(cosv, c);\na *= 0.5;\nbb *= 0.5;\nc *= 0.5;\n}\nlet powder = 1.0 - 0.6 * exp(-sigma * 0.3);\nlet diffuse = max(s.y, 0.0) / (1.0 + 0.1125 * tau) / PI;\nlet scatter = sun * (ms + diffuse * powder) + ambient(h) * 1.3;\nlet e = exp(-sigma * dt);\nlight += trans * scatter * (1.0 - e);\ndist_sum += trans * (1.0 - e) * t;\nweight += trans * (1.0 - e);\ntrans *= e;\n}\nlast = dt;\nt += dt;\n}\nif (weight > 0.0) {\nlet mean = dist_sum / weight;\nlet haze = 1.0 - exp(-mean / cp.look.z);\nlet behind = sky_view_at(sky_view, clamp_smp, d, s, cp.eye.z) * lighting.view.rgb;\nlight = mix(light, behind * (1.0 - trans), haze * 0.5) * (1.0 - haze * 0.8);\ntrans = mix(trans, 1.0, haze * 0.8);\n}\nreturn vec4f(light, trans);\n}\nfn view_dir(uv: vec2f) -> vec3f {\nlet ndc = vec2f(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0);\nlet near = cp.inv_view_proj * vec4f(ndc, 1.0, 1.0);\nreturn normalize(near.xyz / near.w);\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@compute @workgroup_size(8, 8) fn march_view(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(current_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nlet texel = vec2f(id.xy) * 2.0 + cp.size.zw;\nlet uv = (texel + 0.5) / cp.size.xy;\nlet r = march(view_dir(uv), ign(vec2f(id.xy), cp.sun.w), cp.quality.x, cp.quality.y, u32(cp.quality.z), u32(cp.quality.w));\ntextureStore(current_out, vec2i(id.xy), r);\n}\n@compute @workgroup_size(8, 8) fn reconstruct(@builtin(global_invocation_id) id: vec3u) {\nlet size = vec2u(cp.size.xy);\nif (any(id.xy >= size)) {\nreturn;\n}\nlet cn = vec2i(textureDimensions(current));\nlet px = vec2f(id.xy);\nlet uv = (px + 0.5) / cp.size.xy;\nlet phase_px = cp.size.zw;\nlet mine = all(vec2u(id.xy % 2u) == vec2u(phase_px));\nlet f = (px - phase_px) * 0.5;\nlet i0 = vec2i(floor(f));\nlet w = fract(f);\nlet s00 = textureLoad(current, clamp(i0, vec2i(0), cn - 1), 0);\nlet s10 = textureLoad(current, clamp(i0 + vec2i(1, 0), vec2i(0), cn - 1), 0);\nlet s01 = textureLoad(current, clamp(i0 + vec2i(0, 1), vec2i(0), cn - 1), 0);\nlet s11 = textureLoad(current, clamp(i0 + vec2i(1, 1), vec2i(0), cn - 1), 0);\nvar m1 = vec4f(0.0);\nvar m2 = vec4f(0.0);\nfor (var k = 0; k < 9; k++) {\nlet q = textureLoad(current, clamp(i0 + vec2i(round(w)) + vec2i(k % 3 - 1, k / 3 - 1), vec2i(0), cn - 1), 0);\nm1 += q;\nm2 += q * q;\n}\nm1 /= 9.0;\nlet sd = sqrt(max(m2 / 9.0 - m1 * m1, vec4f(0.0)));\nlet mn = m1 - sd * 1.5;\nlet mx = m1 + sd * 1.5;\nlet spatial = mix(mix(s00, s10, w.x), mix(s01, s11, w.x), w.y);\nlet dir = view_dir(uv);\nlet c = cp.prev_view_proj * vec4f(dir * 1.0e4, 1.0);\nvar out = spatial;\nif (c.w > 0.0) {\nlet prev = vec2f(c.x / c.w * 0.5 + 0.5, 0.5 - c.y / c.w * 0.5);\nif (all(prev >= vec2f(0.0)) && all(prev <= vec2f(1.0)) && cp.sun.w > 0.5) {\nlet hist = textureSampleLevel(history, clamp_smp, prev, 0.0);\nlet held = clamp(hist, mn - vec4f(0.002), mx + vec4f(0.002));\nout = select(held, mix(held, s00, 0.2), mine);\n}\n}\ntextureStore(history_out, vec2i(id.xy), out);\n}\n@compute @workgroup_size(8, 8) fn panorama(@builtin(global_invocation_id) id: vec3u) {\nlet n = vec2u(cp.pano.zw);\nif (id.x >= n.x || id.y >= n.y) {\nreturn;\n}\nlet prev = textureLoad(pano_prev, vec2i(id.xy), 0);\nif (id.y % 8u != u32(cp.pano.x)) {\ntextureStore(pano_out, vec2i(id.xy), prev);\nreturn;\n}\nlet frame = cp.sun.w;\nlet j = vec2f(fract(frame * 0.754877666), fract(frame * 0.569840291));\nlet u = (f32(id.x) + j.x) / f32(n.x);\nlet v = (f32(id.y) + j.y) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet az = 2.0 * PI * u;\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet r = march(d, fract(frame * 0.618034), 64.0, 24.0, 4u, 2u);\nlet w = select(0.3, 1.0, frame < 8.5);\ntextureStore(pano_out, vec2i(id.xy), mix(prev, r, w));\n}\n@compute @workgroup_size(8, 8) fn shadow_map(@builtin(global_invocation_id) id: vec3u) {\nlet n = textureDimensions(shadow_out);\nif (any(id.xy >= n)) {\nreturn;\n}\nif (cp.smap.w < 3.5 && id.y % 4u != u32(cp.smap.w)) {\nreturn;\n}\nlet rel = cp.smap.xy - cp.eye.xy + ((vec2f(id.xy) + 0.5) / vec2f(n) - 0.5) * cp.smap.z;\nlet o = vec3f(rel.x, PLANET, rel.y);\nlet s = cp.sun.xyz;\nlet sy = max(s.y, 0.05);\nlet t0 = cp.layer.x / sy;\nlet t1 = min(cp.layer.y / sy, t0 + 40.0);\nlet steps = 16u;\nlet dt = (t1 - t0) / f32(steps);\nvar tau = 0.0;\nfor (var i = 0u; i < steps; i++) {\ntau += density(o + s * (t0 + dt * (f32(i) + 0.5)), true, 1.0) * dt;\n}\nlet light = max(exp(-tau), 0.7 * exp(-0.25 * tau));\ntextureStore(shadow_out, vec2i(id.xy), vec4f(select(1.0, light, s.y > 0.0), 0.0, 0.0, 1.0));\n}\nstruct CompositeOut {\n@builtin(position) clip: vec4f,\n@location(0) uv: vec2f,\n}\n@vertex fn vs_composite(@builtin(vertex_index) i: u32) -> CompositeOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: CompositeOut;\no.clip = vec4f(p, 0.0, 1.0);\no.uv = vec2f(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5);\nreturn o;\n}\n@fragment fn fs_composite(in: CompositeOut) -> @location(0) vec4f {\nif (textureLoad(scene_depth, vec2i(in.clip.xy), 0) > 0.0) {\ndiscard;\n}\nlet c = textureSampleLevel(history, clamp_smp, in.uv, 0.0);\nreturn vec4f(c.rgb * lighting.env.z, c.a);\n}\n@group(0) @binding(19) var<storage, read_write> sh_rows: array<vec4f>;\nvar<workgroup> sh_wg: array<array<vec3f, 9>, 64>;\nfn sh_basis(d: vec3f) -> array<f32, 9> {\nreturn array<f32, 9>(0.282095, 0.488603 * d.y, 0.488603 * d.z, 0.488603 * d.x, 1.092548 * d.x * d.y, 1.092548 * d.y * d.z, 0.315392 * (3.0 * d.z * d.z - 1.0), 1.092548 * d.x * d.z, 0.546274 * (d.x * d.x - d.y * d.y));\n}\nfn sh_reduce(li: u32, acc: array<vec3f, 9>) {\nsh_wg[li] = acc;\nworkgroupBarrier();\nfor (var s = 32u; s > 0u; s >>= 1u) {\nif (li < s) {\nfor (var k = 0u; k < 9u; k++) {\nsh_wg[li][k] += sh_wg[li + s][k];\n}\n}\nworkgroupBarrier();\n}\n}\n@compute @workgroup_size(64) fn pano_sh(@builtin(workgroup_id) wg: vec3u, @builtin(local_invocation_index) li: u32) {\nlet n = vec2u(cp.pano.zw);\nlet row = wg.x;\nvar acc: array<vec3f, 9>;\nlet v = (f32(row) + 0.5) / f32(n.y);\nlet se = v * v;\nlet ce = sqrt(max(1.0 - se * se, 0.0));\nlet d_omega = (2.0 * PI / f32(n.x)) * (2.0 * v / f32(n.y));\nfor (var x = li; x < n.x; x += 64u) {\nlet az = 2.0 * PI * (f32(x) + 0.5) / f32(n.x);\nlet d = vec3f(ce * cos(az), se, ce * sin(az));\nlet c = textureLoad(pano_prev, vec2i(i32(x), i32(row)), 0);\nlet sky = sky_view_at(sky_view, clamp_smp, d, cp.sun.xyz, cp.eye.z) * lighting.view.rgb;\nlet delta = c.rgb - sky * (1.0 - c.a);\nlet y = sh_basis(d);\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += delta * (y[k] * d_omega);\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nsh_rows[row * 9u + li] = vec4f(sh_wg[0][li], 0.0);\n}\n}\n@compute @workgroup_size(64) fn pano_sh_sum(@builtin(local_invocation_index) li: u32) {\nlet rows = u32(cp.pano.w);\nvar acc: array<vec3f, 9>;\nfor (var r = li; r < rows; r += 64u) {\nfor (var k = 0u; k < 9u; k++) {\nacc[k] += sh_rows[r * 9u + k].rgb;\n}\n}\nsh_reduce(li, acc);\nif (li < 9u) {\nlet band = select(select(1.0 / 4.0, 2.0 / 3.0, li >= 1u && li <= 3u), 1.0, li == 0u);\nsh_rows[rows * 9u + li] = vec4f(sh_wg[0][li] * band, 0.0);\n}\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn sky_view_at(lut: texture_2d<f32>, smp: sampler, d: vec3f, s: vec3f, r_cam: f32) -> vec3f {\nlet theta = acos(clamp(d.y, -1.0, 1.0));\nlet hd = vec2f(d.x, d.z);\nlet hs = vec2f(s.x, s.z);\nlet ld = length(hd);\nlet ls = length(hs);\nlet cos_az = select(1.0, dot(hd, hs) / (ld * ls), ld > 1e-5 && ls > 1e-5);\nlet uv = sky_view_uv(theta, clamp(cos_az, -1.0, 1.0), r_cam);\nlet st = (uv * (SKY_VIEW_SIZE - 1.0) + 0.5) / SKY_VIEW_SIZE;\nreturn textureSampleLevel(lut, smp, st, 0.0).rgb;\n}\nfn sky_view_uv(theta: f32, cos_az: f32, r_cam: f32) -> vec2f {\nlet zh = horizon_angle(r_cam);\nlet beta = PI0 - zh;\nvar v: f32;\nif (theta < zh) {\nv = (1.0 - sqrt(max(1.0 - theta / zh, 0.0))) * 0.5;\n} else {\nv = sqrt(saturate((theta - zh) / beta)) * 0.5 + 0.5;\n}\nreturn vec2f(sqrt(saturate(0.5 - 0.5 * cos_az)), v);\n}\nconst SKY_VIEW_SIZE = vec2f(192.0, 108.0);\nfn horizon_angle(r_cam: f32) -> f32 {\nreturn PI0 - acos(clamp(sqrt(max(r_cam * r_cam - BOTTOM * BOTTOM, 0.0)) / r_cam, 0.0, 1.0));\n}\nconst PI0 = 3.14159265;\nconst BOTTOM = 6360.0;",
|
|
7
|
+
};
|
|
8
|
+
/** Linked from shaders/clouds/shafts.wesl. */
|
|
9
|
+
export const shaftsShader = {
|
|
10
|
+
hash: 'c067ed30af3fab0a',
|
|
11
|
+
wgsl: "const FOUR_PI = 12.5663706;\nconst SAMPLES = 8u;\nstruct ShaftParams {\ninv_view_proj: mat4x4f,\nsun: vec4f,\nsmap: vec4f,\nrange: vec4f,\n}\n@group(0) @binding(0) var<uniform> sh: ShaftParams;\n@group(0) @binding(1) var<uniform> lighting: Lighting;\n@group(0) @binding(2) var scene_depth: texture_depth_2d;\n@group(0) @binding(3) var shadow_map: texture_2d<f32>;\n@group(0) @binding(4) var smp: sampler;\nstruct ShaftOut { @builtin(position) clip: vec4f }\n@vertex fn vs(@builtin(vertex_index) i: u32) -> ShaftOut {\nlet p = vec2f(f32((i << 1u) & 2u), f32(i & 2u)) * 2.0 - 1.0;\nvar o: ShaftOut;\no.clip = vec4f(p, 0.0, 1.0);\nreturn o;\n}\nfn sunlit(x: vec3f, l: vec3f) -> f32 {\nlet at = x - l * ((x.y - sh.range.x) / max(l.y, 0.05));\nlet uv = (at.xz - sh.smap.xy) * sh.smap.z + 0.5;\nlet edge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y));\nreturn mix(1.0, textureSampleLevel(shadow_map, smp, uv, 0.0).r, saturate(edge * 16.0));\n}\nfn ign(px: vec2f, frame: f32) -> f32 {\nlet q = px + 5.588238 * (frame % 64.0);\nreturn fract(52.9829189 * fract(dot(q, vec2f(0.06711056, 0.00583715))));\n}\n@fragment fn fs(in: ShaftOut) -> @location(0) vec4f {\nlet fog = lighting.fog;\nlet fog2 = lighting.fog2;\nlet l = sh.sun.xyz;\nif (sh.smap.w < 0.5 || (fog.x <= 0.0 && fog2.x <= 0.0) || fog2.y <= 0.0 || l.y <= 0.0) {\ndiscard;\n}\nlet px = vec2i(in.clip.xy);\nlet size = vec2f(textureDimensions(scene_depth));\nlet ndc = vec2f(in.clip.x / size.x * 2.0 - 1.0, 1.0 - in.clip.y / size.y * 2.0);\nlet d = textureLoad(scene_depth, px, 0);\nlet w4 = sh.inv_view_proj * vec4f(ndc, select(d, 1.0, d <= 0.0), 1.0);\nlet q = w4.xyz / w4.w;\nlet dir = normalize(q);\nvar dist = select(length(q), fog2.w, d <= 0.0);\nif (dir.y > 1e-4) {\ndist = min(dist, sh.range.y / dir.y);\n}\ndist = min(dist, sh.range.z);\nif (dist <= 1.0) {\ndiscard;\n}\nlet t_end = exp(-(lighting.fog_air.rgb * (fog2.x * dist) + vec3f(height_fog_depth(fog, dir, dist))));\nlet g = fog2.z;\nlet c = dot(dir, l);\nlet phase = (1.0 - g * g) / (FOUR_PI * pow(max(1.0 + g * g - 2.0 * g * c, 1e-4), 1.5));\nlet sun_in = lighting.sun_color.rgb * (phase * fog2.y) * (vec3f(1.0) - t_end);\nif (dot(sun_in, vec3f(0.2126, 0.7152, 0.0722)) * lighting.env.z < 4e-4) {\ndiscard;\n}\nlet sigma = max(-log(max(dot(t_end, vec3f(0.3333)), 1e-4)) / dist, 1e-6);\nlet j = ign(in.clip.xy, sh.sun.w);\nvar lit = 0.0;\nvar wsum = 0.0;\nfor (var i = 0u; i < SAMPLES; i++) {\nlet t = (f32(i) + j) / f32(SAMPLES) * dist;\nlet w = exp(-sigma * t);\nlit += w * sunlit(dir * t, l);\nwsum += w;\n}\nlet shade = 1.0 - lit / wsum;\nreturn vec4f(-sun_in * shade * sh.range.w * lighting.env.z, 0.0);\n}\nstruct Lighting {\nsun_color: vec4f,\nenv: vec4f,\nsh: array<vec4f, 9>,\nscreen: vec4f,\nview: vec4f,\nao_reproject: mat4x4f,\nao: vec4f,\nfog: vec4f,\nfog2: vec4f,\nfog_air: vec4f,\ngi_grid: vec4f,\ngi_counts: vec4f,\nssr: vec4f,\ngi_cascades: array<vec4f, 3>,\nclouds: vec4f,\n}\nfn height_fog_depth(fog: vec4f, dir: vec3f, dist: f32) -> f32 {\nif (fog.x <= 0.0) {\nreturn 0.0;\n}\nlet falloff = max(fog.y, 1e-5);\nlet len = max(dist - fog.w, 0.0);\nlet h0 = fog.z + dir.y * min(dist, fog.w);\nlet k = falloff * dir.y * len;\nlet shape = select((1.0 - exp(-k)) / k, 1.0 - 0.5 * k, abs(k) < 1e-3);\nreturn fog.x * exp(-falloff * h0) * len * shape;\n}",
|
|
7
12
|
};
|
|
8
13
|
//# sourceMappingURL=clouds-shaders.gen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clouds-shaders.gen.js","sourceRoot":"","sources":["../src/clouds-shaders.gen.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"clouds-shaders.gen.js","sourceRoot":"","sources":["../src/clouds-shaders.gen.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,m+iBAAm+iB;CACj+iB,CAAC;AAEX,8CAA8C;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,utGAAutG;CACrtG,CAAC"}
|
package/dist/clouds.d.ts
CHANGED
|
@@ -26,6 +26,13 @@ export interface CloudOptions {
|
|
|
26
26
|
readonly erosion?: number;
|
|
27
27
|
/** The march's budget (default 'high'). */
|
|
28
28
|
readonly quality?: CloudQuality;
|
|
29
|
+
/** Where the cloud field sits, world x and z in metres (default [0, 0]; see `Clouds.offset`). */
|
|
30
|
+
readonly offset?: readonly [number, number];
|
|
31
|
+
/**
|
|
32
|
+
* How much the clouds change as they drift, 0–1 (ADR-0240; default 0.5): cells grow and fade over minutes and the
|
|
33
|
+
* billows build upwards. 0: fixed shapes carried by the wind.
|
|
34
|
+
*/
|
|
35
|
+
readonly evolve?: number;
|
|
29
36
|
}
|
|
30
37
|
/**
|
|
31
38
|
* Volumetric clouds (ADR-0219): a layer of cumulus ray-marched through procedural noise, lit by the sun and the sky,
|
|
@@ -56,8 +63,27 @@ export declare class Clouds implements RenderFeature {
|
|
|
56
63
|
quality: CloudQuality;
|
|
57
64
|
/** Off: nothing is marched or drawn (live). */
|
|
58
65
|
enabled: boolean;
|
|
66
|
+
/** How much the clouds change as they drift, 0–1 (ADR-0240; live). */
|
|
67
|
+
evolve: number;
|
|
59
68
|
/** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
|
|
60
69
|
readonly panorama: GPUTexture;
|
|
70
|
+
/**
|
|
71
|
+
* The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
|
|
72
|
+
* Published on the environment as `cloudShadow` for the scene and the water.
|
|
73
|
+
*/
|
|
74
|
+
readonly shadow: GPUTexture;
|
|
75
|
+
/** Cast shadows on the ground and the water (ADR-0227; live). */
|
|
76
|
+
shadows: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* The clouds change the sky's ambient light (ADR-0235; live): what they hide of the blue sky and the light they scatter
|
|
79
|
+
* themselves reach the scene's SH, so ground in a cloud's shadow is lit by a cloudy sky, not a clear one.
|
|
80
|
+
*/
|
|
81
|
+
ambient: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
|
|
84
|
+
* place its clouds (a showcase starting in sunshine) without changing their shapes.
|
|
85
|
+
*/
|
|
86
|
+
offset: [number, number];
|
|
61
87
|
constructor(device: GPUDevice, o: CloudOptions);
|
|
62
88
|
init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
|
|
63
89
|
prepare(f: RenderFeatureFrame): void;
|
|
@@ -71,7 +97,17 @@ export declare class Clouds implements RenderFeature {
|
|
|
71
97
|
* const ms = await render.features.find((f) => f.name === 'clouds').measure();
|
|
72
98
|
*/
|
|
73
99
|
measure(frames?: number): Promise<number | null>;
|
|
74
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
|
|
102
|
+
* argument's `path`.
|
|
103
|
+
*/
|
|
104
|
+
tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
|
|
105
|
+
/**
|
|
106
|
+
* The ambient SH's GPU cost, ms (differential, like `measure`: `frames` + 1 projections in one submission less one).
|
|
107
|
+
* Null before the first frame.
|
|
108
|
+
*/
|
|
109
|
+
measureAmbient(frames?: number): Promise<number | null>;
|
|
110
|
+
/** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
|
|
75
111
|
get gpuBytes(): number;
|
|
76
112
|
destroy(): void;
|
|
77
113
|
}
|
package/dist/clouds.js
CHANGED
|
@@ -6,8 +6,8 @@ const QUALITY = {
|
|
|
6
6
|
medium: [64, 32, 4, 2],
|
|
7
7
|
low: [40, 20, 3, 2],
|
|
8
8
|
};
|
|
9
|
-
/** Bytes of `CloudParams` (clouds.wesl): two matrices and
|
|
10
|
-
const PARAMS_BYTES = (16 * 2 + 4 *
|
|
9
|
+
/** Bytes of `CloudParams` (clouds.wesl): two matrices and twelve vectors. */
|
|
10
|
+
const PARAMS_BYTES = (16 * 2 + 4 * 12) * 4;
|
|
11
11
|
const SHAPE_SIZE = 128;
|
|
12
12
|
const DETAIL_SIZE = 32;
|
|
13
13
|
const PANO = [1024, 256];
|
|
@@ -15,8 +15,15 @@ const PANO = [1024, 256];
|
|
|
15
15
|
const WEATHER = 1024;
|
|
16
16
|
const WEATHER_KM = 320;
|
|
17
17
|
const PLANET_KM = 6360;
|
|
18
|
+
/** The cloud shadow map (ADR-0227): texels a side and its width (km), moved when the camera has gone an eighth of it. */
|
|
19
|
+
const SHADOW = 512;
|
|
20
|
+
const SHADOW_KM = 12.8;
|
|
18
21
|
/** STORAGE_BINDING | TEXTURE_BINDING. */
|
|
19
22
|
const STORE = 0x08 | 0x04;
|
|
23
|
+
/** The ambient's SH (ADR-0235): nine vectors a panorama row, then their sum. */
|
|
24
|
+
const SH_BYTES = (PANO[1] + 1) * 9 * 16;
|
|
25
|
+
/** The first frame whose panorama is whole (every row marched once after the first fill). */
|
|
26
|
+
const SH_FIRST = 16;
|
|
20
27
|
/** The order the 2 × 2 phases are marched in (a Bayer pattern). */
|
|
21
28
|
const PHASES = [
|
|
22
29
|
[0, 0],
|
|
@@ -54,12 +61,42 @@ export class Clouds {
|
|
|
54
61
|
quality;
|
|
55
62
|
/** Off: nothing is marched or drawn (live). */
|
|
56
63
|
enabled = true;
|
|
64
|
+
/** How much the clouds change as they drift, 0–1 (ADR-0240; live). */
|
|
65
|
+
evolve;
|
|
57
66
|
/** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
|
|
58
67
|
panorama;
|
|
59
68
|
/** Where the panorama's rows are marched, from `panorama`; copied into it after. */
|
|
60
69
|
#panoWork;
|
|
61
70
|
#shape;
|
|
62
71
|
#weather;
|
|
72
|
+
/**
|
|
73
|
+
* The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
|
|
74
|
+
* Published on the environment as `cloudShadow` for the scene and the water.
|
|
75
|
+
*/
|
|
76
|
+
shadow;
|
|
77
|
+
/** The shadow map's centre (world km), or null before it is made; true while every row must be marched. */
|
|
78
|
+
#shadowAt = null;
|
|
79
|
+
#shadowAll = true;
|
|
80
|
+
/** Cast shadows on the ground and the water (ADR-0227; live). */
|
|
81
|
+
shadows = true;
|
|
82
|
+
/**
|
|
83
|
+
* The clouds change the sky's ambient light (ADR-0235; live): what they hide of the blue sky and the light they scatter
|
|
84
|
+
* themselves reach the scene's SH, so ground in a cloud's shadow is lit by a cloudy sky, not a clear one.
|
|
85
|
+
*/
|
|
86
|
+
ambient = true;
|
|
87
|
+
/** The ambient's change (SH9, 9 × vec4, scene-linear), published as `Environment.cloudSh`. */
|
|
88
|
+
#sh = new Float32Array(36);
|
|
89
|
+
#shBuf;
|
|
90
|
+
#shRead;
|
|
91
|
+
/** idle: may dispatch; copied: the read-back is recorded (map it next frame); mapping: waiting on it. */
|
|
92
|
+
#shState = 'idle';
|
|
93
|
+
#shPublished = false;
|
|
94
|
+
#env = null;
|
|
95
|
+
/**
|
|
96
|
+
* Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
|
|
97
|
+
* place its clouds (a showcase starting in sunshine) without changing their shapes.
|
|
98
|
+
*/
|
|
99
|
+
offset = [0, 0];
|
|
63
100
|
/** The weather map's centre (world km), or null before it is made. */
|
|
64
101
|
#weatherAt = null;
|
|
65
102
|
#detail;
|
|
@@ -99,10 +136,15 @@ export class Clouds {
|
|
|
99
136
|
this.haze = o.haze ?? 12;
|
|
100
137
|
this.erosion = o.erosion ?? 1;
|
|
101
138
|
this.quality = o.quality ?? 'high';
|
|
139
|
+
this.evolve = Math.max(0, Math.min(1, o.evolve ?? 0.5));
|
|
140
|
+
if (o.offset)
|
|
141
|
+
this.offset = [o.offset[0], o.offset[1]];
|
|
102
142
|
if (!(this.top > this.bottom && this.bottom >= 0))
|
|
103
143
|
throw Object.assign(new Error(`CLOUDS_LAYER: a layer from ${this.bottom} m to ${this.top} m; the top must be above the bottom, both above 0.`), { code: 'CLOUDS_LAYER', path: 'top' });
|
|
104
144
|
this.#shape = device.createTexture({ label: 'yali:clouds:shape', size: [SHAPE_SIZE, SHAPE_SIZE, SHAPE_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
|
|
105
145
|
this.#weather = device.createTexture({ label: 'yali:clouds:weather', size: [WEATHER, WEATHER], format: 'rgba8unorm', usage: STORE });
|
|
146
|
+
// COPY_SRC: tools and probes read it back.
|
|
147
|
+
this.shadow = device.createTexture({ label: 'yali:clouds:shadow', size: [SHADOW, SHADOW], format: 'rgba16float', usage: STORE | 0x01 });
|
|
106
148
|
this.#detail = device.createTexture({ label: 'yali:clouds:detail', size: [DETAIL_SIZE, DETAIL_SIZE, DETAIL_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
|
|
107
149
|
// Rows accumulate over frames: marched into the work texture from the panorama, then copied back (COPY_SRC |
|
|
108
150
|
// COPY_DST; tools and probes read the panorama back too).
|
|
@@ -110,18 +152,24 @@ export class Clouds {
|
|
|
110
152
|
this.panorama = pano('yali:clouds:panorama');
|
|
111
153
|
this.#panoWork = pano('yali:clouds:panorama-work');
|
|
112
154
|
this.#params = device.createBuffer({ label: 'yali:clouds:params', size: PARAMS_BYTES, usage: 0x40 | 0x08 });
|
|
155
|
+
// STORAGE | COPY_SRC; the read-back MAP_READ | COPY_DST.
|
|
156
|
+
this.#shBuf = device.createBuffer({ label: 'yali:clouds:sh', size: SH_BYTES, usage: 0x80 | 0x04 });
|
|
157
|
+
this.#shRead = device.createBuffer({ label: 'yali:clouds:sh:read', size: 9 * 16, usage: 0x01 | 0x08 });
|
|
113
158
|
this.#clamp = device.createSampler({ label: 'yali:clouds:clamp', magFilter: 'linear', minFilter: 'linear' });
|
|
114
159
|
this.#wrap = device.createSampler({ label: 'yali:clouds:wrap', addressModeU: 'repeat', addressModeV: 'repeat', addressModeW: 'repeat', magFilter: 'linear', minFilter: 'linear' });
|
|
115
160
|
}
|
|
116
161
|
async init(cache, format) {
|
|
117
162
|
const c = (entryPoint) => cache.compute({ label: `yali:clouds:${entryPoint}`, compute: { shader: cloudsShader, entryPoint } });
|
|
118
|
-
const [shape, detail, weather, march, rebuild, pano, draw] = await Promise.all([
|
|
163
|
+
const [shape, detail, weather, march, rebuild, pano, shadow, shRows, shSum, draw] = await Promise.all([
|
|
119
164
|
c('gen_shape'),
|
|
120
165
|
c('gen_detail'),
|
|
121
166
|
c('gen_weather'),
|
|
122
167
|
c('march_view'),
|
|
123
168
|
c('reconstruct'),
|
|
124
169
|
c('panorama'),
|
|
170
|
+
c('shadow_map'),
|
|
171
|
+
c('pano_sh'),
|
|
172
|
+
c('pano_sh_sum'),
|
|
125
173
|
cache.render({
|
|
126
174
|
label: 'yali:clouds:draw',
|
|
127
175
|
vertex: { shader: cloudsShader, entryPoint: 'vs_composite' },
|
|
@@ -130,7 +178,7 @@ export class Clouds {
|
|
|
130
178
|
primitive: { topology: 'triangle-list' },
|
|
131
179
|
}),
|
|
132
180
|
]);
|
|
133
|
-
this.#p = { shape, detail, weather, march, rebuild, pano, draw };
|
|
181
|
+
this.#p = { shape, detail, weather, march, rebuild, pano, shadow, shRows, shSum, draw };
|
|
134
182
|
}
|
|
135
183
|
/** The textures that follow the render size: this frame's samples (a quarter) and the half-size history (two). */
|
|
136
184
|
#resize(w, h) {
|
|
@@ -175,7 +223,7 @@ export class Clouds {
|
|
|
175
223
|
d.set([eye[0] / 1000, eye[2] / 1000, PLANET_KM + Math.max(eye[1], 1) / 1000, f.seconds], 36);
|
|
176
224
|
d.set([this.bottom / 1000, this.top / 1000, Math.max(0, Math.min(1, this.coverage)), this.density], 40);
|
|
177
225
|
const drift = (this.wind * f.seconds) / 1000;
|
|
178
|
-
d.set([this.shapeSize, this.detailSize, Math.cos(this.windDirection) * drift, Math.sin(this.windDirection) * drift], 44);
|
|
226
|
+
d.set([this.shapeSize, this.detailSize, Math.cos(this.windDirection) * drift + this.offset[0] / 1000, Math.sin(this.windDirection) * drift + this.offset[1] / 1000], 44);
|
|
179
227
|
const ph = PHASES[this.#frame & 3];
|
|
180
228
|
d.set([this.#size[0], this.#size[1], ph[0], ph[1]], 48);
|
|
181
229
|
d.set(QUALITY[this.quality], 52);
|
|
@@ -195,6 +243,22 @@ export class Clouds {
|
|
|
195
243
|
if (regen)
|
|
196
244
|
this.#weatherAt = [ex, ez];
|
|
197
245
|
d.set([this.#weatherAt[0], this.#weatherAt[1], WEATHER_KM, WEATHER], 64);
|
|
246
|
+
// The shadow map follows the camera in steps of an eighth of its width, every row marched after a move, a quarter of
|
|
247
|
+
// them a frame otherwise (ADR-0227).
|
|
248
|
+
const sa = this.#shadowAt;
|
|
249
|
+
if (!sa || Math.abs(ex - sa[0]) > SHADOW_KM / 8 || Math.abs(ez - sa[1]) > SHADOW_KM / 8) {
|
|
250
|
+
this.#shadowAt = [Math.round(ex / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW), Math.round(ez / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW)];
|
|
251
|
+
this.#shadowAll = true;
|
|
252
|
+
}
|
|
253
|
+
d.set([this.#shadowAt[0], this.#shadowAt[1], SHADOW_KM, this.#shadowAll ? 4 : this.#frame & 3], 68);
|
|
254
|
+
f.environment.cloudShadow = this.enabled && this.shadows ? { texture: this.shadow, centre: [this.#shadowAt[0] * 1000, this.#shadowAt[1] * 1000], size: SHADOW_KM * 1000, bottom: this.bottom } : null;
|
|
255
|
+
this.#ambient(f.environment);
|
|
256
|
+
// Evolution (ADR-0240): the shape rising up to 6 m/s at full (wrapped to two tiles: the noise is tileable), the second
|
|
257
|
+
// weather read's offset circling 8 km about the first once in 40 minutes.
|
|
258
|
+
const ev = Math.max(0, Math.min(1, this.evolve));
|
|
259
|
+
const tile = this.shapeSize * 2;
|
|
260
|
+
const turn = (f.seconds / 2400) * Math.PI * 2;
|
|
261
|
+
d.set([ev, ev > 0 ? ((f.seconds * 0.006 * ev) % tile) : 0, Math.cos(turn) * 8, Math.sin(turn) * 8], 76);
|
|
198
262
|
this.device.queue.writeBuffer(this.#params, 0, d);
|
|
199
263
|
if ((regen || this.#weatherStale) && this.#p) {
|
|
200
264
|
const enc = this.device.createCommandEncoder({ label: 'yali:clouds:weather' });
|
|
@@ -207,6 +271,39 @@ export class Clouds {
|
|
|
207
271
|
this.#weatherStale = false;
|
|
208
272
|
}
|
|
209
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* The ambient's change (ADR-0235): last frame's recorded read-back mapped, the result published on the environment; off,
|
|
276
|
+
* nothing published. `amb` (what the SH gains from above) goes to the clouds' own ambient, which takes it off again.
|
|
277
|
+
*/
|
|
278
|
+
#ambient(env) {
|
|
279
|
+
this.#env = env;
|
|
280
|
+
const on = this.enabled && this.ambient;
|
|
281
|
+
if (this.#shState === 'copied') {
|
|
282
|
+
this.#shState = 'mapping';
|
|
283
|
+
const buf = this.#shRead;
|
|
284
|
+
buf.mapAsync(GPUMapMode.READ).then(() => {
|
|
285
|
+
this.#sh.set(new Float32Array(buf.getMappedRange(), 0, 36));
|
|
286
|
+
buf.unmap();
|
|
287
|
+
this.#shState = 'idle';
|
|
288
|
+
const e = this.#env;
|
|
289
|
+
if (e && this.enabled && this.ambient) {
|
|
290
|
+
e.cloudSh = this.#sh;
|
|
291
|
+
e.cloudShVersion++;
|
|
292
|
+
this.#shPublished = true;
|
|
293
|
+
}
|
|
294
|
+
}, () => {
|
|
295
|
+
this.#shState = 'idle';
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
if (!on && this.#shPublished) {
|
|
299
|
+
env.cloudSh = null;
|
|
300
|
+
env.cloudShVersion++;
|
|
301
|
+
this.#shPublished = false;
|
|
302
|
+
}
|
|
303
|
+
const k = this.#sh;
|
|
304
|
+
const a = this.#shPublished ? [0, 1, 2].map((i) => k[i] * 0.282095 + k[4 + i] * 0.488603) : [0, 0, 0];
|
|
305
|
+
this.#data.set([a[0], a[1], a[2], 0], 72);
|
|
306
|
+
}
|
|
210
307
|
#ensureGroups(scene) {
|
|
211
308
|
const p = this.#p;
|
|
212
309
|
if (!p || !this.#current || !this.#history || !this.#skyView)
|
|
@@ -232,6 +329,39 @@ export class Clouds {
|
|
|
232
329
|
march: d.createBindGroup({ label: 'yali:clouds:march', layout: p.march.getBindGroupLayout(0), entries: [...shared, { binding: 9, resource: this.#current.createView() }] }),
|
|
233
330
|
rebuild: [rebuild(h0, h1), rebuild(h1, h0)],
|
|
234
331
|
pano: d.createBindGroup({ label: 'yali:clouds:panorama', layout: p.pano.getBindGroupLayout(0), entries: [...shared, { binding: 13, resource: this.#panoWork.createView() }, { binding: 15, resource: this.panorama.createView() }] }),
|
|
332
|
+
shadow: d.createBindGroup({
|
|
333
|
+
label: 'yali:clouds:shadow',
|
|
334
|
+
layout: p.shadow.getBindGroupLayout(0),
|
|
335
|
+
entries: [
|
|
336
|
+
{ binding: 0, resource: { buffer: this.#params } },
|
|
337
|
+
{ binding: 3, resource: this.#clamp },
|
|
338
|
+
{ binding: 4, resource: this.#shape.createView({ dimension: '3d' }) },
|
|
339
|
+
{ binding: 5, resource: this.#detail.createView({ dimension: '3d' }) },
|
|
340
|
+
{ binding: 6, resource: this.#wrap },
|
|
341
|
+
{ binding: 16, resource: this.#weather.createView() },
|
|
342
|
+
{ binding: 18, resource: this.shadow.createView() },
|
|
343
|
+
],
|
|
344
|
+
}),
|
|
345
|
+
shRows: d.createBindGroup({
|
|
346
|
+
label: 'yali:clouds:sh',
|
|
347
|
+
layout: p.shRows.getBindGroupLayout(0),
|
|
348
|
+
entries: [
|
|
349
|
+
{ binding: 0, resource: { buffer: this.#params } },
|
|
350
|
+
{ binding: 1, resource: { buffer: scene.lightingBuffer } },
|
|
351
|
+
{ binding: 2, resource: this.#skyView.createView() },
|
|
352
|
+
{ binding: 3, resource: this.#clamp },
|
|
353
|
+
{ binding: 15, resource: this.panorama.createView() },
|
|
354
|
+
{ binding: 19, resource: { buffer: this.#shBuf } },
|
|
355
|
+
],
|
|
356
|
+
}),
|
|
357
|
+
shSum: d.createBindGroup({
|
|
358
|
+
label: 'yali:clouds:sh-sum',
|
|
359
|
+
layout: p.shSum.getBindGroupLayout(0),
|
|
360
|
+
entries: [
|
|
361
|
+
{ binding: 0, resource: { buffer: this.#params } },
|
|
362
|
+
{ binding: 19, resource: { buffer: this.#shBuf } },
|
|
363
|
+
],
|
|
364
|
+
}),
|
|
235
365
|
};
|
|
236
366
|
this.#drawGroups = null;
|
|
237
367
|
return true;
|
|
@@ -271,6 +401,12 @@ export class Clouds {
|
|
|
271
401
|
pass.setPipeline(p.pano);
|
|
272
402
|
pass.setBindGroup(0, g.pano);
|
|
273
403
|
pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
|
|
404
|
+
if (this.shadows) {
|
|
405
|
+
pass.setPipeline(p.shadow);
|
|
406
|
+
pass.setBindGroup(0, g.shadow);
|
|
407
|
+
pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
|
|
408
|
+
this.#shadowAll = false;
|
|
409
|
+
}
|
|
274
410
|
},
|
|
275
411
|
});
|
|
276
412
|
// The panorama's marched rows back into the one reflections read.
|
|
@@ -283,6 +419,9 @@ export class Clouds {
|
|
|
283
419
|
if (!this.enabled || !this.#generated || !this.#groups)
|
|
284
420
|
return;
|
|
285
421
|
encoder.copyTextureToTexture({ texture: this.#panoWork }, { texture: this.panorama }, [PANO[0], PANO[1]]);
|
|
422
|
+
// Once the panorama is whole, every 8 frames (each row marched again): its change to the sky's light on SH9.
|
|
423
|
+
if (this.ambient && this.#shState === 'idle' && this.#frame >= SH_FIRST && (this.#frame & 7) === 7)
|
|
424
|
+
this.#encodeSh(encoder);
|
|
286
425
|
},
|
|
287
426
|
});
|
|
288
427
|
graph.addPass({
|
|
@@ -334,6 +473,11 @@ export class Clouds {
|
|
|
334
473
|
pass.setPipeline(p.pano);
|
|
335
474
|
pass.setBindGroup(0, g.pano);
|
|
336
475
|
pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
|
|
476
|
+
if (this.shadows) {
|
|
477
|
+
pass.setPipeline(p.shadow);
|
|
478
|
+
pass.setBindGroup(0, g.shadow);
|
|
479
|
+
pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
|
|
480
|
+
}
|
|
337
481
|
}
|
|
338
482
|
pass.end();
|
|
339
483
|
await this.device.queue.onSubmittedWorkDone();
|
|
@@ -347,20 +491,147 @@ export class Clouds {
|
|
|
347
491
|
const small = await run(1);
|
|
348
492
|
return Math.max(0, (await run(frames + 1)) - small) / frames;
|
|
349
493
|
}
|
|
350
|
-
/**
|
|
494
|
+
/**
|
|
495
|
+
* Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
|
|
496
|
+
* argument's `path`.
|
|
497
|
+
*/
|
|
498
|
+
tools() {
|
|
499
|
+
const bad = (path, message) => Object.assign(new Error(`CLOUDS_INVALID: ${path} ${message}`), { code: 'CLOUDS_INVALID', path, message: `${path} ${message}` });
|
|
500
|
+
const num = (args, k, min, max = Number.POSITIVE_INFINITY) => {
|
|
501
|
+
const v = args[k];
|
|
502
|
+
if (v === undefined)
|
|
503
|
+
return undefined;
|
|
504
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v < min || v > max)
|
|
505
|
+
throw bad(k, `must be a number from ${min}${Number.isFinite(max) ? ` to ${max}` : ''}`);
|
|
506
|
+
return v;
|
|
507
|
+
};
|
|
508
|
+
const state = () => ({
|
|
509
|
+
enabled: this.enabled,
|
|
510
|
+
shadows: this.shadows,
|
|
511
|
+
ambient: this.ambient,
|
|
512
|
+
evolve: this.evolve,
|
|
513
|
+
quality: this.quality,
|
|
514
|
+
coverage: this.coverage,
|
|
515
|
+
bottom: this.bottom,
|
|
516
|
+
top: this.top,
|
|
517
|
+
density: this.density,
|
|
518
|
+
wind: this.wind,
|
|
519
|
+
windDirection: this.windDirection,
|
|
520
|
+
gpuBytes: this.gpuBytes,
|
|
521
|
+
});
|
|
522
|
+
return [
|
|
523
|
+
{ name: 'clouds.state', description: 'The volumetric clouds: on or off, whether they shadow the ground and water and change the ambient light, quality, coverage, layer, density, wind and GPU bytes.', input: { type: 'object', properties: {} }, run: state },
|
|
524
|
+
{
|
|
525
|
+
name: 'clouds.set',
|
|
526
|
+
description: "Turns the clouds' live knobs; only the arguments given change. Returns the new state.",
|
|
527
|
+
input: {
|
|
528
|
+
type: 'object',
|
|
529
|
+
properties: {
|
|
530
|
+
enabled: { type: 'boolean', description: 'March and draw the clouds at all.' },
|
|
531
|
+
shadows: { type: 'boolean', description: 'Cast the clouds’ shadows on the ground and the water.' },
|
|
532
|
+
ambient: { type: 'boolean', description: 'Let the clouds change the sky’s ambient light on the scene (what they hide of the sky, the light they scatter).' },
|
|
533
|
+
evolve: { type: 'number', description: 'How much the clouds change as they drift, 0 to 1 (cells grow and fade, billows build; 0: fixed shapes).' },
|
|
534
|
+
quality: { type: 'string', description: 'The march budget: high, medium or low.' },
|
|
535
|
+
coverage: { type: 'number', description: 'How much of the sky is cloud, 0 to 1.' },
|
|
536
|
+
density: { type: 'number', description: 'Extinction inside a full cloud, per km, 1 to 500.' },
|
|
537
|
+
wind: { type: 'number', description: 'The wind at the clouds, m/s, 0 to 60.' },
|
|
538
|
+
windDirection: { type: 'number', description: 'The direction the wind blows towards, radians from +x.' },
|
|
539
|
+
},
|
|
540
|
+
},
|
|
541
|
+
run: (args) => {
|
|
542
|
+
if (args.enabled !== undefined)
|
|
543
|
+
this.enabled = !!args.enabled;
|
|
544
|
+
if (args.shadows !== undefined)
|
|
545
|
+
this.shadows = !!args.shadows;
|
|
546
|
+
if (args.ambient !== undefined)
|
|
547
|
+
this.ambient = !!args.ambient;
|
|
548
|
+
const ev = num(args, 'evolve', 0, 1);
|
|
549
|
+
if (ev !== undefined)
|
|
550
|
+
this.evolve = ev;
|
|
551
|
+
if (args.quality !== undefined) {
|
|
552
|
+
if (args.quality !== 'high' && args.quality !== 'medium' && args.quality !== 'low')
|
|
553
|
+
throw bad('quality', 'must be high, medium or low');
|
|
554
|
+
this.quality = args.quality;
|
|
555
|
+
}
|
|
556
|
+
const c = num(args, 'coverage', 0, 1);
|
|
557
|
+
if (c !== undefined)
|
|
558
|
+
this.coverage = c;
|
|
559
|
+
const d = num(args, 'density', 1, 500);
|
|
560
|
+
if (d !== undefined)
|
|
561
|
+
this.density = d;
|
|
562
|
+
const w = num(args, 'wind', 0, 60);
|
|
563
|
+
if (w !== undefined)
|
|
564
|
+
this.wind = w;
|
|
565
|
+
const wd = num(args, 'windDirection', -Math.PI * 4, Math.PI * 4);
|
|
566
|
+
if (wd !== undefined)
|
|
567
|
+
this.windDirection = wd;
|
|
568
|
+
return state();
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
];
|
|
572
|
+
}
|
|
573
|
+
/** The ambient's SH from the panorama, and its read-back's copy (ADR-0235). */
|
|
574
|
+
#encodeSh(encoder) {
|
|
575
|
+
const p = this.#p;
|
|
576
|
+
const g = this.#groups;
|
|
577
|
+
const pass = encoder.beginComputePass({ label: 'clouds.sh' });
|
|
578
|
+
pass.setPipeline(p.shRows);
|
|
579
|
+
pass.setBindGroup(0, g.shRows);
|
|
580
|
+
pass.dispatchWorkgroups(PANO[1]);
|
|
581
|
+
pass.setPipeline(p.shSum);
|
|
582
|
+
pass.setBindGroup(0, g.shSum);
|
|
583
|
+
pass.dispatchWorkgroups(1);
|
|
584
|
+
pass.end();
|
|
585
|
+
encoder.copyBufferToBuffer(this.#shBuf, PANO[1] * 9 * 16, this.#shRead, 0, 9 * 16);
|
|
586
|
+
this.#shState = 'copied';
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* The ambient SH's GPU cost, ms (differential, like `measure`: `frames` + 1 projections in one submission less one).
|
|
590
|
+
* Null before the first frame.
|
|
591
|
+
*/
|
|
592
|
+
async measureAmbient(frames = 20) {
|
|
593
|
+
const p = this.#p;
|
|
594
|
+
const g = this.#groups;
|
|
595
|
+
if (!p || !g)
|
|
596
|
+
return null;
|
|
597
|
+
const run = async (n) => {
|
|
598
|
+
const enc = this.device.createCommandEncoder({ label: 'yali:clouds:measure-sh' });
|
|
599
|
+
const pass = enc.beginComputePass();
|
|
600
|
+
for (let i = 0; i < n; i++) {
|
|
601
|
+
pass.setPipeline(p.shRows);
|
|
602
|
+
pass.setBindGroup(0, g.shRows);
|
|
603
|
+
pass.dispatchWorkgroups(PANO[1]);
|
|
604
|
+
pass.setPipeline(p.shSum);
|
|
605
|
+
pass.setBindGroup(0, g.shSum);
|
|
606
|
+
pass.dispatchWorkgroups(1);
|
|
607
|
+
}
|
|
608
|
+
pass.end();
|
|
609
|
+
const t = performance.now();
|
|
610
|
+
this.device.queue.submit([enc.finish()]);
|
|
611
|
+
await this.device.queue.onSubmittedWorkDone();
|
|
612
|
+
return performance.now() - t;
|
|
613
|
+
};
|
|
614
|
+
await run(2);
|
|
615
|
+
const small = await run(1);
|
|
616
|
+
return Math.max(0, (await run(frames + 1)) - small) / frames;
|
|
617
|
+
}
|
|
618
|
+
/** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
|
|
351
619
|
get gpuBytes() {
|
|
352
620
|
const [w, h] = this.#size;
|
|
353
|
-
return SHAPE_SIZE ** 3 * 4 + DETAIL_SIZE ** 3 * 4 + WEATHER * WEATHER * 4 + PANO[0] * PANO[1] * 8 * 2 + w * h * 8 * 2 + Math.ceil(w / 2) * Math.ceil(h / 2) * 8;
|
|
621
|
+
return SHAPE_SIZE ** 3 * 4 + DETAIL_SIZE ** 3 * 4 + WEATHER * WEATHER * 4 + SHADOW * SHADOW * 8 + PANO[0] * PANO[1] * 8 * 2 + w * h * 8 * 2 + Math.ceil(w / 2) * Math.ceil(h / 2) * 8 + SH_BYTES + 9 * 16;
|
|
354
622
|
}
|
|
355
623
|
destroy() {
|
|
356
624
|
this.#shape.destroy();
|
|
357
625
|
this.#weather.destroy();
|
|
626
|
+
this.shadow.destroy();
|
|
358
627
|
this.#detail.destroy();
|
|
359
628
|
this.panorama.destroy();
|
|
360
629
|
this.#panoWork.destroy();
|
|
361
630
|
this.#current?.destroy();
|
|
362
631
|
this.#history?.forEach((t) => t.destroy());
|
|
363
632
|
this.#params.destroy();
|
|
633
|
+
this.#shBuf.destroy();
|
|
634
|
+
this.#shRead.destroy();
|
|
364
635
|
}
|
|
365
636
|
}
|
|
366
637
|
//# sourceMappingURL=clouds.js.map
|
package/dist/clouds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clouds.js","sourceRoot":"","sources":["../src/clouds.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clouds.js","sourceRoot":"","sources":["../src/clouds.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAwC,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,OAAO,EAAE,MAAM,EAAE,MAAM,EAAwC,MAAM,aAAa,CAAC;AACnF,OAAO,EAAqB,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/shafts.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FrameGraph, PipelineCache, RenderFeature, RenderFeatureFactory, RenderFeatureFrame, SceneRenderer } from '@yali-engine/render';
|
|
2
|
+
/** The shafts' knobs. */
|
|
3
|
+
export interface ShaftOptions {
|
|
4
|
+
/** How strongly the shadows break the haze's sunlight, 0–1 (default 1: as the fog scatters it). */
|
|
5
|
+
readonly strength?: number;
|
|
6
|
+
/** The longest stretch of a view ray marched, metres (default 6000: the shadow map reaches 6.4 km about the camera). */
|
|
7
|
+
readonly range?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Light shafts (ADR-0240): the clouds' shadows in the haze. Needs `clouds()` before it (their shadow map) and haze or
|
|
11
|
+
* height fog with a sun in-scatter; WebGPU with HDR only.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* renderPlugin({ canvas, fog: { haze: 1 }, features: [clouds(), water(), shafts()] });
|
|
15
|
+
*/
|
|
16
|
+
export declare function shafts(o?: ShaftOptions): RenderFeatureFactory;
|
|
17
|
+
export declare class Shafts implements RenderFeature {
|
|
18
|
+
#private;
|
|
19
|
+
readonly name = "shafts";
|
|
20
|
+
readonly device: GPUDevice;
|
|
21
|
+
/** Live knobs. */
|
|
22
|
+
strength: number;
|
|
23
|
+
range: number;
|
|
24
|
+
/** Off: nothing drawn (live). */
|
|
25
|
+
enabled: boolean;
|
|
26
|
+
constructor(device: GPUDevice, o: ShaftOptions);
|
|
27
|
+
init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
|
|
28
|
+
prepare(f: RenderFeatureFrame): void;
|
|
29
|
+
addPasses(graph: FrameGraph, color: string, depth: string, scene: SceneRenderer): void;
|
|
30
|
+
/** Its agent tools: `shafts.state`, `shafts.set` (strength, range, enabled). */
|
|
31
|
+
tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
}
|
package/dist/shafts.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { mat4 } from '@yali-engine/math';
|
|
2
|
+
import { shaftsShader } from "./clouds-shaders.gen.js";
|
|
3
|
+
/**
|
|
4
|
+
* Light shafts (ADR-0240): the clouds' shadows in the haze. Needs `clouds()` before it (their shadow map) and haze or
|
|
5
|
+
* height fog with a sun in-scatter; WebGPU with HDR only.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* renderPlugin({ canvas, fog: { haze: 1 }, features: [clouds(), water(), shafts()] });
|
|
9
|
+
*/
|
|
10
|
+
export function shafts(o = {}) {
|
|
11
|
+
return (device) => new Shafts(device, o);
|
|
12
|
+
}
|
|
13
|
+
export class Shafts {
|
|
14
|
+
name = 'shafts';
|
|
15
|
+
device;
|
|
16
|
+
/** Live knobs. */
|
|
17
|
+
strength;
|
|
18
|
+
range;
|
|
19
|
+
/** Off: nothing drawn (live). */
|
|
20
|
+
enabled = true;
|
|
21
|
+
#params;
|
|
22
|
+
#data = new Float32Array(16 + 12);
|
|
23
|
+
#sampler;
|
|
24
|
+
#pipeline = null;
|
|
25
|
+
#shadow = null;
|
|
26
|
+
#frame = 0;
|
|
27
|
+
#group = null;
|
|
28
|
+
#key = '';
|
|
29
|
+
constructor(device, o) {
|
|
30
|
+
this.device = device;
|
|
31
|
+
this.strength = o.strength ?? 1;
|
|
32
|
+
this.range = o.range ?? 6000;
|
|
33
|
+
this.#params = device.createBuffer({ label: 'yali:shafts:params', size: this.#data.byteLength, usage: 0x40 | 0x08 });
|
|
34
|
+
this.#sampler = device.createSampler({ label: 'yali:shafts', magFilter: 'linear', minFilter: 'linear' });
|
|
35
|
+
}
|
|
36
|
+
async init(cache, format) {
|
|
37
|
+
this.#pipeline = await cache.render({
|
|
38
|
+
label: 'yali:shafts',
|
|
39
|
+
vertex: { shader: shaftsShader, entryPoint: 'vs' },
|
|
40
|
+
// Added: the fragment is negative (the sunlight the shadows take away).
|
|
41
|
+
fragment: { shader: shaftsShader, entryPoint: 'fs', targets: [{ format, blend: { color: { srcFactor: 'one', dstFactor: 'one' }, alpha: { srcFactor: 'zero', dstFactor: 'one' } } }] },
|
|
42
|
+
primitive: { topology: 'triangle-list' },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
prepare(f) {
|
|
46
|
+
const d = this.#data;
|
|
47
|
+
if (!mat4.invert(d.subarray(0, 16), f.camera.uniform))
|
|
48
|
+
return;
|
|
49
|
+
const ld = f.camera.lightDir;
|
|
50
|
+
const ll = Math.hypot(ld[0], ld[1], ld[2]) || 1;
|
|
51
|
+
d.set([ld[0] / ll, ld[1] / ll, ld[2] / ll, this.#frame++], 16);
|
|
52
|
+
const s = f.environment.cloudShadow;
|
|
53
|
+
const eye = f.camera.eye;
|
|
54
|
+
this.#shadow = s && this.enabled ? s.texture : null;
|
|
55
|
+
// Camera-relative in f64 here: the map's centre is world metres.
|
|
56
|
+
d.set(s ? [s.centre[0] - eye[0], s.centre[1] - eye[2], 1 / s.size, this.#shadow ? 1 : 0] : [0, 0, 0, 0], 20);
|
|
57
|
+
d.set([-eye[1], (s?.bottom ?? 1500) - eye[1], this.range, this.strength], 24);
|
|
58
|
+
this.device.queue.writeBuffer(this.#params, 0, d);
|
|
59
|
+
}
|
|
60
|
+
addPasses(graph, color, depth, scene) {
|
|
61
|
+
graph.addPass({
|
|
62
|
+
name: 'shafts',
|
|
63
|
+
kind: 'render',
|
|
64
|
+
reads: [depth],
|
|
65
|
+
color: { target: color, clear: { r: 0, g: 0, b: 0, a: 0 }, load: true },
|
|
66
|
+
execute: (pass, ctx) => {
|
|
67
|
+
const shadow = this.#shadow;
|
|
68
|
+
if (!this.enabled || !this.#pipeline || !shadow)
|
|
69
|
+
return;
|
|
70
|
+
const key = `${ctx.generation}:${shadow.label}`;
|
|
71
|
+
if (!this.#group || key !== this.#key) {
|
|
72
|
+
this.#key = key;
|
|
73
|
+
this.#group = this.device.createBindGroup({
|
|
74
|
+
label: 'yali:shafts',
|
|
75
|
+
layout: this.#pipeline.getBindGroupLayout(0),
|
|
76
|
+
entries: [
|
|
77
|
+
{ binding: 0, resource: { buffer: this.#params } },
|
|
78
|
+
{ binding: 1, resource: { buffer: scene.lightingBuffer } },
|
|
79
|
+
{ binding: 2, resource: ctx.view(depth) },
|
|
80
|
+
{ binding: 3, resource: shadow.createView() },
|
|
81
|
+
{ binding: 4, resource: this.#sampler },
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
pass.setPipeline(this.#pipeline);
|
|
86
|
+
pass.setBindGroup(0, this.#group);
|
|
87
|
+
pass.draw(3);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/** Its agent tools: `shafts.state`, `shafts.set` (strength, range, enabled). */
|
|
92
|
+
tools() {
|
|
93
|
+
const state = () => ({ enabled: this.enabled, strength: this.strength, range: this.range });
|
|
94
|
+
const bad = (path, message) => Object.assign(new Error(`SHAFTS_INVALID: ${path} ${message}`), { code: 'SHAFTS_INVALID', path, message: `${path} ${message}` });
|
|
95
|
+
return [
|
|
96
|
+
{ name: 'shafts.state', description: 'The light shafts: on or off, how strongly the clouds’ shadows break the haze’s sunlight, and how far along a view ray.', input: { type: 'object', properties: {} }, run: state },
|
|
97
|
+
{
|
|
98
|
+
name: 'shafts.set',
|
|
99
|
+
description: 'Turns the light shafts’ knobs; only the arguments given change. Returns the new state.',
|
|
100
|
+
input: { type: 'object', properties: { enabled: { type: 'boolean', description: 'Draw them at all.' }, strength: { type: 'number', description: '0 to 1 (1: as the fog scatters the sun).' }, range: { type: 'number', description: 'Metres of view ray marched, 100 to 20000.' } } },
|
|
101
|
+
run: (args) => {
|
|
102
|
+
if (args.enabled !== undefined)
|
|
103
|
+
this.enabled = !!args.enabled;
|
|
104
|
+
if (args.strength !== undefined) {
|
|
105
|
+
if (typeof args.strength !== 'number' || !(args.strength >= 0 && args.strength <= 1))
|
|
106
|
+
throw bad('strength', 'must be a number from 0 to 1');
|
|
107
|
+
this.strength = args.strength;
|
|
108
|
+
}
|
|
109
|
+
if (args.range !== undefined) {
|
|
110
|
+
if (typeof args.range !== 'number' || !(args.range >= 100 && args.range <= 20000))
|
|
111
|
+
throw bad('range', 'must be a number from 100 to 20000');
|
|
112
|
+
this.range = args.range;
|
|
113
|
+
}
|
|
114
|
+
return state();
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
destroy() {
|
|
120
|
+
this.#params.destroy();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=shafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shafts.js","sourceRoot":"","sources":["../src/shafts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yali-engine/clouds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Yali clouds: volumetric cumulus ray-marched through procedural noise, lit by the sun and the sky, a render feature (ADR-0219).",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@yali-engine/math": "0.
|
|
22
|
-
"@yali-engine/render": "0.
|
|
21
|
+
"@yali-engine/math": "0.15.0",
|
|
22
|
+
"@yali-engine/render": "0.15.0"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"typecheck": "tsc -p tsconfig.json",
|