@meimu/mutracer 0.1.3 → 0.1.4
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 +4114 -4015
- package/docs/api.md +11 -9
- package/docs/threejs.md +30 -4
- 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 +12 -6
- 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 +7 -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 +316 -310
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
- 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 +40 -39
- 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 +78 -78
- 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 +475 -469
- 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 +93 -59
- 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/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 gj = normalize(rm * view);
|
|
9
|
+
let uh = min(gj.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 lJ = vec3f(
|
|
17
|
+
gj.x + fl * cos(br),
|
|
18
|
+
gj.y + fl * sin(br),
|
|
19
|
+
rh
|
|
20
20
|
);
|
|
21
|
-
return normalize(
|
|
21
|
+
return normalize(rm * lJ);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
fn
|
|
25
|
-
let
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
fn gK(oq: vec3f, alpha: vec2f) -> f32 {
|
|
25
|
+
let hr = vec3f(
|
|
26
|
+
oq.x / alpha.x,
|
|
27
|
+
oq.y / alpha.y,
|
|
28
|
+
oq.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 lK = dot(ic, ic)
|
|
43
|
+
/ (eF * eF);
|
|
44
|
+
return 2.0 / (1.0 + sqrt(1.0 + lK));
|
|
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 lU = sqrt(max(0.0, 1.0 - kl));
|
|
61
|
+
let ba = (iA - cJ * lU)
|
|
62
|
+
/ max(iA + cJ * lU, 1e-8);
|
|
63
|
+
let pN = (cJ * iA - lU)
|
|
64
|
+
/ max(cJ * iA + lU, 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 gh(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 = gh(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, nO: f32) -> f32 {
|
|
98
|
+
let scale = max(pr, nO);
|
|
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, nO) / scale;
|
|
103
|
+
let oP = normalized * normalized;
|
|
104
|
+
return oP.x / (oP.x + oP.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
|
+
hg: 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 hg;
|
|
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 nh = max(qs / hp, 1e-6);
|
|
158
|
+
let qR = (hg - 1.0) * jR / nh;
|
|
159
|
+
let tl = hg
|
|
160
|
+
- qR / (FRAUNHOFER_D * FRAUNHOFER_D);
|
|
161
|
+
return tl + qR / (wavelength * wavelength);
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
fn
|
|
165
|
-
|
|
164
|
+
fn fp(
|
|
165
|
+
gy: 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(gy, &tangent, &bitangent);
|
|
186
|
+
return tangent * (ud * cos(br))
|
|
187
|
+
+ bitangent * (ud * sin(br))
|
|
188
|
+
+ gy * 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> fB: bool = false;
|
|
103
|
+
var<private> dg: bool = false;
|
|
104
|
+
var<private> dF: u32;
|
|
105
|
+
var<private> gu: 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 (fB && all(hl == key) && hm == rtUniform.zSobolLogSPP) { return; }
|
|
112
|
+
hl = key; hm = rtUniform.zSobolLogSPP;
|
|
113
|
+
fB = 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
|
+
gu = 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(gu, 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 fo(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 gH(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
|
}
|