@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
|
@@ -1,56 +1,56 @@
|
|
|
1
1
|
const displacementCommon = /*wgsl*/ `
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
struct
|
|
4
|
+
struct jI {
|
|
5
5
|
barycentric: vec3f,
|
|
6
6
|
t: f32,
|
|
7
7
|
normal: vec3f,
|
|
8
8
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
fn
|
|
11
|
+
fn xp(
|
|
12
12
|
uu: f32,
|
|
13
|
-
|
|
13
|
+
vK: vec3f, vL: vec3f,
|
|
14
14
|
eAC: vec3f, eBD: vec3f,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
iM: vec3f,
|
|
16
|
+
qK: f32,
|
|
17
|
+
qM: ptr<function, f32>
|
|
18
18
|
) -> bool {
|
|
19
19
|
if (uu >= 0.0 && uu <= 1.0) {
|
|
20
|
-
let pAB = mix(
|
|
20
|
+
let pAB = mix(vK, vL, uu);
|
|
21
21
|
let pCD = mix(eAC, eBD, uu);
|
|
22
|
-
var n = cross(
|
|
23
|
-
let
|
|
22
|
+
var n = cross(iM, pCD);
|
|
23
|
+
let xH = 1.0 / dot(n, n);
|
|
24
24
|
n = cross(n, pAB);
|
|
25
|
-
let tt = dot(n, pCD) *
|
|
26
|
-
let vv = dot(n,
|
|
27
|
-
if (vv >= 0.0 && vv <= 1.0 && tt >
|
|
28
|
-
*
|
|
25
|
+
let tt = dot(n, pCD) * xH;
|
|
26
|
+
let vv = dot(n, iM) * xH;
|
|
27
|
+
if (vv >= 0.0 && vv <= 1.0 && tt > qK && tt < *qM) {
|
|
28
|
+
*qM = tt;
|
|
29
29
|
return true;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
fn
|
|
36
|
-
|
|
35
|
+
fn hc(
|
|
36
|
+
qx: vec3f, iM: vec3f, qK: f32, uR: f32,
|
|
37
37
|
pA: vec3f, pB: vec3f, pC: vec3f, pD: vec3f,
|
|
38
|
-
|
|
38
|
+
qM: ptr<function, f32>
|
|
39
39
|
) -> bool {
|
|
40
40
|
let eAB = pB - pA;
|
|
41
41
|
let eAC = pC - pA;
|
|
42
42
|
let eBD = pD - pB;
|
|
43
43
|
let eCD = pD - pC;
|
|
44
|
-
let
|
|
45
|
-
let
|
|
44
|
+
let vK = pA - qx;
|
|
45
|
+
let vL = pB - qx;
|
|
46
46
|
|
|
47
47
|
var u1: f32;
|
|
48
48
|
var u2: f32;
|
|
49
49
|
{
|
|
50
50
|
let qN = cross(eAB, -eCD);
|
|
51
|
-
let a = dot(qN,
|
|
52
|
-
var b = dot(cross(
|
|
53
|
-
let c = dot(cross(
|
|
51
|
+
let a = dot(qN, iM);
|
|
52
|
+
var b = dot(cross(vL, iM), eBD);
|
|
53
|
+
let c = dot(cross(vK, iM), eAC);
|
|
54
54
|
b -= a + c;
|
|
55
55
|
|
|
56
56
|
let det = b * b - 4.0 * a * c;
|
|
@@ -62,19 +62,19 @@ if (a == 0.0) {
|
|
|
62
62
|
u1 = -c / b;
|
|
63
63
|
u2 = -1.0;
|
|
64
64
|
} else {
|
|
65
|
-
let
|
|
66
|
-
let
|
|
67
|
-
u1 =
|
|
68
|
-
u2 = c /
|
|
65
|
+
let yg = sqrt(det);
|
|
66
|
+
let yN = -0.5 * (b + sign(b) * yg);
|
|
67
|
+
u1 = yN / a;
|
|
68
|
+
u2 = c / yN;
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
*
|
|
72
|
+
*qM = uR;
|
|
73
73
|
|
|
74
74
|
var hit = false;
|
|
75
75
|
|
|
76
|
-
hit =
|
|
77
|
-
|
|
76
|
+
hit = xp(u1, vK, vL, eAC, eBD, iM, qK, qM) ||
|
|
77
|
+
xp(u2, vK, vL, eAC, eBD, iM, qK, qM);
|
|
78
78
|
if (!hit) {
|
|
79
79
|
return false;
|
|
80
80
|
}
|
|
@@ -82,70 +82,70 @@ return false;
|
|
|
82
82
|
return true;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
fn
|
|
86
|
-
|
|
85
|
+
fn tO(
|
|
86
|
+
qx: vec3f, iM: vec3f, qK: f32, uR: f32,
|
|
87
87
|
pA: vec3f, pB: vec3f, pC: vec3f,
|
|
88
88
|
pD: vec3f, pE: vec3f, pF: vec3f,
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
bO: ptr<function, f32>,
|
|
91
|
+
bN: ptr<function, f32>
|
|
92
92
|
) -> bool {
|
|
93
|
-
*
|
|
94
|
-
*
|
|
93
|
+
*bO = INF;
|
|
94
|
+
*bN = -INF;
|
|
95
95
|
|
|
96
|
-
let
|
|
97
|
-
let
|
|
96
|
+
let yv = maxDimension(abs(iM));
|
|
97
|
+
let gH = mU(iM, yv);
|
|
98
98
|
var tt: f32;
|
|
99
99
|
|
|
100
|
-
tt =
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
tt = fM(
|
|
101
|
+
qx, iM,
|
|
102
|
+
fw(pC, pB, pA), yv, gH, INF
|
|
103
103
|
).t;
|
|
104
104
|
if (tt > 0.0) {
|
|
105
|
-
*
|
|
106
|
-
*
|
|
105
|
+
*bO = min(*bO, tt);
|
|
106
|
+
*bN = max(*bN, tt);
|
|
107
107
|
}
|
|
108
|
-
tt =
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
tt = fM(
|
|
109
|
+
qx, iM,
|
|
110
|
+
fw(pD, pE, pF), yv, gH, INF
|
|
111
111
|
).t;
|
|
112
112
|
if (tt > 0.0) {
|
|
113
|
-
*
|
|
114
|
-
*
|
|
113
|
+
*bO = min(*bO, tt);
|
|
114
|
+
*bN = max(*bN, tt);
|
|
115
115
|
}
|
|
116
|
-
if (
|
|
117
|
-
|
|
116
|
+
if (hc(
|
|
117
|
+
qx, iM, -INF, INF,
|
|
118
118
|
pA, pB, pD, pE,
|
|
119
119
|
&tt)) {
|
|
120
|
-
*
|
|
121
|
-
*
|
|
120
|
+
*bO = min(*bO, tt);
|
|
121
|
+
*bN = max(*bN, tt);
|
|
122
122
|
}
|
|
123
|
-
if (
|
|
124
|
-
|
|
123
|
+
if (hc(
|
|
124
|
+
qx, iM, -INF, INF,
|
|
125
125
|
pB, pC, pE, pF,
|
|
126
126
|
&tt)) {
|
|
127
|
-
*
|
|
128
|
-
*
|
|
127
|
+
*bO = min(*bO, tt);
|
|
128
|
+
*bN = max(*bN, tt);
|
|
129
129
|
}
|
|
130
|
-
if (
|
|
131
|
-
|
|
130
|
+
if (hc(
|
|
131
|
+
qx, iM, -INF, INF,
|
|
132
132
|
pC, pA, pF, pD,
|
|
133
133
|
&tt)) {
|
|
134
|
-
*
|
|
135
|
-
*
|
|
134
|
+
*bO = min(*bO, tt);
|
|
135
|
+
*bN = max(*bN, tt);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
*
|
|
139
|
-
*
|
|
138
|
+
*bO = max(*bO, qK);
|
|
139
|
+
*bN = min(*bN, uR);
|
|
140
140
|
|
|
141
|
-
return *
|
|
141
|
+
return *bO <= *bN && *bN > 0.0;
|
|
142
142
|
}
|
|
143
143
|
`;
|
|
144
144
|
export default /* wgsl */ `
|
|
145
145
|
|
|
146
146
|
${displacementCommon}
|
|
147
147
|
|
|
148
|
-
fn
|
|
148
|
+
fn mg(p: vec3f, p0: vec3f, p1: vec3f, p2: vec3f) -> vec3f {
|
|
149
149
|
let v0 = p1 - p0;
|
|
150
150
|
let v1 = p2 - p0;
|
|
151
151
|
let v2 = p - p0;
|
|
@@ -156,9 +156,9 @@ let d11 = dot(v1, v1);
|
|
|
156
156
|
let d20 = dot(v2, v0);
|
|
157
157
|
let d21 = dot(v2, v1);
|
|
158
158
|
|
|
159
|
-
let
|
|
160
|
-
let v = clamp((d11 * d20 - d01 * d21) *
|
|
161
|
-
let w = clamp((d00 * d21 - d01 * d20) *
|
|
159
|
+
let vF = 1.0 / (d00 * d11 - d01 * d01);
|
|
160
|
+
let v = clamp((d11 * d20 - d01 * d21) * vF, 0.0, 1.0);
|
|
161
|
+
let w = clamp((d00 * d21 - d01 * d20) * vF, 0.0, 1.0);
|
|
162
162
|
let u = 1.0 - v - w;
|
|
163
163
|
|
|
164
164
|
return vec3f(u, v, w);
|
|
@@ -166,59 +166,59 @@ return vec3f(u, v, w);
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
|
|
169
|
-
fn
|
|
170
|
-
|
|
169
|
+
fn pS(
|
|
170
|
+
rl: vec3f, rP: vec3f, yR: f32,
|
|
171
171
|
_pA: vec3f, _pB: vec3f, _pC: vec3f,
|
|
172
172
|
_nA: vec3f, _nB: vec3f, _nC: vec3f,
|
|
173
|
-
|
|
173
|
+
xQ: vec2f, xR: vec2f, xS: vec2f,
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
|
|
175
|
+
jW: i32,
|
|
176
|
+
xP: vec2f,
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
yE: f32, yD: f32,
|
|
179
179
|
hScale: f32,
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
wG: f32,
|
|
181
|
+
vR: f32,
|
|
182
182
|
uvProjection: i32,
|
|
183
183
|
uvScale: vec2f,
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
) ->
|
|
184
|
+
ym: bool,
|
|
185
|
+
se: bool
|
|
186
|
+
) -> jI {
|
|
187
187
|
|
|
188
188
|
|
|
189
189
|
|
|
190
|
-
let DT = select(max(abs(hScale) / 32.0, 1e-12),
|
|
191
|
-
let dt = DT / length(
|
|
190
|
+
let DT = select(max(abs(hScale) / 32.0, 1e-12), vR, vR > 0.0);
|
|
191
|
+
let dt = DT / length(rP);
|
|
192
192
|
let dbx = 0.001;
|
|
193
193
|
let dby = 0.001;
|
|
194
194
|
|
|
195
|
-
var result:
|
|
195
|
+
var result: jI;
|
|
196
196
|
result.t = INF;
|
|
197
197
|
|
|
198
|
-
var
|
|
199
|
-
var
|
|
198
|
+
var bO = INF;
|
|
199
|
+
var bN = -INF;
|
|
200
200
|
|
|
201
|
-
let
|
|
202
|
-
let
|
|
201
|
+
let sb = sign(hScale);
|
|
202
|
+
let wZ = abs(hScale);
|
|
203
203
|
|
|
204
|
-
let
|
|
204
|
+
let uG = sb * normalize(cross(_pB - _pA, _pC - _pA));
|
|
205
205
|
|
|
206
206
|
|
|
207
|
-
let dA = dot(_nA,
|
|
208
|
-
let dB = dot(_nB,
|
|
209
|
-
let dC = dot(_nC,
|
|
207
|
+
let dA = dot(_nA, uG);
|
|
208
|
+
let dB = dot(_nB, uG);
|
|
209
|
+
let dC = dot(_nC, uG);
|
|
210
210
|
|
|
211
|
-
var minH =
|
|
212
|
-
var maxH =
|
|
211
|
+
var minH = yE * hScale * min(min(dA, dB), dC);
|
|
212
|
+
var maxH = yD * hScale * max(max(dA, dB), dC);
|
|
213
213
|
|
|
214
214
|
|
|
215
215
|
|
|
216
216
|
|
|
217
|
-
let
|
|
217
|
+
let vM = abs(maxH) - abs(minH);
|
|
218
218
|
|
|
219
219
|
|
|
220
220
|
minH = sign(minH) * max(abs(minH) - DT * 2.0, 0.0);
|
|
221
|
-
if (
|
|
221
|
+
if (vM < DT * 2.0) {
|
|
222
222
|
maxH = sign(maxH) * min(abs(maxH) + DT * 2.0, abs(hScale));
|
|
223
223
|
}
|
|
224
224
|
|
|
@@ -230,70 +230,70 @@ let pD = _pA + _nA * maxH / dA;
|
|
|
230
230
|
let pE = _pB + _nB * maxH / dB;
|
|
231
231
|
let pF = _pC + _nC * maxH / dC;
|
|
232
232
|
|
|
233
|
-
if (!
|
|
234
|
-
|
|
233
|
+
if (!tO(
|
|
234
|
+
rl, rP, 0.0, INF,
|
|
235
235
|
pA, pB, pC,
|
|
236
236
|
pD, pE, pF,
|
|
237
237
|
|
|
238
|
-
&
|
|
238
|
+
&bO, &bN
|
|
239
239
|
)) {
|
|
240
240
|
return result;
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
-
var
|
|
243
|
+
var yO = false;
|
|
244
244
|
|
|
245
|
-
if (
|
|
246
|
-
|
|
245
|
+
if (bN == bO) {
|
|
246
|
+
bO = 0.0;
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
var t =
|
|
250
|
-
var s =
|
|
251
|
-
var
|
|
252
|
-
var
|
|
249
|
+
var t = bO + dt * ek(2u);
|
|
250
|
+
var s = rl + rP * t;
|
|
251
|
+
var vE = dot(s - _pA, uG);
|
|
252
|
+
var hSurf = select(0.0, INF, sb < 0.0);
|
|
253
253
|
|
|
254
|
-
var c0 = _pA + _nA *
|
|
255
|
-
var c1 = _pB + _nB *
|
|
256
|
-
var c2 = _pC + _nC *
|
|
254
|
+
var c0 = _pA + _nA * vE / dA;
|
|
255
|
+
var c1 = _pB + _nB * vE / dB;
|
|
256
|
+
var c2 = _pC + _nC * vE / dC;
|
|
257
257
|
|
|
258
|
-
var
|
|
258
|
+
var vc: vec3f;
|
|
259
259
|
|
|
260
|
-
|
|
260
|
+
vE = abs(vE);
|
|
261
261
|
|
|
262
|
-
var
|
|
263
|
-
var
|
|
262
|
+
var hDiff = vE - hSurf;
|
|
263
|
+
var qL = hDiff;
|
|
264
264
|
var step = 0;
|
|
265
265
|
|
|
266
266
|
while (true) {
|
|
267
267
|
|
|
268
|
-
let b =
|
|
268
|
+
let b = mg(s, c0, c1, c2);
|
|
269
269
|
|
|
270
|
-
|
|
270
|
+
vc = _pA * b.x + _pB * b.y + _pC * b.z;
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
vE = distance(vc, s);
|
|
273
273
|
|
|
274
274
|
var uv: vec2f;
|
|
275
275
|
if (uvProjection > 0) {
|
|
276
276
|
let n = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
277
|
-
uv =
|
|
277
|
+
uv = gE(uvProjection, vc - (_nA * b.x + _nB * b.y + _nC * b.z) * wG, n) * uvScale;
|
|
278
278
|
}
|
|
279
279
|
else {
|
|
280
|
-
uv =
|
|
280
|
+
uv = xQ * b.x + xR * b.y + xS * b.z;
|
|
281
281
|
}
|
|
282
|
-
let h = sampleMap(
|
|
282
|
+
let h = sampleMap(jW, uv).x;
|
|
283
283
|
|
|
284
|
-
|
|
284
|
+
hSurf = max(wZ * h, DT);
|
|
285
285
|
|
|
286
286
|
|
|
287
|
-
let dh = dot(
|
|
287
|
+
let dh = dot(uG, s - c0);
|
|
288
288
|
c0 = c0 + _nA * dh / dA;
|
|
289
289
|
c1 = c1 + _nB * dh / dB;
|
|
290
290
|
c2 = c2 + _nC * dh / dC;
|
|
291
291
|
|
|
292
|
-
|
|
293
|
-
|
|
292
|
+
qL = hDiff;
|
|
293
|
+
hDiff = vE - hSurf;
|
|
294
294
|
|
|
295
|
-
if (!(select(
|
|
296
|
-
&& t <
|
|
295
|
+
if (!(select(hDiff * sb, hDiff * qL, se) > 0.0
|
|
296
|
+
&& t < bN + dt)
|
|
297
297
|
|
|
298
298
|
&& step > 0) {
|
|
299
299
|
break;
|
|
@@ -301,15 +301,15 @@ break;
|
|
|
301
301
|
|
|
302
302
|
step++;
|
|
303
303
|
t = t + dt;
|
|
304
|
-
s = s +
|
|
304
|
+
s = s + rP * dt;
|
|
305
305
|
}
|
|
306
306
|
|
|
307
|
-
if (select(
|
|
308
|
-
let dtt = dt * (abs(
|
|
307
|
+
if (select(hDiff * sb, hDiff * qL, se) <= 0.0) {
|
|
308
|
+
let dtt = dt * (abs(hDiff) / (abs(qL) + abs(hDiff) + EPS));
|
|
309
309
|
t = t - dtt;
|
|
310
310
|
|
|
311
|
-
let
|
|
312
|
-
let b =
|
|
311
|
+
let yP = rl + rP * t;
|
|
312
|
+
let b = mg(yP, c0, c1, c2);
|
|
313
313
|
|
|
314
314
|
let N = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
315
315
|
|
|
@@ -317,33 +317,33 @@ let p_a = _pA * b.x + _pB * b.y + _pC * b.z;
|
|
|
317
317
|
let p_b = _pA * (b.x + dbx) + _pB * b.y + _pC * (b.z - dbx);
|
|
318
318
|
let p_c = _pA * b.x + _pB * (b.y + dby) + _pC * (b.z - dby);
|
|
319
319
|
|
|
320
|
-
var
|
|
321
|
-
var
|
|
322
|
-
var
|
|
320
|
+
var yA: vec2f;
|
|
321
|
+
var yB: vec2f;
|
|
322
|
+
var yC: vec2f;
|
|
323
323
|
|
|
324
324
|
if (uvProjection > 0) {
|
|
325
325
|
let NA = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
|
|
326
326
|
let NB = normalize(_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx));
|
|
327
327
|
let NC = normalize(_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby));
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
328
|
+
yA = gE(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * wG, NA) * uvScale;
|
|
329
|
+
yB = gE(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * wG, NB) * uvScale;
|
|
330
|
+
yC = gE(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * wG, NC) * uvScale;
|
|
331
331
|
}
|
|
332
332
|
else {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
333
|
+
yA = xQ * b.x + xR * b.y + xS * b.z;
|
|
334
|
+
yB = xQ * (b.x + dbx) + xR * b.y + xS * (b.z - dbx);
|
|
335
|
+
yC = xQ * b.x + xR * (b.y + dby) + xS * (b.z - dby);
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
let s_a = p_a +
|
|
339
|
-
let s_b = p_b +
|
|
340
|
-
let s_c = p_c +
|
|
338
|
+
let s_a = p_a + sb * N * sampleMap(jW, yA).x * hScale;
|
|
339
|
+
let s_b = p_b + sb * N * sampleMap(jW, yB).x * hScale;
|
|
340
|
+
let s_c = p_c + sb * N * sampleMap(jW, yC).x * hScale;
|
|
341
341
|
|
|
342
|
-
let N_s = -
|
|
342
|
+
let N_s = -sb * normalize(cross(s_c - s_a, s_b - s_a));
|
|
343
343
|
|
|
344
344
|
result.t = t;
|
|
345
345
|
result.barycentric = b;
|
|
346
|
-
result.normal = normalize(N_s -
|
|
346
|
+
result.normal = normalize(N_s - uG + sb * N);
|
|
347
347
|
}
|
|
348
348
|
|
|
349
349
|
return result;
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
export default /* wgsl */ `
|
|
5
5
|
var<private> s0: vec4u;
|
|
6
6
|
|
|
7
|
-
fn
|
|
7
|
+
fn fi(p: vec2u, frame: i32) {
|
|
8
8
|
|
|
9
9
|
s0 = vec4u(p, u32(frame), u32(p.x) + u32(p.y));
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
fn
|
|
13
|
+
fn xF() {
|
|
14
14
|
s0 = s0 * 1664525u + 1013904223u;
|
|
15
15
|
s0.x += s0.y*s0.w; s0.y += s0.z*s0.x; s0.z += s0.x*s0.y; s0.w += s0.y*s0.z;
|
|
16
16
|
s0 = s0 ^ (s0>>vec4(16u));
|
|
@@ -18,7 +18,7 @@ s0.x += s0.y*s0.w; s0.y += s0.z*s0.x; s0.z += s0.x*s0.y; s0.w += s0.y*s0.z;
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
fn rand() -> f32 {
|
|
21
|
-
|
|
21
|
+
xF(); return f32(s0.x)/f32(0xffffffffu);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
`;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export default function rayTraceCore({ hasAnisotropyDirections, hasCoatNormals, hasSceneAlpha, lightCapabilities }: {
|
|
1
|
+
export default function rayTraceCore({ hasAnisotropyDirections, hasCoatNormals, hasSceneAlpha, caustics, lightCapabilities }: {
|
|
2
2
|
hasAnisotropyDirections?: boolean;
|
|
3
3
|
hasCoatNormals?: boolean;
|
|
4
4
|
hasSceneAlpha?: boolean;
|
|
5
|
+
caustics?: boolean;
|
|
5
6
|
lightCapabilities?: number;
|
|
6
7
|
}): string;
|
|
@@ -2,7 +2,7 @@ import { materialBufferWgsl } from '../../materialLayoutSchema.js';
|
|
|
2
2
|
import { ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES } from '../../shaderCapabilities.js';
|
|
3
3
|
import { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';
|
|
4
4
|
import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_SPOT_LIGHT } from '../../lightConstants.js';
|
|
5
|
-
export default function rayTraceCore({ hasAnisotropyDirections = true, hasCoatNormals = false, hasSceneAlpha = true, lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES }) {
|
|
5
|
+
export default function rayTraceCore({ hasAnisotropyDirections = true, hasCoatNormals = false, hasSceneAlpha = true, caustics = false, lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES }) {
|
|
6
6
|
return /*wgsl*/ `
|
|
7
7
|
|
|
8
8
|
const luminance = vec3f(0.2126, 0.7152, 0.0722);
|
|
@@ -62,6 +62,8 @@ barycentrics: vec2f,
|
|
|
62
62
|
|
|
63
63
|
wavelength: f32,
|
|
64
64
|
|
|
65
|
+
spectralChannel: i32,
|
|
66
|
+
|
|
65
67
|
mediumType: i32,
|
|
66
68
|
mediumExtinction: vec3f,
|
|
67
69
|
mediumScattering: vec3f,
|
|
@@ -81,7 +83,9 @@ specularAnisotropy: f32,
|
|
|
81
83
|
|
|
82
84
|
baseMetalness: f32,
|
|
83
85
|
specularIor: f32,
|
|
84
|
-
specularRoughness: f32
|
|
86
|
+
specularRoughness: f32,${caustics ? /* wgsl */ `
|
|
87
|
+
causticRoughness: f32,
|
|
88
|
+
causticNormalMapped: bool,` : ''}
|
|
85
89
|
|
|
86
90
|
transmissionDispersionScale: f32,
|
|
87
91
|
dispersionAbbeNumber: f32,
|
|
@@ -153,7 +157,13 @@ fromEye: bool,
|
|
|
153
157
|
abort: bool,
|
|
154
158
|
scatteringPdf: f32,
|
|
155
159
|
scatteringIsDelta: bool,
|
|
156
|
-
isNextRefraction: bool
|
|
160
|
+
isNextRefraction: bool,${caustics ? /* wgsl */ `
|
|
161
|
+
causticK: u32,
|
|
162
|
+
causticSingleT: bool,
|
|
163
|
+
causticReceiverPrimary: bool,
|
|
164
|
+
causticHasReceiver: bool,
|
|
165
|
+
causticPhotonReceiver:bool,
|
|
166
|
+
causticMneeReceiver: bool,` : ''}
|
|
157
167
|
};
|
|
158
168
|
|
|
159
169
|
struct LightSampleRec {
|
|
@@ -209,7 +219,7 @@ secondaryUv1: vec2f,
|
|
|
209
219
|
secondaryUv2: vec2f,
|
|
210
220
|
};
|
|
211
221
|
|
|
212
|
-
struct
|
|
222
|
+
struct pW {
|
|
213
223
|
probability: f32,
|
|
214
224
|
aliasIndex: i32,
|
|
215
225
|
sourceType: i32,
|
|
@@ -283,15 +293,15 @@ backgroundMapRotation: mat4x4f,
|
|
|
283
293
|
@group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;
|
|
284
294
|
@group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;
|
|
285
295
|
|
|
286
|
-
fn
|
|
287
|
-
let
|
|
296
|
+
fn cF(dV: i32, lK: i32) -> f32 {
|
|
297
|
+
let im = dV + lK / 4;
|
|
288
298
|
let width = rtUniform.lightSamplingTextureWidth;
|
|
289
|
-
let packed = textureLoad(lightSamplingData, vec2i(
|
|
290
|
-
return packed[
|
|
299
|
+
let packed = textureLoad(lightSamplingData, vec2i(im % width, im / width), 0);
|
|
300
|
+
return packed[lK % 4];
|
|
291
301
|
}
|
|
292
302
|
|
|
293
|
-
fn
|
|
294
|
-
if (
|
|
303
|
+
fn ld(dV: i32, uv: vec2f) -> f32 {
|
|
304
|
+
if (dV < 0) { return 1.0; }
|
|
295
305
|
let pixel = fract(uv) * 128.0 - vec2f(0.5);
|
|
296
306
|
let x0 = i32(floor(pixel.x));
|
|
297
307
|
let y0 = i32(floor(pixel.y));
|
|
@@ -301,26 +311,26 @@ let xa = select(x0, 127, x0 < 0);
|
|
|
301
311
|
let xb = select(x0 + 1, 0, x0 >= 127);
|
|
302
312
|
let ya = select(y0, 127, y0 < 0);
|
|
303
313
|
let yb = select(y0 + 1, 0, y0 >= 127);
|
|
304
|
-
let a =
|
|
305
|
-
let b =
|
|
306
|
-
let c =
|
|
307
|
-
let d =
|
|
314
|
+
let a = cF(dV, ya * 128 + xa);
|
|
315
|
+
let b = cF(dV, ya * 128 + xb);
|
|
316
|
+
let c = cF(dV, yb * 128 + xa);
|
|
317
|
+
let d = cF(dV, yb * 128 + xb);
|
|
308
318
|
return mix(mix(a, b, fx), mix(c, d, fx), fy);
|
|
309
319
|
}
|
|
310
320
|
|
|
311
|
-
fn
|
|
321
|
+
fn evaluateSpotEmissionMultiplier(light: Light, dI: vec3f) -> f32 {
|
|
312
322
|
let axis = normalize(light.u);
|
|
313
|
-
let
|
|
314
|
-
var
|
|
323
|
+
let ct = dot(axis, dI);
|
|
324
|
+
var vw = select(0.0, 1.0, ct >= light.v.x);
|
|
315
325
|
if (light.v.y > light.v.x + 1e-6) {
|
|
316
|
-
|
|
326
|
+
vw = smoothstep(light.v.x, light.v.y, ct);
|
|
317
327
|
}
|
|
318
|
-
if (
|
|
319
|
-
let
|
|
320
|
-
let
|
|
321
|
-
let vertical = acos(clamp(
|
|
322
|
-
let horizontal = atan2(dot(
|
|
323
|
-
return
|
|
328
|
+
if (vw <= 0.0 || light.textureIndex < 0.0) { return vw; }
|
|
329
|
+
let vX = light.iesReference;
|
|
330
|
+
let xN = cross(axis, vX);
|
|
331
|
+
let vertical = acos(clamp(ct, -1.0, 1.0));
|
|
332
|
+
let horizontal = atan2(dot(dI, xN), dot(dI, vX));
|
|
333
|
+
return vw * ld(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));
|
|
324
334
|
}
|
|
325
335
|
|
|
326
336
|
|
|
@@ -332,7 +342,7 @@ return vm * lB(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI
|
|
|
332
342
|
@group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;
|
|
333
343
|
|
|
334
344
|
|
|
335
|
-
fn
|
|
345
|
+
fn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {
|
|
336
346
|
(*ray).o = origin;
|
|
337
347
|
(*ray).d = direction;
|
|
338
348
|
}
|