@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
|
@@ -15,20 +15,20 @@ struct AovCenter { identity: vec4u, motion: vec4f, }
|
|
|
15
15
|
@group(3) @binding(9) var<storage, read> aovPrevious: array<AovCenter>;
|
|
16
16
|
@group(3) @binding(8) var<uniform> aovParameters: vec4u;
|
|
17
17
|
|
|
18
|
-
fn
|
|
18
|
+
fn oi(offset: u32) -> mat4x4f {
|
|
19
19
|
return mat4x4f(bitcast<vec4f>(vec4u(aovScene[offset], aovScene[offset+1u], aovScene[offset+2u], aovScene[offset+3u])),
|
|
20
20
|
bitcast<vec4f>(vec4u(aovScene[offset+4u], aovScene[offset+5u], aovScene[offset+6u], aovScene[offset+7u])),
|
|
21
21
|
bitcast<vec4f>(vec4u(aovScene[offset+8u], aovScene[offset+9u], aovScene[offset+10u], aovScene[offset+11u])),
|
|
22
22
|
bitcast<vec4f>(vec4u(aovScene[offset+12u], aovScene[offset+13u], aovScene[offset+14u], aovScene[offset+15u])));
|
|
23
23
|
}
|
|
24
|
-
fn
|
|
25
|
-
fn
|
|
26
|
-
var ray =
|
|
24
|
+
fn iu(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
|
|
25
|
+
fn mC(xG: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
|
|
26
|
+
var ray = xG;
|
|
27
27
|
(*si).triangleIndex = -1;
|
|
28
28
|
for (var layer = 0; layer < 32; layer++) {
|
|
29
29
|
intersectScene(ray, si, 0, false, false);
|
|
30
30
|
if (!(*si).hit) { return false; }
|
|
31
|
-
|
|
31
|
+
getMaterial(material, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
|
|
32
32
|
if ((*material).materialType != SHADOW_CATCHER && (*material).alpha >= 0.5) { return true; }
|
|
33
33
|
ray.o = (*si).position + ray.d * (EPS * 0.02);
|
|
34
34
|
}
|
|
@@ -41,21 +41,21 @@ if (any(id.xy >= size)) { return; }
|
|
|
41
41
|
let index = id.x + id.y * size.x;
|
|
42
42
|
let sample = aovParameters.z;
|
|
43
43
|
if (sample == 0u) { aovAccum[index] = AovAccumulation(); }
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let uv = (vec2f(id.xy) +
|
|
48
|
-
var ray =
|
|
44
|
+
aI = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
|
|
45
|
+
samplingBounce = 0u; ca = 0u;
|
|
46
|
+
fi(id.xy, i32(aC ^ cB(rtUniform.sequenceSeed)));
|
|
47
|
+
let uv = (vec2f(id.xy) + sample2D(CAMERA_PIXEL)) / vec2f(size);
|
|
48
|
+
var ray = eT(uv);
|
|
49
49
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
50
50
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
51
51
|
let forward = -normalize(cameraUniform.viewInv[2].xyz);
|
|
52
|
-
let
|
|
53
|
-
let
|
|
54
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
55
|
-
|
|
52
|
+
let ju = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
|
|
53
|
+
let uV = cameraUniform.apertureRadius * kq(sample2D(CAMERA_LENS));
|
|
54
|
+
let origin = (cameraUniform.viewInv * vec4f(uV, 0.0, 1.0)).xyz;
|
|
55
|
+
initRay(&ray, origin, normalize(ju-origin));
|
|
56
56
|
}
|
|
57
57
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
58
|
-
if (!
|
|
58
|
+
if (!mC(ray, &si, &material)) { return; }
|
|
59
59
|
let depth = max(dot(si.position-cameraUniform.viewInv[3].xyz, -normalize(cameraUniform.viewInv[2].xyz)), 0.0);
|
|
60
60
|
let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
61
61
|
(material.coatWeight > 0.0) | (material.fuzzWeight > 0.0) |
|
|
@@ -66,17 +66,17 @@ let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
|
66
66
|
aovAccum[index].depthRoughness += vec4f(depth, material.specularRoughness, material.baseMetalness, select(0.0,1.0,unsupported));
|
|
67
67
|
if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {
|
|
68
68
|
var normal=si.normal; var face=si.faceNormal;
|
|
69
|
-
var cosine=-dot(normal,ray.d); var
|
|
69
|
+
var cosine=-dot(normal,ray.d); var fa=-dot(face,ray.d);
|
|
70
70
|
if (material.thinWalled && (material.transmissionWeight>0.0 || material.subsurfaceWeight>0.0)) {
|
|
71
71
|
if(cosine<0.0){normal=-normal;cosine=-cosine;}
|
|
72
|
-
if(
|
|
72
|
+
if(fa<0.0){face=-face;fa=-fa;}
|
|
73
73
|
}
|
|
74
|
-
if(
|
|
74
|
+
if(fa>=0.0 && cosine<0.0){normal=face;cosine=fa;}
|
|
75
75
|
normal=select(-normal,normal,cosine>=0.0);
|
|
76
76
|
material.inside=(cosine<=0.0) && !material.thinWalled;
|
|
77
77
|
material.relativeIor=select(material.specularIor,1.0/material.specularIor,cosine>0.0);
|
|
78
|
-
let prepared=
|
|
79
|
-
let reflectance=
|
|
78
|
+
let prepared=bV(si.tangent,material,-ray.d,normal);
|
|
79
|
+
let reflectance=hu(prepared, (aovParameters.w & 8u) != 0u, (aovParameters.w & 16u) != 0u);
|
|
80
80
|
aovAccum[index].diffuse+=vec4f(reflectance.diffuse,1.0);
|
|
81
81
|
aovAccum[index].specular+=vec4f(reflectance.specular,1.0);
|
|
82
82
|
}
|
|
@@ -89,26 +89,26 @@ if (any(id.xy >= size)) { return; }
|
|
|
89
89
|
let index = id.x + id.y * size.x;
|
|
90
90
|
aovCenter[index] = AovCenter(vec4u(0xffffffffu), vec4f(0.0));
|
|
91
91
|
let uv = (vec2f(id.xy) + 0.5) / vec2f(size);
|
|
92
|
-
let ray =
|
|
92
|
+
let ray = eT(uv);
|
|
93
93
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
94
|
-
if (!
|
|
94
|
+
if (!mC(ray, &si, &material)) { return; }
|
|
95
95
|
let offset = 52u + u32(si.instanceIndex) * 24u;
|
|
96
96
|
let materialOffset = aovScene[16u];
|
|
97
97
|
let primitiveOffset = aovScene[17u];
|
|
98
98
|
aovCenter[index].identity = vec4u(aovScene[offset], aovScene[offset+1u],
|
|
99
99
|
aovScene[materialOffset + u32(si.materialIndex)], aovScene[primitiveOffset + u32(si.triangleIndex)]);
|
|
100
|
-
aovCenter[index].motion.z = dot(si.position-
|
|
100
|
+
aovCenter[index].motion.z = dot(si.position-iu(36u),iu(40u));
|
|
101
101
|
if (aovScene[offset+2u] == 0u) { return; }
|
|
102
|
-
let
|
|
103
|
-
let
|
|
104
|
-
if (
|
|
105
|
-
let
|
|
106
|
-
let
|
|
107
|
-
if (any(
|
|
108
|
-
let previous=aovPrevious[u32(
|
|
109
|
-
let
|
|
110
|
-
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-
|
|
111
|
-
let motion=(
|
|
102
|
+
let qs = oi(offset+4u) * vec4f(si.position,1.0);
|
|
103
|
+
let pg = oi(0u) * qs;
|
|
104
|
+
if (pg.w <= 0.0) { return; }
|
|
105
|
+
let ua=pg.xyz/pg.w;
|
|
106
|
+
let hU=(ua.xy*0.5+0.5)*vec2f(size);
|
|
107
|
+
if (any(hU < vec2f(0.0)) || any(hU >= vec2f(size)) || abs(ua.z)>1.0) { return; }
|
|
108
|
+
let previous=aovPrevious[u32(hU.x)+u32(hU.y)*size.x];
|
|
109
|
+
let qr=dot(qs.xyz-iu(44u),iu(48u));
|
|
110
|
+
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-qr)>max(1e-4,abs(qr)*1e-3)) { return; }
|
|
111
|
+
let motion=(hU-(vec2f(id.xy)+0.5))*vec2f(1.0,-1.0);
|
|
112
112
|
aovCenter[index].motion=vec4f(motion,aovCenter[index].motion.z,3.0);
|
|
113
113
|
}
|
|
114
114
|
`;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// https://github.com/keijiro/KinoBloom/blob/master/Assets/Kino/Bloom/Shader/Bloom.cginc#L96
|
|
4
4
|
// See THIRD_PARTY_NOTICES.md and LICENSES/KinoBloom-MIT.txt.
|
|
5
5
|
export const bloomBrightDefine = /* wgsl */ `
|
|
6
|
-
fn
|
|
6
|
+
fn tV(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
|
|
7
7
|
return a + b + c - min(min(a, b), c) - max(max(a, b), c);
|
|
8
8
|
}
|
|
9
9
|
`;
|
|
@@ -11,26 +11,26 @@ export const bloomBrightMain = /* wgsl */ `
|
|
|
11
11
|
|
|
12
12
|
let d = vec3i(1, 1, 0);
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var cR = load_colorTex(uv, 0);
|
|
15
15
|
let s1 = load_colorTex(uv - d.xz, 0);
|
|
16
16
|
let s2 = load_colorTex(uv + d.xz, 0);
|
|
17
17
|
let s3 = load_colorTex(uv - d.zy, 0);
|
|
18
18
|
let s4 = load_colorTex(uv + d.zy, 0);
|
|
19
|
-
|
|
19
|
+
cR = tV(tV(cR, s1, s2), s3, s4);
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
let lum = dot(
|
|
22
|
+
let lum = dot(cR.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
23
23
|
var color: vec4f;
|
|
24
|
-
if (lum > threshold &&
|
|
25
|
-
color = vec4f(
|
|
24
|
+
if (lum > threshold && cR.a > 0.0) {
|
|
25
|
+
color = vec4f(cR.rgb * scale, cR.a);
|
|
26
26
|
} else {
|
|
27
27
|
|
|
28
|
-
color = vec4f(vec3(0.0),
|
|
28
|
+
color = vec4f(vec3(0.0), cR.a);
|
|
29
29
|
}
|
|
30
30
|
output.color = color;
|
|
31
31
|
`;
|
|
32
32
|
export const bloomDownDefine = /* wgsl */ `
|
|
33
|
-
fn
|
|
33
|
+
fn yo(c: vec3f) -> f32 {
|
|
34
34
|
return max(max(c.r, c.g), c.b);
|
|
35
35
|
}
|
|
36
36
|
`;
|
|
@@ -44,25 +44,25 @@ output.color = sample_colorTex_linearSampler(uv2 + d.xy) * 0.25
|
|
|
44
44
|
+ sample_colorTex_linearSampler(uv2 + d.zw) * 0.25;
|
|
45
45
|
`;
|
|
46
46
|
export const bloomBlurDefine = /* wgsl */ `
|
|
47
|
-
const
|
|
47
|
+
const yu = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
|
|
48
48
|
`;
|
|
49
49
|
export const bloomBlurMain = /* wgsl */ `
|
|
50
|
-
let
|
|
51
|
-
let off = direction /
|
|
50
|
+
let yh = vec2f(colorTexRegion());
|
|
51
|
+
let off = direction / yh * size;
|
|
52
52
|
|
|
53
53
|
var sum = vec4f(0.0);
|
|
54
|
-
var
|
|
54
|
+
var uI = 0.0;
|
|
55
55
|
for (var i = 0; i < 9; i++) {
|
|
56
|
-
let w =
|
|
56
|
+
let w = yu[i];
|
|
57
57
|
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
58
|
-
|
|
58
|
+
uI += w;
|
|
59
59
|
}
|
|
60
|
-
output.color = sum / max(
|
|
60
|
+
output.color = sum / max(uI, 0.01);
|
|
61
61
|
`;
|
|
62
62
|
export const bloomBlendMain = /* wgsl */ `
|
|
63
|
-
let
|
|
64
|
-
let
|
|
65
|
-
output.color = mix(
|
|
63
|
+
let yq = sample_colorTex1_linearSampler(uv2);
|
|
64
|
+
let yr = sample_colorTex2_linearSampler(uv2);
|
|
65
|
+
output.color = mix(yq, yr, weight);
|
|
66
66
|
`;
|
|
67
67
|
export const BLOOM_LEVELS = 6;
|
|
68
68
|
export function bloomBlurSize(radius) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CAUSTIC_UNIFORM_BYTES = 112;
|
|
2
|
+
export declare const causticUnitRandomWgsl = "\n fn causticUnitRandom(value:f32)->f32 {\n return clamp((value-EPS)/(1.0-2.0*EPS),0.0,0.99999994);\n }\n";
|
|
3
|
+
export declare function causticLightCompute(constants: Record<string, boolean | number>, blasLayoutMask: number, hasDisplacement: boolean, mode?: 'lightTracing' | 'photonMapping', sceneIntersections?: string, fullEmissionRandom?: boolean): string;
|
|
4
|
+
export declare const causticAccumulateCompute = "\n @group(0) @binding(0) var<storage,read_write> splats:array<atomic<u32>>;\n @group(0) @binding(1) var<storage,read_write> accumulation:array<vec4f>;\n @compute @workgroup_size(64)\n fn main(@builtin(global_invocation_id) id:vec3u, @builtin(num_workgroups) groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&accumulation)) {\n return;\n }\n let i=pixel*3u;\n accumulation[pixel]+=vec4f(vec3f(bitcast<f32>(atomicLoad(&splats[i])),bitcast<f32>(atomicLoad(&splats[i+1u])),bitcast<f32>(atomicLoad(&splats[i+2u]))),1.0);\n }\n";
|
|
5
|
+
/** Native buffer resolve has the same independent batch normalization as web. */
|
|
6
|
+
export declare const causticBufferCompositeCompute = "\n @group(0)@binding(0)var<storage,read>pt:array<vec4f>;\n @group(0)@binding(1)var<storage,read>caustics:array<vec4f>;\n @group(0)@binding(2)var<storage,read>normal:array<vec4f>;\n @group(0)@binding(3)var<storage,read_write>output:array<vec4f>;\n @compute @workgroup_size(64)fn main(@builtin(global_invocation_id)id:vec3u,@builtin(num_workgroups)groups:vec3u) {\n // Large images exceed one dispatch row; preserve the linear pixel order.\n let pixel=id.x+id.y*groups.x*64u;\n if(pixel>=arrayLength(&output)) {\n return;\n }\n let c=caustics[pixel];\n let p=pt[pixel];\n output[pixel]=vec4f(p.rgb+c.rgb/max(c.a,1.0)*normal[pixel].a,p.a);\n }\n";
|