@yali-engine/clouds 0.12.0 → 0.14.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 +2 -2
- package/dist/clouds-shaders.gen.js +2 -2
- package/dist/clouds-shaders.gen.js.map +1 -1
- package/dist/clouds.d.ts +22 -3
- package/dist/clouds.js +139 -10
- package/dist/clouds.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
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: "9d46557cec5b7088";
|
|
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,\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;\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}\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}\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
5
|
};
|
|
@@ -2,7 +2,7 @@
|
|
|
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: '9d46557cec5b7088',
|
|
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,\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;\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}\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}\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
7
|
};
|
|
8
8
|
//# 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,sveAAsve;CACpve,CAAC"}
|
package/dist/clouds.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ 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];
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Volumetric clouds (ADR-0219): a layer of cumulus ray-marched through procedural noise, lit by the sun and the sky,
|
|
@@ -58,20 +60,37 @@ export declare class Clouds implements RenderFeature {
|
|
|
58
60
|
enabled: boolean;
|
|
59
61
|
/** The reflections' panorama (rgb light, a transmittance; u = azimuth / 2π, v = √(sin elevation)). */
|
|
60
62
|
readonly panorama: GPUTexture;
|
|
63
|
+
/**
|
|
64
|
+
* The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
|
|
65
|
+
* Published on the environment as `cloudShadow` for the scene and the water.
|
|
66
|
+
*/
|
|
67
|
+
readonly shadow: GPUTexture;
|
|
68
|
+
/** Cast shadows on the ground and the water (ADR-0227; live). */
|
|
69
|
+
shadows: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
|
|
72
|
+
* place its clouds (a showcase starting in sunshine) without changing their shapes.
|
|
73
|
+
*/
|
|
74
|
+
offset: [number, number];
|
|
61
75
|
constructor(device: GPUDevice, o: CloudOptions);
|
|
62
76
|
init(cache: PipelineCache, format: GPUTextureFormat): Promise<void>;
|
|
63
77
|
prepare(f: RenderFeatureFrame): void;
|
|
64
78
|
addPasses(graph: FrameGraph, color: string, depth: string, scene: SceneRenderer): void;
|
|
65
79
|
/**
|
|
66
|
-
* The march's GPU cost, ms a frame (wall time of `frames` frames' march, rebuild and panorama in one submission
|
|
67
|
-
* `
|
|
80
|
+
* The march's GPU cost, ms a frame (wall time of `frames` + 1 frames' march, rebuild and panorama in one submission
|
|
81
|
+
* less that of 1, over `frames`, each to `onSubmittedWorkDone`): a frame-graph pass timer cannot tell it, as the first pass after
|
|
68
82
|
* the scene's absorbs the scene's drain (trap 237). Null before the first frame.
|
|
69
83
|
*
|
|
70
84
|
* @example
|
|
71
85
|
* const ms = await render.features.find((f) => f.name === 'clouds').measure();
|
|
72
86
|
*/
|
|
73
87
|
measure(frames?: number): Promise<number | null>;
|
|
74
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
|
|
90
|
+
* argument's `path`.
|
|
91
|
+
*/
|
|
92
|
+
tools(): ReturnType<NonNullable<RenderFeature['tools']>>;
|
|
93
|
+
/** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
|
|
75
94
|
get gpuBytes(): number;
|
|
76
95
|
destroy(): void;
|
|
77
96
|
}
|
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 ten vectors. */
|
|
10
|
+
const PARAMS_BYTES = (16 * 2 + 4 * 10) * 4;
|
|
11
11
|
const SHAPE_SIZE = 128;
|
|
12
12
|
const DETAIL_SIZE = 32;
|
|
13
13
|
const PANO = [1024, 256];
|
|
@@ -15,6 +15,9 @@ 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;
|
|
20
23
|
/** The order the 2 × 2 phases are marched in (a Bayer pattern). */
|
|
@@ -60,6 +63,21 @@ export class Clouds {
|
|
|
60
63
|
#panoWork;
|
|
61
64
|
#shape;
|
|
62
65
|
#weather;
|
|
66
|
+
/**
|
|
67
|
+
* The cloud shadow map (ADR-0227): r = the sun's light through the layer at sea level, over `SHADOW_KM` about the camera.
|
|
68
|
+
* Published on the environment as `cloudShadow` for the scene and the water.
|
|
69
|
+
*/
|
|
70
|
+
shadow;
|
|
71
|
+
/** The shadow map's centre (world km), or null before it is made; true while every row must be marched. */
|
|
72
|
+
#shadowAt = null;
|
|
73
|
+
#shadowAll = true;
|
|
74
|
+
/** Cast shadows on the ground and the water (ADR-0227; live). */
|
|
75
|
+
shadows = true;
|
|
76
|
+
/**
|
|
77
|
+
* Where the cloud field sits, world x and z in metres (ADR-0231; live): the whole weather moves by it, so an app can
|
|
78
|
+
* place its clouds (a showcase starting in sunshine) without changing their shapes.
|
|
79
|
+
*/
|
|
80
|
+
offset = [0, 0];
|
|
63
81
|
/** The weather map's centre (world km), or null before it is made. */
|
|
64
82
|
#weatherAt = null;
|
|
65
83
|
#detail;
|
|
@@ -99,10 +117,14 @@ export class Clouds {
|
|
|
99
117
|
this.haze = o.haze ?? 12;
|
|
100
118
|
this.erosion = o.erosion ?? 1;
|
|
101
119
|
this.quality = o.quality ?? 'high';
|
|
120
|
+
if (o.offset)
|
|
121
|
+
this.offset = [o.offset[0], o.offset[1]];
|
|
102
122
|
if (!(this.top > this.bottom && this.bottom >= 0))
|
|
103
123
|
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
124
|
this.#shape = device.createTexture({ label: 'yali:clouds:shape', size: [SHAPE_SIZE, SHAPE_SIZE, SHAPE_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
|
|
105
125
|
this.#weather = device.createTexture({ label: 'yali:clouds:weather', size: [WEATHER, WEATHER], format: 'rgba8unorm', usage: STORE });
|
|
126
|
+
// COPY_SRC: tools and probes read it back.
|
|
127
|
+
this.shadow = device.createTexture({ label: 'yali:clouds:shadow', size: [SHADOW, SHADOW], format: 'rgba16float', usage: STORE | 0x01 });
|
|
106
128
|
this.#detail = device.createTexture({ label: 'yali:clouds:detail', size: [DETAIL_SIZE, DETAIL_SIZE, DETAIL_SIZE], dimension: '3d', format: 'rgba8unorm', usage: STORE });
|
|
107
129
|
// Rows accumulate over frames: marched into the work texture from the panorama, then copied back (COPY_SRC |
|
|
108
130
|
// COPY_DST; tools and probes read the panorama back too).
|
|
@@ -115,13 +137,14 @@ export class Clouds {
|
|
|
115
137
|
}
|
|
116
138
|
async init(cache, format) {
|
|
117
139
|
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([
|
|
140
|
+
const [shape, detail, weather, march, rebuild, pano, shadow, draw] = await Promise.all([
|
|
119
141
|
c('gen_shape'),
|
|
120
142
|
c('gen_detail'),
|
|
121
143
|
c('gen_weather'),
|
|
122
144
|
c('march_view'),
|
|
123
145
|
c('reconstruct'),
|
|
124
146
|
c('panorama'),
|
|
147
|
+
c('shadow_map'),
|
|
125
148
|
cache.render({
|
|
126
149
|
label: 'yali:clouds:draw',
|
|
127
150
|
vertex: { shader: cloudsShader, entryPoint: 'vs_composite' },
|
|
@@ -130,7 +153,7 @@ export class Clouds {
|
|
|
130
153
|
primitive: { topology: 'triangle-list' },
|
|
131
154
|
}),
|
|
132
155
|
]);
|
|
133
|
-
this.#p = { shape, detail, weather, march, rebuild, pano, draw };
|
|
156
|
+
this.#p = { shape, detail, weather, march, rebuild, pano, shadow, draw };
|
|
134
157
|
}
|
|
135
158
|
/** The textures that follow the render size: this frame's samples (a quarter) and the half-size history (two). */
|
|
136
159
|
#resize(w, h) {
|
|
@@ -175,7 +198,7 @@ export class Clouds {
|
|
|
175
198
|
d.set([eye[0] / 1000, eye[2] / 1000, PLANET_KM + Math.max(eye[1], 1) / 1000, f.seconds], 36);
|
|
176
199
|
d.set([this.bottom / 1000, this.top / 1000, Math.max(0, Math.min(1, this.coverage)), this.density], 40);
|
|
177
200
|
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);
|
|
201
|
+
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
202
|
const ph = PHASES[this.#frame & 3];
|
|
180
203
|
d.set([this.#size[0], this.#size[1], ph[0], ph[1]], 48);
|
|
181
204
|
d.set(QUALITY[this.quality], 52);
|
|
@@ -195,6 +218,15 @@ export class Clouds {
|
|
|
195
218
|
if (regen)
|
|
196
219
|
this.#weatherAt = [ex, ez];
|
|
197
220
|
d.set([this.#weatherAt[0], this.#weatherAt[1], WEATHER_KM, WEATHER], 64);
|
|
221
|
+
// The shadow map follows the camera in steps of an eighth of its width, every row marched after a move, a quarter of
|
|
222
|
+
// them a frame otherwise (ADR-0227).
|
|
223
|
+
const sa = this.#shadowAt;
|
|
224
|
+
if (!sa || Math.abs(ex - sa[0]) > SHADOW_KM / 8 || Math.abs(ez - sa[1]) > SHADOW_KM / 8) {
|
|
225
|
+
this.#shadowAt = [Math.round(ex / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW), Math.round(ez / (SHADOW_KM / SHADOW)) * (SHADOW_KM / SHADOW)];
|
|
226
|
+
this.#shadowAll = true;
|
|
227
|
+
}
|
|
228
|
+
d.set([this.#shadowAt[0], this.#shadowAt[1], SHADOW_KM, this.#shadowAll ? 4 : this.#frame & 3], 68);
|
|
229
|
+
f.environment.cloudShadow = this.enabled && this.shadows ? { texture: this.shadow, centre: [this.#shadowAt[0] * 1000, this.#shadowAt[1] * 1000], size: SHADOW_KM * 1000 } : null;
|
|
198
230
|
this.device.queue.writeBuffer(this.#params, 0, d);
|
|
199
231
|
if ((regen || this.#weatherStale) && this.#p) {
|
|
200
232
|
const enc = this.device.createCommandEncoder({ label: 'yali:clouds:weather' });
|
|
@@ -232,6 +264,19 @@ export class Clouds {
|
|
|
232
264
|
march: d.createBindGroup({ label: 'yali:clouds:march', layout: p.march.getBindGroupLayout(0), entries: [...shared, { binding: 9, resource: this.#current.createView() }] }),
|
|
233
265
|
rebuild: [rebuild(h0, h1), rebuild(h1, h0)],
|
|
234
266
|
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() }] }),
|
|
267
|
+
shadow: d.createBindGroup({
|
|
268
|
+
label: 'yali:clouds:shadow',
|
|
269
|
+
layout: p.shadow.getBindGroupLayout(0),
|
|
270
|
+
entries: [
|
|
271
|
+
{ binding: 0, resource: { buffer: this.#params } },
|
|
272
|
+
{ binding: 3, resource: this.#clamp },
|
|
273
|
+
{ binding: 4, resource: this.#shape.createView({ dimension: '3d' }) },
|
|
274
|
+
{ binding: 5, resource: this.#detail.createView({ dimension: '3d' }) },
|
|
275
|
+
{ binding: 6, resource: this.#wrap },
|
|
276
|
+
{ binding: 16, resource: this.#weather.createView() },
|
|
277
|
+
{ binding: 18, resource: this.shadow.createView() },
|
|
278
|
+
],
|
|
279
|
+
}),
|
|
235
280
|
};
|
|
236
281
|
this.#drawGroups = null;
|
|
237
282
|
return true;
|
|
@@ -271,6 +316,12 @@ export class Clouds {
|
|
|
271
316
|
pass.setPipeline(p.pano);
|
|
272
317
|
pass.setBindGroup(0, g.pano);
|
|
273
318
|
pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
|
|
319
|
+
if (this.shadows) {
|
|
320
|
+
pass.setPipeline(p.shadow);
|
|
321
|
+
pass.setBindGroup(0, g.shadow);
|
|
322
|
+
pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
|
|
323
|
+
this.#shadowAll = false;
|
|
324
|
+
}
|
|
274
325
|
},
|
|
275
326
|
});
|
|
276
327
|
// The panorama's marched rows back into the one reflections read.
|
|
@@ -308,8 +359,8 @@ export class Clouds {
|
|
|
308
359
|
});
|
|
309
360
|
}
|
|
310
361
|
/**
|
|
311
|
-
* The march's GPU cost, ms a frame (wall time of `frames` frames' march, rebuild and panorama in one submission
|
|
312
|
-
* `
|
|
362
|
+
* The march's GPU cost, ms a frame (wall time of `frames` + 1 frames' march, rebuild and panorama in one submission
|
|
363
|
+
* less that of 1, over `frames`, each to `onSubmittedWorkDone`): a frame-graph pass timer cannot tell it, as the first pass after
|
|
313
364
|
* the scene's absorbs the scene's drain (trap 237). Null before the first frame.
|
|
314
365
|
*
|
|
315
366
|
* @example
|
|
@@ -334,6 +385,11 @@ export class Clouds {
|
|
|
334
385
|
pass.setPipeline(p.pano);
|
|
335
386
|
pass.setBindGroup(0, g.pano);
|
|
336
387
|
pass.dispatchWorkgroups(PANO[0] / 8, PANO[1] / 8);
|
|
388
|
+
if (this.shadows) {
|
|
389
|
+
pass.setPipeline(p.shadow);
|
|
390
|
+
pass.setBindGroup(0, g.shadow);
|
|
391
|
+
pass.dispatchWorkgroups(SHADOW / 8, SHADOW / 8);
|
|
392
|
+
}
|
|
337
393
|
}
|
|
338
394
|
pass.end();
|
|
339
395
|
await this.device.queue.onSubmittedWorkDone();
|
|
@@ -343,16 +399,89 @@ export class Clouds {
|
|
|
343
399
|
return performance.now() - t0;
|
|
344
400
|
};
|
|
345
401
|
await run(2);
|
|
346
|
-
|
|
402
|
+
// The render loop's own frames land in either window: the difference of two batch sizes cancels them.
|
|
403
|
+
const small = await run(1);
|
|
404
|
+
return Math.max(0, (await run(frames + 1)) - small) / frames;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Its agent tools (ADR-0227): `clouds.state` reads the layer and its knobs, `clouds.set` turns them. Errors carry the
|
|
408
|
+
* argument's `path`.
|
|
409
|
+
*/
|
|
410
|
+
tools() {
|
|
411
|
+
const bad = (path, message) => Object.assign(new Error(`CLOUDS_INVALID: ${path} ${message}`), { code: 'CLOUDS_INVALID', path, message: `${path} ${message}` });
|
|
412
|
+
const num = (args, k, min, max = Number.POSITIVE_INFINITY) => {
|
|
413
|
+
const v = args[k];
|
|
414
|
+
if (v === undefined)
|
|
415
|
+
return undefined;
|
|
416
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v < min || v > max)
|
|
417
|
+
throw bad(k, `must be a number from ${min}${Number.isFinite(max) ? ` to ${max}` : ''}`);
|
|
418
|
+
return v;
|
|
419
|
+
};
|
|
420
|
+
const state = () => ({
|
|
421
|
+
enabled: this.enabled,
|
|
422
|
+
shadows: this.shadows,
|
|
423
|
+
quality: this.quality,
|
|
424
|
+
coverage: this.coverage,
|
|
425
|
+
bottom: this.bottom,
|
|
426
|
+
top: this.top,
|
|
427
|
+
density: this.density,
|
|
428
|
+
wind: this.wind,
|
|
429
|
+
windDirection: this.windDirection,
|
|
430
|
+
gpuBytes: this.gpuBytes,
|
|
431
|
+
});
|
|
432
|
+
return [
|
|
433
|
+
{ name: 'clouds.state', description: 'The volumetric clouds: on or off, whether they shadow the ground and water, quality, coverage, layer, density, wind and GPU bytes.', input: { type: 'object', properties: {} }, run: state },
|
|
434
|
+
{
|
|
435
|
+
name: 'clouds.set',
|
|
436
|
+
description: "Turns the clouds' live knobs; only the arguments given change. Returns the new state.",
|
|
437
|
+
input: {
|
|
438
|
+
type: 'object',
|
|
439
|
+
properties: {
|
|
440
|
+
enabled: { type: 'boolean', description: 'March and draw the clouds at all.' },
|
|
441
|
+
shadows: { type: 'boolean', description: 'Cast the clouds’ shadows on the ground and the water.' },
|
|
442
|
+
quality: { type: 'string', description: 'The march budget: high, medium or low.' },
|
|
443
|
+
coverage: { type: 'number', description: 'How much of the sky is cloud, 0 to 1.' },
|
|
444
|
+
density: { type: 'number', description: 'Extinction inside a full cloud, per km, 1 to 500.' },
|
|
445
|
+
wind: { type: 'number', description: 'The wind at the clouds, m/s, 0 to 60.' },
|
|
446
|
+
windDirection: { type: 'number', description: 'The direction the wind blows towards, radians from +x.' },
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
run: (args) => {
|
|
450
|
+
if (args.enabled !== undefined)
|
|
451
|
+
this.enabled = !!args.enabled;
|
|
452
|
+
if (args.shadows !== undefined)
|
|
453
|
+
this.shadows = !!args.shadows;
|
|
454
|
+
if (args.quality !== undefined) {
|
|
455
|
+
if (args.quality !== 'high' && args.quality !== 'medium' && args.quality !== 'low')
|
|
456
|
+
throw bad('quality', 'must be high, medium or low');
|
|
457
|
+
this.quality = args.quality;
|
|
458
|
+
}
|
|
459
|
+
const c = num(args, 'coverage', 0, 1);
|
|
460
|
+
if (c !== undefined)
|
|
461
|
+
this.coverage = c;
|
|
462
|
+
const d = num(args, 'density', 1, 500);
|
|
463
|
+
if (d !== undefined)
|
|
464
|
+
this.density = d;
|
|
465
|
+
const w = num(args, 'wind', 0, 60);
|
|
466
|
+
if (w !== undefined)
|
|
467
|
+
this.wind = w;
|
|
468
|
+
const wd = num(args, 'windDirection', -Math.PI * 4, Math.PI * 4);
|
|
469
|
+
if (wd !== undefined)
|
|
470
|
+
this.windDirection = wd;
|
|
471
|
+
return state();
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
];
|
|
347
475
|
}
|
|
348
|
-
/** What the clouds hold on the GPU: the noise volumes, the panorama and the
|
|
476
|
+
/** What the clouds hold on the GPU: the noise volumes, the panorama, the history and the shadow map. */
|
|
349
477
|
get gpuBytes() {
|
|
350
478
|
const [w, h] = this.#size;
|
|
351
|
-
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;
|
|
479
|
+
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;
|
|
352
480
|
}
|
|
353
481
|
destroy() {
|
|
354
482
|
this.#shape.destroy();
|
|
355
483
|
this.#weather.destroy();
|
|
484
|
+
this.shadow.destroy();
|
|
356
485
|
this.#detail.destroy();
|
|
357
486
|
this.panorama.destroy();
|
|
358
487
|
this.#panoWork.destroy();
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yali-engine/clouds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.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.14.0",
|
|
22
|
+
"@yali-engine/render": "0.14.0"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"typecheck": "tsc -p tsconfig.json",
|