@meimu/mutracer 0.1.3 → 0.1.5
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/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- package/lib/Engine.js +18 -1
- package/lib/Engine.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/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +17 -9
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +8 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +42 -41
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- 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 +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- 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/package.json +1 -1
|
@@ -4,70 +4,70 @@ export default /*wgsl*/ `
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
fn aQ(view: vec3f, alpha: vec2f, samplePoint: vec2f) -> vec3f {
|
|
7
|
-
let
|
|
8
|
-
let
|
|
9
|
-
let
|
|
10
|
-
let
|
|
11
|
-
let
|
|
12
|
-
let
|
|
13
|
-
let
|
|
14
|
-
let
|
|
7
|
+
let rm = vec3f(alpha, 1.0);
|
|
8
|
+
let gk = normalize(rm * view);
|
|
9
|
+
let uh = min(gk.z, 1.0);
|
|
10
|
+
let qQ = 1.0 + uh;
|
|
11
|
+
let rh = (1.0 - samplePoint.y) * qQ;
|
|
12
|
+
let rR = samplePoint.y * qQ;
|
|
13
|
+
let sI = rh + (1.0 - uh);
|
|
14
|
+
let fl = sqrt(max(0.0, sI * rR));
|
|
15
15
|
let br = TWOPI * samplePoint.x;
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
let lI = vec3f(
|
|
17
|
+
gk.x + fl * cos(br),
|
|
18
|
+
gk.y + fl * sin(br),
|
|
19
|
+
rh
|
|
20
20
|
);
|
|
21
|
-
return normalize(
|
|
21
|
+
return normalize(rm * lI);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
fn
|
|
25
|
-
let
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
fn gL(oo: vec3f, alpha: vec2f) -> f32 {
|
|
25
|
+
let hr = vec3f(
|
|
26
|
+
oo.x / alpha.x,
|
|
27
|
+
oo.y / alpha.y,
|
|
28
|
+
oo.z
|
|
29
29
|
);
|
|
30
|
-
let ap = dot(
|
|
30
|
+
let ap = dot(hr, hr);
|
|
31
31
|
return 1.0 / (
|
|
32
32
|
PI * alpha.x * alpha.y * ap * ap
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
fn bk(direction: vec3f, alpha: vec2f) -> f32 {
|
|
37
|
-
let
|
|
38
|
-
if (
|
|
37
|
+
let eF = abs(direction.z);
|
|
38
|
+
if (eF <= 1e-8) {
|
|
39
39
|
return 0.0;
|
|
40
40
|
}
|
|
41
|
-
let
|
|
42
|
-
let
|
|
43
|
-
/ (
|
|
44
|
-
return 2.0 / (1.0 + sqrt(1.0 +
|
|
41
|
+
let ic = alpha * direction.xy;
|
|
42
|
+
let lJ = dot(ic, ic)
|
|
43
|
+
/ (eF * eF);
|
|
44
|
+
return 2.0 / (1.0 + sqrt(1.0 + lJ));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
fn aE(au: f32) -> f32 {
|
|
48
|
-
let
|
|
49
|
-
return pow(
|
|
48
|
+
let di = clamp(1.0 - au, 0.0, 1.0);
|
|
49
|
+
return pow(di, 5.0);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
fn cu(L: f32, cJ: f32) -> f32 {
|
|
53
|
-
let
|
|
54
|
-
let
|
|
55
|
-
* max(0.0, 1.0 -
|
|
56
|
-
if (
|
|
53
|
+
let iA = clamp(abs(L), 0.0, 1.0);
|
|
54
|
+
let kl = cJ * cJ
|
|
55
|
+
* max(0.0, 1.0 - iA * iA);
|
|
56
|
+
if (kl >= 1.0) {
|
|
57
57
|
return 1.0;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
let
|
|
61
|
-
let ba = (
|
|
62
|
-
/ max(
|
|
63
|
-
let
|
|
64
|
-
/ max(cJ *
|
|
60
|
+
let lT = sqrt(max(0.0, 1.0 - kl));
|
|
61
|
+
let ba = (iA - cJ * lT)
|
|
62
|
+
/ max(iA + cJ * lT, 1e-8);
|
|
63
|
+
let pN = (cJ * iA - lT)
|
|
64
|
+
/ max(cJ * iA + lT, 1e-8);
|
|
65
65
|
return 0.5 * (
|
|
66
|
-
ba * ba +
|
|
66
|
+
ba * ba + pN * pN
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
fn
|
|
70
|
+
fn gi(samplePoint: vec2f) -> vec2f {
|
|
71
71
|
let offset = 2.0 * samplePoint - vec2f(1.0);
|
|
72
72
|
if (offset.x == 0.0 && offset.y == 0.0) {
|
|
73
73
|
return vec2f(0.0);
|
|
@@ -87,21 +87,21 @@ return radius * vec2f(cos(angle), sin(angle));
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
fn bi(samplePoint: vec2f) -> vec3f {
|
|
90
|
-
let
|
|
90
|
+
let kF = gi(samplePoint);
|
|
91
91
|
return vec3f(
|
|
92
|
-
|
|
93
|
-
sqrt(max(0.0, 1.0 - dot(
|
|
92
|
+
kF,
|
|
93
|
+
sqrt(max(0.0, 1.0 - dot(kF, kF)))
|
|
94
94
|
);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
fn aG(
|
|
98
|
-
let scale = max(
|
|
97
|
+
fn aG(pr: f32, nN: f32) -> f32 {
|
|
98
|
+
let scale = max(pr, nN);
|
|
99
99
|
if (scale <= 0.0) {
|
|
100
100
|
return 0.0;
|
|
101
101
|
}
|
|
102
|
-
let normalized = vec2f(
|
|
103
|
-
let
|
|
104
|
-
return
|
|
102
|
+
let normalized = vec2f(pr, nN) / scale;
|
|
103
|
+
let oO = normalized * normalized;
|
|
104
|
+
return oO.x / (oO.x + oO.y);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
fn aL(
|
|
@@ -109,17 +109,17 @@ normal: vec3f,
|
|
|
109
109
|
tangent: ptr<function, vec3f>,
|
|
110
110
|
bitangent: ptr<function, vec3f>
|
|
111
111
|
) {
|
|
112
|
-
let
|
|
113
|
-
let dW = -1.0 / (
|
|
112
|
+
let ik = select(-1.0, 1.0, normal.z >= 0.0);
|
|
113
|
+
let dW = -1.0 / (ik + normal.z);
|
|
114
114
|
let xy = normal.x * normal.y * dW;
|
|
115
115
|
*tangent = vec3f(
|
|
116
|
-
1.0 +
|
|
117
|
-
|
|
118
|
-
-
|
|
116
|
+
1.0 + ik * normal.x * normal.x * dW,
|
|
117
|
+
ik * xy,
|
|
118
|
+
-ik * normal.x
|
|
119
119
|
);
|
|
120
120
|
*bitangent = vec3f(
|
|
121
121
|
xy,
|
|
122
|
-
|
|
122
|
+
ik + normal.y * normal.y * dW,
|
|
123
123
|
-normal.y
|
|
124
124
|
);
|
|
125
125
|
}
|
|
@@ -137,32 +137,32 @@ return vec3f(0.0, rgb.g, 0.0);
|
|
|
137
137
|
return vec3f(0.0, 0.0, rgb.b);
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
fn
|
|
140
|
+
fn eN(
|
|
141
141
|
wavelength: f32,
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
hh: f32,
|
|
143
|
+
hp: f32,
|
|
144
|
+
qs: f32
|
|
145
145
|
) -> f32 {
|
|
146
|
-
if (wavelength == 0.0 ||
|
|
147
|
-
return
|
|
146
|
+
if (wavelength == 0.0 || hp <= 0.0) {
|
|
147
|
+
return hh;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
let FRAUNHOFER_C = 656.3;
|
|
151
151
|
let FRAUNHOFER_D = 587.6;
|
|
152
152
|
let FRAUNHOFER_F = 486.1;
|
|
153
|
-
let
|
|
153
|
+
let jR = 1.0 / (
|
|
154
154
|
1.0 / (FRAUNHOFER_F * FRAUNHOFER_F)
|
|
155
155
|
- 1.0 / (FRAUNHOFER_C * FRAUNHOFER_C)
|
|
156
156
|
);
|
|
157
|
-
let
|
|
158
|
-
let
|
|
159
|
-
let
|
|
160
|
-
-
|
|
161
|
-
return
|
|
157
|
+
let ng = max(qs / hp, 1e-6);
|
|
158
|
+
let qR = (hh - 1.0) * jR / ng;
|
|
159
|
+
let tl = hh
|
|
160
|
+
- qR / (FRAUNHOFER_D * FRAUNHOFER_D);
|
|
161
|
+
return tl + qR / (wavelength * wavelength);
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
fn
|
|
165
|
-
|
|
164
|
+
fn fq(
|
|
165
|
+
gz: vec3f,
|
|
166
166
|
anisotropy: f32,
|
|
167
167
|
samplePoint: vec2f
|
|
168
168
|
) -> vec3f {
|
|
@@ -171,21 +171,21 @@ if (abs(anisotropy) < 0.001) {
|
|
|
171
171
|
au = 1.0 - 2.0 * samplePoint.y;
|
|
172
172
|
}
|
|
173
173
|
else {
|
|
174
|
-
let
|
|
174
|
+
let ja = (1.0 - anisotropy * anisotropy)
|
|
175
175
|
/ (1.0 + anisotropy - 2.0 * anisotropy * samplePoint.y);
|
|
176
176
|
au = (
|
|
177
|
-
|
|
177
|
+
ja * ja - 1.0 - anisotropy * anisotropy
|
|
178
178
|
) / (2.0 * anisotropy);
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
let
|
|
181
|
+
let ud = sqrt(max(0.0, 1.0 - au * au));
|
|
182
182
|
let br = TWOPI * samplePoint.x;
|
|
183
183
|
var tangent: vec3f;
|
|
184
184
|
var bitangent: vec3f;
|
|
185
|
-
aL(
|
|
186
|
-
return tangent * (
|
|
187
|
-
+ bitangent * (
|
|
188
|
-
+
|
|
185
|
+
aL(gz, &tangent, &bitangent);
|
|
186
|
+
return tangent * (ud * cos(br))
|
|
187
|
+
+ bitangent * (ud * sin(br))
|
|
188
|
+
+ gz * au;
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
fn bD(au: f32, anisotropy: f32) -> f32 {
|
|
@@ -20,8 +20,8 @@ var<private> bc: vec2u;
|
|
|
20
20
|
var<private> bd: u32;
|
|
21
21
|
var<private> cF: u32 = 0u;
|
|
22
22
|
var<private> em: u32 = 0u;
|
|
23
|
-
fn eg(
|
|
24
|
-
var x =
|
|
23
|
+
fn eg(kt: u32) -> u32 {
|
|
24
|
+
var x = kt;
|
|
25
25
|
x ^= x >> 16u; x *= 0x7feb352du;
|
|
26
26
|
x ^= x >> 15u; x *= 0x846ca68bu;
|
|
27
27
|
return x ^ (x >> 16u);
|
|
@@ -29,28 +29,28 @@ return x ^ (x >> 16u);
|
|
|
29
29
|
fn aq(a: u32, b: u32) -> u32 {
|
|
30
30
|
return eg(a ^ eg(b + 0x9e3779b9u));
|
|
31
31
|
}
|
|
32
|
-
fn
|
|
33
|
-
var x =
|
|
32
|
+
fn iE(kt: u32, ij: u32) -> u32 {
|
|
33
|
+
var x = kt + ij;
|
|
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 sK(x: u32, ij: u32) -> u32 {
|
|
39
|
+
return reverseBits(iE(reverseBits(x), ij));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
fn
|
|
43
|
-
var r = reverseBits(
|
|
42
|
+
fn rl(kt: u32) -> u32 {
|
|
43
|
+
var r = reverseBits(kt);
|
|
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 vP(index: u32, ij: u32) -> vec2f {
|
|
48
|
+
let i = sK(index, aq(ij, 0u));
|
|
49
|
+
let x = reverseBits(iE(i, aq(ij, 1u)));
|
|
50
|
+
let y = sK(rl(i), aq(ij, 2u));
|
|
51
51
|
return vec2f(f32(x >> 8u), f32(y >> 8u)) * (1.0 / 16777216.0);
|
|
52
52
|
}
|
|
53
|
-
fn
|
|
53
|
+
fn tB(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,27 +58,27 @@ 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 kw(tE: u32) -> u32 {
|
|
62
|
+
let group = tE >> 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 >> ((tE & 3u) * 8u)) & 255u;
|
|
66
66
|
}
|
|
67
|
-
fn
|
|
67
|
+
fn pW(kN: u32, dim: u32, logSPP: u32) -> u32 {
|
|
68
68
|
let odd = logSPP & 1u;
|
|
69
|
-
let
|
|
69
|
+
let um = 8u + ((logSPP + 1u) >> 1u);
|
|
70
70
|
var result = 0u;
|
|
71
|
-
for (var digit = i32(
|
|
71
|
+
for (var digit = i32(um) - 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 st = 0u;
|
|
75
|
+
if (shift < 30u) { st = kN >> (shift + 2u); }
|
|
76
|
+
let tE = (eg(st ^ (0x55555555u * dim)) >> 24u) % 24u;
|
|
77
|
+
let d = (kN >> shift) & 3u;
|
|
78
|
+
result |= ((kw(tE) >> (2u*d)) & 3u) << shift;
|
|
79
79
|
}
|
|
80
80
|
if (odd != 0u) {
|
|
81
|
-
result |= (
|
|
81
|
+
result |= (kN & 1u) ^ (eg((kN >> 1u) ^ (0x55555555u * dim)) & 1u);
|
|
82
82
|
}
|
|
83
83
|
return result;
|
|
84
84
|
}
|
|
@@ -88,7 +88,7 @@ return result;
|
|
|
88
88
|
fn cw(slot: u32) -> u32 {
|
|
89
89
|
return CAMERA_BEVEL_BASE + u32(BEVEL_SAMPLES) + cF * BOUNCE_STRIDE + slot;
|
|
90
90
|
}
|
|
91
|
-
fn
|
|
91
|
+
fn rd(candidate: u32, slot: u32) -> u32 {
|
|
92
92
|
if (candidate == 0u) {
|
|
93
93
|
if (slot == 2u) { return cw(8u); }
|
|
94
94
|
return cw(slot);
|
|
@@ -97,62 +97,62 @@ return cw(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>
|
|
100
|
+
var<private> hl: vec4u;
|
|
101
|
+
var<private> hm: u32;
|
|
102
|
+
var<private> fC: bool = false;
|
|
103
|
+
var<private> dg: bool = false;
|
|
104
|
+
var<private> dF: u32;
|
|
105
|
+
var<private> gv: u32;
|
|
106
|
+
var<private> eQ: vec2f;
|
|
107
107
|
fn dw(dim: u32) {
|
|
108
108
|
|
|
109
|
-
let
|
|
110
|
-
let key = vec4u(dim, bd,
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
var
|
|
109
|
+
let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
|
|
110
|
+
let key = vec4u(dim, bd, kd, rtUniform.sequenceSeed);
|
|
111
|
+
if (fC && all(hl == key) && hm == rtUniform.zSobolLogSPP) { return; }
|
|
112
|
+
hl = key; hm = rtUniform.zSobolLogSPP;
|
|
113
|
+
fC = true; dg = false;
|
|
114
|
+
var ij = aq(aq(kd, dim), rtUniform.sequenceSeed);
|
|
115
115
|
var index = bd;
|
|
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 jb = index >> logSPP;
|
|
122
122
|
let mask = (1u << logSPP) - 1u;
|
|
123
|
-
let
|
|
124
|
-
index =
|
|
123
|
+
let kN = (tB(bc) << logSPP) | (index & mask);
|
|
124
|
+
index = pW(kN, dim, logSPP);
|
|
125
125
|
let tile = bc >> vec2u(8u);
|
|
126
|
-
|
|
126
|
+
ij = aq(aq(dim, rtUniform.sequenceSeed), aq(tile.x, tile.y));
|
|
127
127
|
|
|
128
|
-
if (bd != 0u) {
|
|
129
|
-
|
|
128
|
+
if (bd != 0u) { jb += 1u; }
|
|
129
|
+
ij = aq(ij, jb);
|
|
130
130
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let x = reverseBits(
|
|
134
|
-
|
|
131
|
+
dF = sK(index, aq(ij, 0u));
|
|
132
|
+
gv = ij;
|
|
133
|
+
let x = reverseBits(iE(dF, aq(ij, 1u)));
|
|
134
|
+
eQ.x = f32(x >> 8u) * (1.0 / 16777216.0);
|
|
135
135
|
}
|
|
136
|
-
fn
|
|
136
|
+
fn kS(dim: u32) -> vec2f {
|
|
137
137
|
dw(dim);
|
|
138
|
-
if (!
|
|
139
|
-
let y =
|
|
140
|
-
|
|
141
|
-
|
|
138
|
+
if (!dg) {
|
|
139
|
+
let y = sK(rl(dF), aq(gv, 2u));
|
|
140
|
+
eQ.y = f32(y >> 8u) * (1.0 / 16777216.0);
|
|
141
|
+
dg = true;
|
|
142
142
|
}
|
|
143
|
-
return EPS + (1.0 - 2.0*EPS) *
|
|
143
|
+
return EPS + (1.0 - 2.0*EPS) * eQ;
|
|
144
144
|
}
|
|
145
145
|
fn dz(dim: u32) -> f32 {
|
|
146
146
|
if (SAMPLING_PATTERN == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
|
|
147
147
|
dw(dim);
|
|
148
|
-
return EPS + (1.0 - 2.0*EPS) *
|
|
148
|
+
return EPS + (1.0 - 2.0*EPS) * eQ.x;
|
|
149
149
|
}
|
|
150
|
-
fn
|
|
150
|
+
fn fp(dim: u32) -> vec2f {
|
|
151
151
|
if (SAMPLING_PATTERN == 2) {
|
|
152
152
|
let x = dz(dim); let y = dz(dim);
|
|
153
153
|
return vec2f(x,y);
|
|
154
154
|
}
|
|
155
|
-
return
|
|
155
|
+
return kS(dim);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
fn eo(slot: u32) -> f32 {
|
|
@@ -160,10 +160,10 @@ let dim = aq(aq(cF, slot), em) | 0x80000000u;
|
|
|
160
160
|
em += 1u;
|
|
161
161
|
if (SAMPLING_PATTERN == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
|
|
162
162
|
|
|
163
|
-
let
|
|
164
|
-
let
|
|
165
|
-
let i =
|
|
166
|
-
let x = reverseBits(
|
|
163
|
+
let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
|
|
164
|
+
let ij = aq(aq(kd, dim), rtUniform.sequenceSeed);
|
|
165
|
+
let i = sK(bd, aq(ij, 0u));
|
|
166
|
+
let x = reverseBits(iE(i, aq(ij, 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 iR(pos: vec3f, normal: vec3f) -> vec2f {
|
|
11
|
+
let dn = abs(normal);
|
|
12
12
|
var uv = vec2f(0.0);
|
|
13
|
-
if (
|
|
13
|
+
if (dn.x > dn.y && dn.x > dn.z) {
|
|
14
14
|
uv = pos.yz;
|
|
15
|
-
} else if (
|
|
15
|
+
} else if (dn.y > dn.x && dn.y > dn.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 hD(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 gI(fk: i32, pos: vec3f, normal: vec3f) -> vec2f {
|
|
32
|
+
if (fk == ${uvProjectionConstants.triplanar}) {
|
|
33
|
+
return iR(pos, normal);
|
|
34
|
+
} else if (fk == ${uvProjectionConstants.spherical}) {
|
|
35
35
|
return sphericalProjection(pos);
|
|
36
|
-
} else if (
|
|
37
|
-
return
|
|
36
|
+
} else if (fk == ${uvProjectionConstants.cylindrical}) {
|
|
37
|
+
return hD(pos, normal);
|
|
38
38
|
}
|
|
39
39
|
return vec2f(0.0);
|
|
40
40
|
}
|