@meimu/mutracer 0.2.0 → 0.3.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/README.md +3 -0
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +8949 -7915
- package/docs/api.md +42 -21
- package/docs/caustics.md +80 -0
- package/docs/materials.md +5 -4
- package/docs/progressive-rendering.md +50 -9
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +7 -5
- package/lib/Display.js +1 -1
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +47 -12
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +61 -13
- package/lib/Render.js +169 -19
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +4 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +48 -17
- package/lib/renderer/WGPURayTracePass.js +538 -340
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +83 -47
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +4 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
- package/lib/renderer/WebGLRayTracePass.js +43 -6
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +33 -33
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +260 -237
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +4 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuShaderSource.d.ts +7 -0
- package/lib/renderer/wgpuShaderSource.js +2 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +2 -2
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +2 -1
- package/package.json +3 -3
|
@@ -16,41 +16,41 @@ const BOUNCE_STRIDE = 64u;
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
var<private>
|
|
20
|
-
var<private>
|
|
21
|
-
var<private>
|
|
22
|
-
var<private>
|
|
23
|
-
fn
|
|
24
|
-
var x =
|
|
19
|
+
var<private> aI: vec2u;
|
|
20
|
+
var<private> aC: u32;
|
|
21
|
+
var<private> samplingBounce: u32 = 0u;
|
|
22
|
+
var<private> ca: u32 = 0u;
|
|
23
|
+
fn cB(kC: u32) -> u32 {
|
|
24
|
+
var x = kC;
|
|
25
25
|
x ^= x >> 16u; x *= 0x7feb352du;
|
|
26
26
|
x ^= x >> 15u; x *= 0x846ca68bu;
|
|
27
27
|
return x ^ (x >> 16u);
|
|
28
28
|
}
|
|
29
|
-
fn
|
|
30
|
-
return
|
|
29
|
+
fn ak(a: u32, b: u32) -> u32 {
|
|
30
|
+
return cB(a ^ cB(b + 0x9e3779b9u));
|
|
31
31
|
}
|
|
32
|
-
fn
|
|
33
|
-
var x =
|
|
32
|
+
fn iD(kC: u32, seed: u32) -> u32 {
|
|
33
|
+
var x = kC + seed;
|
|
34
34
|
x ^= x * 0x6c50b47cu; x ^= x * 0xb82f1e52u;
|
|
35
35
|
x ^= x * 0xc7afe638u; x ^= x * 0x8d22f6e6u;
|
|
36
36
|
return x;
|
|
37
37
|
}
|
|
38
|
-
fn
|
|
39
|
-
return reverseBits(
|
|
38
|
+
fn ud(x: u32, seed: u32) -> u32 {
|
|
39
|
+
return reverseBits(iD(reverseBits(x), seed));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
fn
|
|
43
|
-
var r = reverseBits(
|
|
42
|
+
fn sm(kC: u32) -> u32 {
|
|
43
|
+
var r = reverseBits(kC);
|
|
44
44
|
${sobolD1Steps.map(([shift, mask]) => `r ^= (r << ${shift}u) & 0x${mask.toString(16)}u;`).join("\n ")}
|
|
45
45
|
return r;
|
|
46
46
|
}
|
|
47
|
-
fn
|
|
48
|
-
let i =
|
|
49
|
-
let x = reverseBits(
|
|
50
|
-
let y =
|
|
47
|
+
fn yf(index: u32, seed: u32) -> vec2f {
|
|
48
|
+
let i = ud(index, ak(seed, 0u));
|
|
49
|
+
let x = reverseBits(iD(i, ak(seed, 1u)));
|
|
50
|
+
let y = ud(sm(i), ak(seed, 2u));
|
|
51
51
|
return vec2f(f32(x >> 8u), f32(y >> 8u)) * (1.0 / 16777216.0);
|
|
52
52
|
}
|
|
53
|
-
fn
|
|
53
|
+
fn uX(p: vec2u) -> u32 {
|
|
54
54
|
var v = p & vec2u(255u);
|
|
55
55
|
v = (v | (v << vec2u(4u))) & vec2u(0x0f0fu);
|
|
56
56
|
v = (v | (v << vec2u(2u))) & vec2u(0x3333u);
|
|
@@ -58,112 +58,112 @@ v = (v | (v << vec2u(1u))) & vec2u(0x5555u);
|
|
|
58
58
|
return v.x | (v.y << 1u);
|
|
59
59
|
}
|
|
60
60
|
${zSobolPackedPermutations.map((v, i) => `const Z_PERM_${i} = ${v}u;`).join("\n")}
|
|
61
|
-
fn
|
|
62
|
-
let group =
|
|
61
|
+
fn kG(va: u32) -> u32 {
|
|
62
|
+
let group = va >> 2u;
|
|
63
63
|
var word = Z_PERM_5;
|
|
64
64
|
${[0, 1, 2, 3, 4].map(i => `word = select(word, Z_PERM_${i}, group == ${i}u);`).join("\n ")}
|
|
65
|
-
return (word >> ((
|
|
65
|
+
return (word >> ((va & 3u) * 8u)) & 255u;
|
|
66
66
|
}
|
|
67
|
-
fn
|
|
67
|
+
fn qJ(kY: u32, dim: u32, logSPP: u32) -> u32 {
|
|
68
68
|
let odd = logSPP & 1u;
|
|
69
|
-
let
|
|
69
|
+
let wb = 8u + ((logSPP + 1u) >> 1u);
|
|
70
70
|
var result = 0u;
|
|
71
|
-
for (var digit = i32(
|
|
71
|
+
for (var digit = i32(wb) - 1; digit >= i32(odd); digit--) {
|
|
72
72
|
let shift = 2u*u32(digit) - odd;
|
|
73
73
|
|
|
74
|
-
var
|
|
75
|
-
if (shift < 30u) {
|
|
76
|
-
let
|
|
77
|
-
let d = (
|
|
78
|
-
result |= ((
|
|
74
|
+
var tN = 0u;
|
|
75
|
+
if (shift < 30u) { tN = kY >> (shift + 2u); }
|
|
76
|
+
let va = (cB(tN ^ (0x55555555u * dim)) >> 24u) % 24u;
|
|
77
|
+
let d = (kY >> shift) & 3u;
|
|
78
|
+
result |= ((kG(va) >> (2u*d)) & 3u) << shift;
|
|
79
79
|
}
|
|
80
80
|
if (odd != 0u) {
|
|
81
|
-
result |= (
|
|
81
|
+
result |= (kY & 1u) ^ (cB((kY >> 1u) ^ (0x55555555u * dim)) & 1u);
|
|
82
82
|
}
|
|
83
83
|
return result;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
fn
|
|
89
|
-
return CAMERA_BEVEL_BASE + u32(BEVEL_SAMPLES) +
|
|
88
|
+
fn bE(slot: u32) -> u32 {
|
|
89
|
+
return CAMERA_BEVEL_BASE + u32(BEVEL_SAMPLES) + samplingBounce * BOUNCE_STRIDE + slot;
|
|
90
90
|
}
|
|
91
|
-
fn
|
|
91
|
+
fn sf(candidate: u32, slot: u32) -> u32 {
|
|
92
92
|
if (candidate == 0u) {
|
|
93
|
-
if (slot == 2u) { return
|
|
94
|
-
return
|
|
93
|
+
if (slot == 2u) { return bE(8u); }
|
|
94
|
+
return bE(slot);
|
|
95
95
|
}
|
|
96
|
-
return
|
|
96
|
+
return bE(9u + (candidate - 1u) * 3u + slot);
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
|
|
100
|
-
var<private>
|
|
101
|
-
var<private>
|
|
102
|
-
var<private>
|
|
103
|
-
var<private>
|
|
104
|
-
var<private>
|
|
105
|
-
var<private>
|
|
106
|
-
var<private>
|
|
107
|
-
fn
|
|
100
|
+
var<private> hg: vec4u;
|
|
101
|
+
var<private> hh: u32;
|
|
102
|
+
var<private> fA: bool = false;
|
|
103
|
+
var<private> cX: bool = false;
|
|
104
|
+
var<private> dD: u32;
|
|
105
|
+
var<private> gt: u32;
|
|
106
|
+
var<private> eJ: vec2f;
|
|
107
|
+
fn dm(dim: u32) {
|
|
108
108
|
|
|
109
|
-
let
|
|
110
|
-
let key = vec4u(dim,
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
var seed =
|
|
115
|
-
var index =
|
|
109
|
+
let kl = aI.x + aI.y * u32(rtUniform.outputSize.x);
|
|
110
|
+
let key = vec4u(dim, aC, kl, rtUniform.sequenceSeed);
|
|
111
|
+
if (fA && all(hg == key) && hh == rtUniform.zSobolLogSPP) { return; }
|
|
112
|
+
hg = key; hh = rtUniform.zSobolLogSPP;
|
|
113
|
+
fA = true; cX = false;
|
|
114
|
+
var seed = ak(ak(kl, dim), rtUniform.sequenceSeed);
|
|
115
|
+
var index = aC;
|
|
116
116
|
if (SAMPLING_PATTERN == 1) {
|
|
117
117
|
var logSPP = rtUniform.zSobolLogSPP;
|
|
118
118
|
if (index == 0u) { logSPP = 0u; }
|
|
119
119
|
else { index -= 1u; }
|
|
120
120
|
|
|
121
|
-
var
|
|
121
|
+
var jd = index >> logSPP;
|
|
122
122
|
let mask = (1u << logSPP) - 1u;
|
|
123
|
-
let
|
|
124
|
-
index =
|
|
125
|
-
let tile =
|
|
126
|
-
seed =
|
|
123
|
+
let kY = (uX(aI) << logSPP) | (index & mask);
|
|
124
|
+
index = qJ(kY, dim, logSPP);
|
|
125
|
+
let tile = aI >> vec2u(8u);
|
|
126
|
+
seed = ak(ak(dim, rtUniform.sequenceSeed), ak(tile.x, tile.y));
|
|
127
127
|
|
|
128
|
-
if (
|
|
129
|
-
seed =
|
|
128
|
+
if (aC != 0u) { jd += 1u; }
|
|
129
|
+
seed = ak(seed, jd);
|
|
130
130
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let x = reverseBits(
|
|
134
|
-
|
|
131
|
+
dD = ud(index, ak(seed, 0u));
|
|
132
|
+
gt = seed;
|
|
133
|
+
let x = reverseBits(iD(dD, ak(seed, 1u)));
|
|
134
|
+
eJ.x = f32(x >> 8u) * (1.0 / 16777216.0);
|
|
135
135
|
}
|
|
136
|
-
fn
|
|
137
|
-
|
|
138
|
-
if (!
|
|
139
|
-
let y =
|
|
140
|
-
|
|
141
|
-
|
|
136
|
+
fn le(dim: u32) -> vec2f {
|
|
137
|
+
dm(dim);
|
|
138
|
+
if (!cX) {
|
|
139
|
+
let y = ud(sm(dD), ak(gt, 2u));
|
|
140
|
+
eJ.y = f32(y >> 8u) * (1.0 / 16777216.0);
|
|
141
|
+
cX = true;
|
|
142
142
|
}
|
|
143
|
-
return EPS + (1.0 - 2.0*EPS) *
|
|
143
|
+
return EPS + (1.0 - 2.0*EPS) * eJ;
|
|
144
144
|
}
|
|
145
|
-
fn
|
|
145
|
+
fn sample1D(dim: u32) -> f32 {
|
|
146
146
|
if (SAMPLING_PATTERN == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
|
|
147
|
-
|
|
148
|
-
return EPS + (1.0 - 2.0*EPS) *
|
|
147
|
+
dm(dim);
|
|
148
|
+
return EPS + (1.0 - 2.0*EPS) * eJ.x;
|
|
149
149
|
}
|
|
150
|
-
fn
|
|
150
|
+
fn sample2D(dim: u32) -> vec2f {
|
|
151
151
|
if (SAMPLING_PATTERN == 2) {
|
|
152
|
-
let x =
|
|
152
|
+
let x = sample1D(dim); let y = sample1D(dim);
|
|
153
153
|
return vec2f(x,y);
|
|
154
154
|
}
|
|
155
|
-
return
|
|
155
|
+
return le(dim);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
fn
|
|
159
|
-
let dim =
|
|
160
|
-
|
|
158
|
+
fn ek(slot: u32) -> f32 {
|
|
159
|
+
let dim = ak(ak(samplingBounce, slot), ca) | 0x80000000u;
|
|
160
|
+
ca += 1u;
|
|
161
161
|
if (SAMPLING_PATTERN == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
|
|
162
162
|
|
|
163
|
-
let
|
|
164
|
-
let seed =
|
|
165
|
-
let i =
|
|
166
|
-
let x = reverseBits(
|
|
163
|
+
let kl = aI.x + aI.y * u32(rtUniform.outputSize.x);
|
|
164
|
+
let seed = ak(ak(kl, dim), rtUniform.sequenceSeed);
|
|
165
|
+
let i = ud(aC, ak(seed, 0u));
|
|
166
|
+
let x = reverseBits(iD(i, ak(seed, 1u)));
|
|
167
167
|
return EPS + (1.0 - 2.0*EPS) * (f32(x >> 8u) * (1.0 / 16777216.0));
|
|
168
168
|
}
|
|
169
169
|
`;
|
|
@@ -7,12 +7,12 @@ let theta = atan2(n.x, n.z) / (2.0 * PI) + 0.5;
|
|
|
7
7
|
let phi = acos(n.y) / PI;
|
|
8
8
|
return vec2f(theta, 1.0 - phi);
|
|
9
9
|
}
|
|
10
|
-
fn
|
|
11
|
-
let
|
|
10
|
+
fn iO(pos: vec3f, normal: vec3f) -> vec2f {
|
|
11
|
+
let dg = abs(normal);
|
|
12
12
|
var uv = vec2f(0.0);
|
|
13
|
-
if (
|
|
13
|
+
if (dg.x > dg.y && dg.x > dg.z) {
|
|
14
14
|
uv = pos.yz;
|
|
15
|
-
} else if (
|
|
15
|
+
} else if (dg.y > dg.x && dg.y > dg.z) {
|
|
16
16
|
uv = pos.xz;
|
|
17
17
|
} else {
|
|
18
18
|
uv = pos.xy;
|
|
@@ -23,18 +23,18 @@ return uv;
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
fn
|
|
26
|
+
fn hA(pos: vec3f, normal: vec3f) -> vec2f {
|
|
27
27
|
let theta = atan2(pos.z, pos.x) / (2.0 * PI) + 0.5;
|
|
28
28
|
return vec2f(theta, pos.y);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
fn
|
|
32
|
-
if (
|
|
33
|
-
return
|
|
34
|
-
} else if (
|
|
31
|
+
fn gE(fg: i32, pos: vec3f, normal: vec3f) -> vec2f {
|
|
32
|
+
if (fg == ${uvProjectionConstants.triplanar}) {
|
|
33
|
+
return iO(pos, normal);
|
|
34
|
+
} else if (fg == ${uvProjectionConstants.spherical}) {
|
|
35
35
|
return sphericalProjection(pos);
|
|
36
|
-
} else if (
|
|
37
|
-
return
|
|
36
|
+
} else if (fg == ${uvProjectionConstants.cylindrical}) {
|
|
37
|
+
return hA(pos, normal);
|
|
38
38
|
}
|
|
39
39
|
return vec2f(0.0);
|
|
40
40
|
}
|
|
@@ -8,24 +8,24 @@ return select(high, low, linear <= vec3f(0.0031308));
|
|
|
8
8
|
`;
|
|
9
9
|
export const composeDefine = /* wgsl */ `
|
|
10
10
|
|
|
11
|
-
fn
|
|
11
|
+
fn kb(color: vec3f) -> vec3f {
|
|
12
12
|
return clamp(color, vec3f(0.0), vec3f(1.0));
|
|
13
13
|
}
|
|
14
|
-
fn
|
|
14
|
+
fn iN(color: vec3f) -> vec3f {
|
|
15
15
|
return clamp(color / (vec3f(1.0) + color), vec3f(0.0), vec3f(1.0));
|
|
16
16
|
}
|
|
17
|
-
fn
|
|
18
|
-
let color = max(vec3f(0.0),
|
|
17
|
+
fn jP(jz: vec3f) -> vec3f {
|
|
18
|
+
let color = max(vec3f(0.0), jz - 0.004);
|
|
19
19
|
return pow((color * (6.2 * color + 0.5)) /
|
|
20
20
|
(color * (6.2 * color + 1.7) + 0.06), vec3f(2.2));
|
|
21
21
|
}
|
|
22
|
-
fn
|
|
23
|
-
let
|
|
24
|
-
let
|
|
25
|
-
return
|
|
22
|
+
fn pm(value: vec3f) -> vec3f {
|
|
23
|
+
let iF = value * (value + 0.0245786) - 0.000090537;
|
|
24
|
+
let ah = value * (0.983729 * value + 0.4329510) + 0.238081;
|
|
25
|
+
return iF / ah;
|
|
26
26
|
}
|
|
27
|
-
fn
|
|
28
|
-
let
|
|
27
|
+
fn lO(jz: vec3f) -> vec3f {
|
|
28
|
+
let qk = mat3x3f(
|
|
29
29
|
vec3f(0.59719, 0.07600, 0.02840),
|
|
30
30
|
vec3f(0.35458, 0.90834, 0.13383),
|
|
31
31
|
vec3f(0.04823, 0.01566, 0.83777)
|
|
@@ -35,63 +35,63 @@ vec3f(1.60475, -0.10208, -0.00327),
|
|
|
35
35
|
vec3f(-0.53108, 1.10813, -0.07276),
|
|
36
36
|
vec3f(-0.07367, -0.00605, 1.07602)
|
|
37
37
|
);
|
|
38
|
-
let color =
|
|
39
|
-
return clamp(outputMatrix *
|
|
38
|
+
let color = qk * (jz / 0.6);
|
|
39
|
+
return clamp(outputMatrix * pm(color), vec3f(0.0), vec3f(1.0));
|
|
40
40
|
}
|
|
41
|
-
fn
|
|
42
|
-
let
|
|
43
|
-
let
|
|
44
|
-
return 15.5 *
|
|
45
|
-
+ 31.96 *
|
|
46
|
-
+ 0.4298 *
|
|
41
|
+
fn fT(value: vec3f) -> vec3f {
|
|
42
|
+
let nB = value * value;
|
|
43
|
+
let rO = nB * nB;
|
|
44
|
+
return 15.5 * rO * nB - 40.14 * rO * value
|
|
45
|
+
+ 31.96 * rO - 6.868 * nB * value
|
|
46
|
+
+ 0.4298 * nB + 0.1191 * value - 0.00232;
|
|
47
47
|
}
|
|
48
|
-
fn
|
|
49
|
-
let
|
|
48
|
+
fn my(jz: vec3f) -> vec3f {
|
|
49
|
+
let nE = mat3x3f(
|
|
50
50
|
vec3f(1.6605, -0.1246, -0.0182),
|
|
51
51
|
vec3f(-0.5876, 1.1329, -0.1006),
|
|
52
52
|
vec3f(-0.0728, -0.0083, 1.1187)
|
|
53
53
|
);
|
|
54
|
-
let
|
|
54
|
+
let nF = mat3x3f(
|
|
55
55
|
vec3f(0.6274, 0.0691, 0.0164),
|
|
56
56
|
vec3f(0.3293, 0.9195, 0.0880),
|
|
57
57
|
vec3f(0.0433, 0.0113, 0.8956)
|
|
58
58
|
);
|
|
59
|
-
let
|
|
59
|
+
let qm = mat3x3f(
|
|
60
60
|
vec3f(0.856627153315983, 0.137318972929847, 0.11189821299995),
|
|
61
61
|
vec3f(0.0951212405381588, 0.761241990602591, 0.0767994186031903),
|
|
62
62
|
vec3f(0.0482516061458583, 0.101439036467562, 0.811302368396859)
|
|
63
63
|
);
|
|
64
|
-
let
|
|
64
|
+
let ph = mat3x3f(
|
|
65
65
|
vec3f(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),
|
|
66
66
|
vec3f(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),
|
|
67
67
|
vec3f(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)
|
|
68
68
|
);
|
|
69
|
-
var color =
|
|
69
|
+
var color = qm * (nF * jz);
|
|
70
70
|
color = clamp((log2(max(color, vec3f(1e-10))) + 12.47393) / 16.5, vec3f(0.0), vec3f(1.0));
|
|
71
|
-
color =
|
|
71
|
+
color = ph * fT(color);
|
|
72
72
|
color = pow(max(color, vec3f(0.0)), vec3f(2.2));
|
|
73
|
-
return clamp(
|
|
73
|
+
return clamp(nE * color, vec3f(0.0), vec3f(1.0));
|
|
74
74
|
}
|
|
75
|
-
fn
|
|
75
|
+
fn bZ(color: vec3f) -> vec3f {
|
|
76
76
|
let toneMappingMode = i32(toneMappingParams.x);
|
|
77
|
-
if (toneMappingMode == 1) { return
|
|
78
|
-
if (toneMappingMode == 2) { return
|
|
79
|
-
if (toneMappingMode == 3) { return
|
|
80
|
-
if (toneMappingMode == 4) { return
|
|
81
|
-
return
|
|
77
|
+
if (toneMappingMode == 1) { return lO(color); }
|
|
78
|
+
if (toneMappingMode == 2) { return jP(color); }
|
|
79
|
+
if (toneMappingMode == 3) { return iN(color); }
|
|
80
|
+
if (toneMappingMode == 4) { return kb(color); }
|
|
81
|
+
return my(color);
|
|
82
82
|
}
|
|
83
83
|
${linearToSrgbDefine}
|
|
84
|
-
fn
|
|
84
|
+
fn ga(jz: vec3f) -> vec3f {
|
|
85
85
|
let contrast = colorGradingParams.x;
|
|
86
86
|
let saturation = colorGradingParams.y;
|
|
87
87
|
let temperature = colorGradingParams.z;
|
|
88
88
|
let tint = colorGradingParams.w;
|
|
89
|
-
let
|
|
89
|
+
let uL = vec3f(
|
|
90
90
|
1.0 + temperature * 0.16 + tint * 0.04,
|
|
91
91
|
1.0 - tint * 0.12,
|
|
92
92
|
1.0 - temperature * 0.16 + tint * 0.04
|
|
93
93
|
);
|
|
94
|
-
var color = max(
|
|
94
|
+
var color = max(jz * uL, vec3f(0.0));
|
|
95
95
|
color = max((color - 0.18) * contrast + 0.18, vec3f(0.0));
|
|
96
96
|
let luminance = dot(color, vec3f(0.2126, 0.7152, 0.0722));
|
|
97
97
|
return max(mix(vec3f(luminance), color, saturation), vec3f(0.0));
|
|
@@ -101,54 +101,54 @@ export function createComposeMain(sdrEncoding = 'srgb') {
|
|
|
101
101
|
return /* wgsl */ `
|
|
102
102
|
|
|
103
103
|
var finalColor = load_colorTex(uv, 0);
|
|
104
|
-
var
|
|
104
|
+
var jp = vec4(0.0);
|
|
105
105
|
if (bloomIntensity > 0.0) {
|
|
106
|
-
|
|
107
|
-
finalColor = vec4f(finalColor.rgb +
|
|
106
|
+
jp = load_bloomTex(uv, 0) * bloomIntensity;
|
|
107
|
+
finalColor = vec4f(finalColor.rgb + jp.rgb, finalColor.a);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
var gradedColor =
|
|
111
|
-
let
|
|
112
|
-
gradedColor *= 1.0 - toneMappingParams.y *
|
|
113
|
-
let
|
|
114
|
-
if (!
|
|
115
|
-
gradedColor =
|
|
110
|
+
var gradedColor = ga(finalColor.rgb * exposure);
|
|
111
|
+
let iJ = smoothstep(0.2, 0.72, distance(vec2f(uv) / vec2f(colorTexRegion()), vec2f(0.5)));
|
|
112
|
+
gradedColor *= 1.0 - toneMappingParams.y * iJ;
|
|
113
|
+
let gy = hdrOutputEnabled > 0.5;
|
|
114
|
+
if (!gy) {
|
|
115
|
+
gradedColor = bZ(gradedColor);
|
|
116
116
|
}
|
|
117
|
-
let
|
|
117
|
+
let mN = select(
|
|
118
118
|
${sdrEncoding === 'srgb' ? 'linearToSrgb(gradedColor)' : 'pow(max(gradedColor, vec3f(0.0)), vec3f(1.0 / 2.2))'},
|
|
119
119
|
linearToSrgb(gradedColor),
|
|
120
|
-
|
|
120
|
+
gy
|
|
121
121
|
);
|
|
122
|
-
var
|
|
122
|
+
var oL = mN;
|
|
123
123
|
if (flatBackgroundColor.a > 0.5) {
|
|
124
|
-
let
|
|
124
|
+
let jj = clamp(
|
|
125
125
|
load_flatBackgroundMaskTex(uv, 0).a,
|
|
126
126
|
0.0,
|
|
127
127
|
1.0
|
|
128
128
|
);
|
|
129
|
-
let
|
|
130
|
-
|
|
129
|
+
let pR = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0)));
|
|
130
|
+
oL = mix(pR, mN, jj);
|
|
131
131
|
if (bloomIntensity > 0.0) {
|
|
132
|
-
var unbloomedColor =
|
|
133
|
-
max(finalColor.rgb -
|
|
132
|
+
var unbloomedColor = ga(
|
|
133
|
+
max(finalColor.rgb - jp.rgb, vec3f(0.0))
|
|
134
134
|
* exposure
|
|
135
135
|
);
|
|
136
|
-
unbloomedColor *= 1.0 - toneMappingParams.y *
|
|
137
|
-
if (!
|
|
138
|
-
unbloomedColor =
|
|
136
|
+
unbloomedColor *= 1.0 - toneMappingParams.y * iJ;
|
|
137
|
+
if (!gy) {
|
|
138
|
+
unbloomedColor = bZ(unbloomedColor);
|
|
139
139
|
}
|
|
140
|
-
let
|
|
140
|
+
let sC = select(
|
|
141
141
|
${sdrEncoding === 'srgb' ? 'linearToSrgb(unbloomedColor)' : 'pow(max(unbloomedColor, vec3f(0.0)), vec3f(1.0 / 2.2))'},
|
|
142
142
|
linearToSrgb(unbloomedColor),
|
|
143
|
-
|
|
143
|
+
gy
|
|
144
144
|
);
|
|
145
|
-
|
|
146
|
-
* (1.0 -
|
|
145
|
+
oL += max(mN - sC, vec3f(0.0))
|
|
146
|
+
* (1.0 - jj);
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
|
-
finalColor = vec4f(
|
|
149
|
+
finalColor = vec4f(oL, finalColor.a);
|
|
150
150
|
if (bloomIntensity > 0.0) {
|
|
151
|
-
finalColor.a = max(finalColor.a, min(dot(
|
|
151
|
+
finalColor.a = max(finalColor.a, min(dot(jp.rgb, vec3f(0.2125, 0.7154, 0.0721)), 1.0));
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
if (shadowCatcherEnabled > 0.5) {
|
|
@@ -162,36 +162,36 @@ let background = load_catcherBackgroundTex(uv, 0);
|
|
|
162
162
|
|
|
163
163
|
|
|
164
164
|
|
|
165
|
-
let
|
|
166
|
-
var foregroundColor =
|
|
167
|
-
var backgroundColor =
|
|
168
|
-
foregroundColor *= 1.0 - toneMappingParams.y *
|
|
169
|
-
backgroundColor *= 1.0 - toneMappingParams.y *
|
|
170
|
-
if (!
|
|
171
|
-
foregroundColor =
|
|
172
|
-
backgroundColor =
|
|
165
|
+
let kU = select(0.0, clamp(background.a - coverage, 0.0, 1.0 - coverage), flatBackgroundColor.a > 0.5);
|
|
166
|
+
var foregroundColor = ga((foreground.rgb + jp.rgb) * exposure);
|
|
167
|
+
var backgroundColor = ga((background.rgb / max(background.a, 0.000001) + jp.rgb) * exposure);
|
|
168
|
+
foregroundColor *= 1.0 - toneMappingParams.y * iJ;
|
|
169
|
+
backgroundColor *= 1.0 - toneMappingParams.y * iJ;
|
|
170
|
+
if (!gy) {
|
|
171
|
+
foregroundColor = bZ(foregroundColor);
|
|
172
|
+
backgroundColor = bZ(backgroundColor);
|
|
173
173
|
}
|
|
174
|
-
foregroundColor = select(${sdrEncoding === 'srgb' ? 'linearToSrgb(foregroundColor)' : 'pow(max(foregroundColor, vec3f(0.0)), vec3f(1.0 / 2.2))'}, linearToSrgb(foregroundColor),
|
|
175
|
-
backgroundColor = select(${sdrEncoding === 'srgb' ? 'linearToSrgb(backgroundColor)' : 'pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2))'}, linearToSrgb(backgroundColor),
|
|
174
|
+
foregroundColor = select(${sdrEncoding === 'srgb' ? 'linearToSrgb(foregroundColor)' : 'pow(max(foregroundColor, vec3f(0.0)), vec3f(1.0 / 2.2))'}, linearToSrgb(foregroundColor), gy);
|
|
175
|
+
backgroundColor = select(${sdrEncoding === 'srgb' ? 'linearToSrgb(backgroundColor)' : 'pow(max(backgroundColor, vec3f(0.0)), vec3f(1.0 / 2.2))'}, linearToSrgb(backgroundColor), gy);
|
|
176
176
|
if (flatBackgroundColor.a > 0.5) {
|
|
177
|
-
var unbloomedBackground =
|
|
178
|
-
unbloomedBackground *= 1.0 - toneMappingParams.y *
|
|
179
|
-
if (!
|
|
180
|
-
let
|
|
181
|
-
let
|
|
182
|
-
backgroundColor = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0))) +
|
|
177
|
+
var unbloomedBackground = ga(background.rgb / max(background.a, 0.000001) * exposure);
|
|
178
|
+
unbloomedBackground *= 1.0 - toneMappingParams.y * iJ;
|
|
179
|
+
if (!gy) { unbloomedBackground = bZ(unbloomedBackground); }
|
|
180
|
+
let mO = select(${sdrEncoding === 'srgb' ? 'linearToSrgb(unbloomedBackground)' : 'pow(max(unbloomedBackground, vec3f(0.0)), vec3f(1.0 / 2.2))'}, linearToSrgb(unbloomedBackground), gy);
|
|
181
|
+
let vY = select(vec3f(0.0), max(backgroundColor - mO, vec3f(0.0)), bloomIntensity > 0.0);
|
|
182
|
+
backgroundColor = linearToSrgb(max(flatBackgroundColor.rgb, vec3f(0.0))) + vY;
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
let
|
|
187
|
-
let
|
|
188
|
-
let
|
|
189
|
-
let
|
|
190
|
-
let
|
|
191
|
-
let alpha =
|
|
192
|
-
let premultiplied = foregroundColor *
|
|
193
|
-
+ backgroundColor *
|
|
194
|
-
+ shadowCatcherColor *
|
|
186
|
+
let fR = coverage * opacity;
|
|
187
|
+
let mD = clamp(dot(jp.rgb, vec3f(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
|
|
188
|
+
let hq = max(foreground.a, mD * (1.0 - coverage - kU));
|
|
189
|
+
let jf = max(background.a, mD * coverage);
|
|
190
|
+
let kD = (jf - kU) * (1.0 - opacity) + kU;
|
|
191
|
+
let alpha = hq + kD + fR;
|
|
192
|
+
let premultiplied = foregroundColor * hq
|
|
193
|
+
+ backgroundColor * kD
|
|
194
|
+
+ shadowCatcherColor * fR;
|
|
195
195
|
finalColor = vec4f(premultiplied / max(alpha, 0.000001), alpha);
|
|
196
196
|
}
|
|
197
197
|
}
|
|
@@ -208,8 +208,8 @@ export function createCompositeDenoiseColorMain(output = 'output.denoiseColor',
|
|
|
208
208
|
const srgbDecode = 'select(pow((encoded + 0.055) / 1.055, vec3f(2.4)), encoded / 12.92, encoded <= vec3f(0.04045))';
|
|
209
209
|
return /* wgsl */ `
|
|
210
210
|
let encoded = max(${input}.rgb, vec3f(0.0));
|
|
211
|
-
let
|
|
212
|
-
${output} = vec4f(
|
|
211
|
+
let uq = ${sdrEncoding === 'srgb' ? srgbDecode : `select(pow(encoded, vec3f(2.2)), ${srgbDecode}, gy)`};
|
|
212
|
+
${output} = vec4f(uq, ${input}.a);
|
|
213
213
|
|
|
214
214
|
`;
|
|
215
215
|
}
|
|
@@ -219,22 +219,22 @@ export function createCompositeDenoiseAlbedoMain(output = 'output.denoiseAlbedo'
|
|
|
219
219
|
|
|
220
220
|
|
|
221
221
|
let rawAlbedo = load_flatBackgroundMaskTex(uv, 0);
|
|
222
|
-
var
|
|
222
|
+
var pJ = rawAlbedo.rgb;
|
|
223
223
|
if (shadowCatcherEnabled > 0.5 && flatBackgroundColor.a < 0.5) {
|
|
224
224
|
let coverage = clamp(load_shadowCatcherTex(uv, 0).r, 0.0, 1.0);
|
|
225
225
|
let background = load_catcherBackgroundTex(uv, 0);
|
|
226
226
|
if (coverage > 0.0 && background.a > 0.0) {
|
|
227
|
-
var
|
|
228
|
-
|
|
229
|
-
if (!
|
|
227
|
+
var iv = ga(background.rgb / background.a * exposure);
|
|
228
|
+
iv *= 1.0 - toneMappingParams.y * iJ;
|
|
229
|
+
if (!gy) { iv = bZ(iv); }
|
|
230
230
|
|
|
231
231
|
|
|
232
232
|
|
|
233
|
-
let
|
|
234
|
-
|
|
233
|
+
let sr = clamp(background.a, 0.0, coverage);
|
|
234
|
+
pJ += sr * (clamp(iv, vec3f(0.0), vec3f(1.0)) - vec3f(1.0));
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
|
-
${output} = vec4f(clamp(
|
|
237
|
+
${output} = vec4f(clamp(pJ, vec3f(0.0), vec3f(1.0)), rawAlbedo.a);
|
|
238
238
|
`;
|
|
239
239
|
}
|
|
240
240
|
export const compositeDenoiseOutputMain = createCompositeDenoiseColorMain() + createCompositeDenoiseAlbedoMain();
|
|
@@ -253,15 +253,15 @@ output.color = vec4f(select(vec3f(0.0), encoded, alpha > 0.0), alpha);
|
|
|
253
253
|
export const compositeDenoiseDisplayMain = createCompositeDenoiseDisplayMain();
|
|
254
254
|
// Shared hit normalization; CPU readback retains its f32 reference path.
|
|
255
255
|
export const hdrResolveWGSL = /* wgsl */ `
|
|
256
|
-
fn
|
|
256
|
+
fn fo(color: f32, count: f32, hit: f32, uw: f32, rgb: bool) -> f32 {
|
|
257
257
|
if (count <= 0.0) {
|
|
258
258
|
return 0.0;
|
|
259
259
|
}
|
|
260
|
-
let total = max(count,
|
|
260
|
+
let total = max(count, uw);
|
|
261
261
|
let divisor = select(total, hit, (rgb && (hit > 0.0)));
|
|
262
262
|
return (color / divisor);
|
|
263
263
|
}
|
|
264
|
-
fn
|
|
264
|
+
fn jx(color: f32, coverage: f32, flat: bool, rgb: bool) -> f32 {
|
|
265
265
|
if ((flat && rgb) && (coverage > 0.0)) {
|
|
266
266
|
return (color * coverage);
|
|
267
267
|
}
|
|
@@ -5,19 +5,19 @@ let filtered = load_filteredTex(uv, 0).rgb;
|
|
|
5
5
|
let foreground = load_foregroundTex(uv, 0);
|
|
6
6
|
let background = load_backgroundTex(uv, 0);
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
var
|
|
8
|
+
var mS = foreground;
|
|
9
|
+
var mR = background;
|
|
10
10
|
if (any(filtered != original)) {
|
|
11
|
-
let
|
|
12
|
-
let
|
|
13
|
-
let scale = select(vec3f(1.0), filtered /
|
|
14
|
-
let
|
|
15
|
-
|
|
11
|
+
let wu = abs(original) > vec3f(0.000001);
|
|
12
|
+
let ah = select(vec3f(1.0), original, wu);
|
|
13
|
+
let scale = select(vec3f(1.0), filtered / ah, wu);
|
|
14
|
+
let vO = select(filtered - original, vec3f(0.0), wu);
|
|
15
|
+
mS = vec4f(foreground.rgb * scale + vO, foreground.a);
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
mR = vec4f(background.rgb * scale + vO * background.a, background.a);
|
|
18
18
|
}
|
|
19
|
-
output.foreground =
|
|
20
|
-
output.background =
|
|
19
|
+
output.foreground = mS;
|
|
20
|
+
output.background = mR;
|
|
21
21
|
`;
|
|
22
22
|
/** Custom output alpha is ignored; retain the input composition's coverage. */
|
|
23
23
|
export const customDenoiseCoverageMain = /* wgsl */ `
|
|
@@ -10,7 +10,7 @@ let offset = vec2f(id.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;
|
|
|
10
10
|
let uv = depthArea.xy + depthArea.zw * offset * vec2f(1.0, -1.0);
|
|
11
11
|
outColor[index] = vec4f(0.0);
|
|
12
12
|
if (any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) { return; }
|
|
13
|
-
var ray =
|
|
13
|
+
var ray = eT(uv);
|
|
14
14
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
15
15
|
let forward = -normalize(cameraUniform.viewInv[2].xyz);
|
|
16
16
|
var si: SurfaceInteraction;
|
|
@@ -22,7 +22,7 @@ for (var layer = 0; layer < 32; layer++) {
|
|
|
22
22
|
intersectScene(ray, &si, 0, false, false);
|
|
23
23
|
if (!si.hit) { return; }
|
|
24
24
|
var material: OpenPbrResolvedMaterial;
|
|
25
|
-
|
|
25
|
+
getMaterial(&material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
|
|
26
26
|
if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {
|
|
27
27
|
outColor[index] = vec4f(max(dot(si.position - eye, forward), 0.0), 0.0, 0.0, 0.0);
|
|
28
28
|
return;
|