@meimu/mutracer 0.1.1 → 0.1.3
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 +3525 -3484
- package/docs/materials.md +27 -7
- package/docs/threejs.md +13 -2
- package/docs/viewer.md +53 -0
- 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 +2 -1
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
- package/lib/renderer/WGPURayTraceOutput.js +14 -12
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.js +2 -2
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +20 -18
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.js +3 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
- package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
- 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 +32 -32
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
- package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +128 -128
- package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
- package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
- package/lib/renderer/lightsUtil.js +1 -1
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +5 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/materialLayout.js +2 -1
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +4 -2
- package/lib/renderer/prepareMeshBVH.js +44 -20
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
- 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 +13 -13
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +4 -2
- package/lib/scene/OpenPBRMaterial.js +4 -2
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/openPbrSchema.d.ts +7 -2
- package/lib/scene/openPbrSchema.js +2 -1
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +1 -0
- package/lib/util/fromTHREE.js +24 -6
- 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 +5 -4
|
@@ -43,50 +43,50 @@ ${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
|
|
|
43
43
|
${sampleLightWgsl}
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
var<private>
|
|
46
|
+
var<private> tE: u32 = 0u;
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
fn
|
|
50
|
+
fn jQ() -> u32 {
|
|
51
51
|
return u32(max(rtUniform.directLightCandidates, 1));
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
fn
|
|
57
|
+
fn ps(wI: u32) -> f32 {
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
if (SAMPLING_PATTERN == 2) { _ = rand(); }
|
|
63
|
-
let
|
|
64
|
-
let key = aq(aq(
|
|
65
|
-
let dimension = aq(
|
|
63
|
+
let jW = bc.x + bc.y * u32(rtUniform.outputSize.x);
|
|
64
|
+
let key = aq(aq(jW, bd), rtUniform.sequenceSeed);
|
|
65
|
+
let dimension = aq(cF, wI) ^ 0xa511e9b3u;
|
|
66
66
|
return f32(eg(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
fn
|
|
72
|
-
let aW =
|
|
71
|
+
fn tq(fd: f32, scatteringPdf: f32) -> f32 {
|
|
72
|
+
let aW = jQ();
|
|
73
73
|
if (aW <= 1u) {
|
|
74
|
-
return
|
|
74
|
+
return aG(fd, scatteringPdf);
|
|
75
75
|
}
|
|
76
|
-
let
|
|
77
|
-
return
|
|
78
|
-
max(
|
|
76
|
+
let iF = f32(aW) * fd;
|
|
77
|
+
return iF /
|
|
78
|
+
max(iF + scatteringPdf, 1e-20);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
fn fS(scatteringPdf: f32, fd: f32) -> f32 {
|
|
83
|
-
let aW =
|
|
83
|
+
let aW = jQ();
|
|
84
84
|
if (aW <= 1u) {
|
|
85
|
-
return
|
|
85
|
+
return aG(scatteringPdf, fd);
|
|
86
86
|
}
|
|
87
|
-
let
|
|
87
|
+
let iF = f32(aW) * fd;
|
|
88
88
|
return scatteringPdf /
|
|
89
|
-
max(scatteringPdf +
|
|
89
|
+
max(scatteringPdf + iF, 1e-20);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals)}
|
|
@@ -101,24 +101,24 @@ ${shadowCatcherAccumulationWGSL}
|
|
|
101
101
|
@group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
|
|
102
102
|
|
|
103
103
|
|
|
104
|
-
fn
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
fn hG(
|
|
105
|
+
ha: u32,
|
|
106
|
+
vp: vec3f,
|
|
107
107
|
normal: vec3f
|
|
108
108
|
) {
|
|
109
109
|
if (rtUniform.varianceMoments != 0) {
|
|
110
|
-
let value = dot(
|
|
111
|
-
outNormal[
|
|
110
|
+
let value = dot(vp, luminance);
|
|
111
|
+
outNormal[ha] += vec4f(value * value, 0.0, 0.0, 1.0);
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
|
-
outNormal[
|
|
114
|
+
outNormal[ha] += vec4f(normal, 1.0);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
fn
|
|
121
|
-
outShadowCatcher[
|
|
120
|
+
fn iN(ha: u32, value: f32) {
|
|
121
|
+
outShadowCatcher[ha].moments += vec4f(value, value * value, 0.0, 0.0);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
|
|
@@ -130,24 +130,24 @@ normal: vec3f,
|
|
|
130
130
|
isBlank: bool,
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
fn dq(
|
|
134
|
-
let fN = length(
|
|
133
|
+
fn dq(sF: vec3f, height: f32, radius: f32) -> f32 {
|
|
134
|
+
let fN = length(sF);
|
|
135
135
|
if (fN < 0.00001) {
|
|
136
136
|
return -radius;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
let iC = radius *
|
|
140
|
-
let
|
|
139
|
+
let iC = radius * sF.y / fN;
|
|
140
|
+
let ij = -1.5 * height;
|
|
141
141
|
var ev: f32;
|
|
142
142
|
if (iC >= 0.0) {
|
|
143
143
|
ev = radius;
|
|
144
144
|
}
|
|
145
|
-
else if (iC <
|
|
146
|
-
ev = -height * fN /
|
|
145
|
+
else if (iC < ij) {
|
|
146
|
+
ev = -height * fN / sF.y;
|
|
147
147
|
}
|
|
148
148
|
else {
|
|
149
149
|
let dW = 1.0
|
|
150
|
-
- iC * iC / (3.0 *
|
|
150
|
+
- iC * iC / (3.0 * ij * ij);
|
|
151
151
|
ev = radius * dW;
|
|
152
152
|
}
|
|
153
153
|
return fN - ev;
|
|
@@ -175,46 +175,46 @@ ej <= 0.0
|
|
|
175
175
|
return direction;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
-
var
|
|
179
|
-
if (
|
|
178
|
+
var cC = -eI + sqrt(ej);
|
|
179
|
+
if (cC <= 0.0) {
|
|
180
180
|
return direction;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
let
|
|
184
|
-
if (
|
|
185
|
-
return normalize(
|
|
183
|
+
let nE = bB + bY * cC;
|
|
184
|
+
if (nE.y >= 0.0) {
|
|
185
|
+
return normalize(nE);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
if (bY.y < -0.00001 && params.y > 1.5 * params.x) {
|
|
189
|
-
let
|
|
190
|
-
let
|
|
191
|
-
let
|
|
189
|
+
let hP = (-params.x - bB.y) / bY.y;
|
|
190
|
+
let nq = bB + bY * hP;
|
|
191
|
+
let oc = (2.0 / 3.0)
|
|
192
192
|
* sqrt(params.y * params.y - 2.25 * params.x * params.x);
|
|
193
|
-
if (
|
|
194
|
-
return normalize(
|
|
193
|
+
if (hP > 0.0 && length(nq.xz) <= oc) {
|
|
194
|
+
return normalize(nq);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
var cN = 0.0;
|
|
199
199
|
for (var i = 0; i < 14; i++) {
|
|
200
|
-
let fe = (cN +
|
|
201
|
-
let
|
|
202
|
-
if (dq(
|
|
203
|
-
|
|
200
|
+
let fe = (cN + cC) * 0.5;
|
|
201
|
+
let pt = bB + bY * fe;
|
|
202
|
+
if (dq(pt, params.x, params.y) > 0.0) {
|
|
203
|
+
cC = fe;
|
|
204
204
|
}
|
|
205
205
|
else {
|
|
206
206
|
cN = fe;
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
|
-
let hit = bB + bY * ((cN +
|
|
209
|
+
let hit = bB + bY * ((cN + cC) * 0.5);
|
|
210
210
|
return normalize(hit);
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
fn
|
|
213
|
+
fn hD(ray: Ray) -> vec4f {
|
|
214
214
|
var bg = vec4f(0.0);
|
|
215
215
|
if (USE_BACKGROUND_MAP) {
|
|
216
|
-
let
|
|
217
|
-
bg = textureLinear(backgroundMap, aS(
|
|
216
|
+
let pT = eQ(ray.o, ray.d);
|
|
217
|
+
bg = textureLinear(backgroundMap, aS(pT));
|
|
218
218
|
}
|
|
219
219
|
else if (USE_BACKGROUND) {
|
|
220
220
|
bg = rtUniform.backgroundColor;
|
|
@@ -226,7 +226,7 @@ return bg;
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
fn cW(ray: Ray, wavelength: f32) -> vec4f {
|
|
229
|
-
let bg =
|
|
229
|
+
let bg = hD(ray);
|
|
230
230
|
if (SPECTRAL) {
|
|
231
231
|
return vec4f(ai(bg.rgb, wavelength), bg.a);
|
|
232
232
|
}
|
|
@@ -234,7 +234,7 @@ return bg;
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
fn bounce(uv: vec2f, aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, ad>, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) {
|
|
237
|
-
|
|
237
|
+
cF = u32(max(*depth, 0));
|
|
238
238
|
let matType = (*ma).materialType;
|
|
239
239
|
let isShadowCatcher = matType == SHADOW_CATCHER;
|
|
240
240
|
if (isShadowCatcher) {
|
|
@@ -260,13 +260,13 @@ iv(aS((*aa).ray.d)) * rtUniform.envLightPmf),
|
|
|
260
260
|
(*aa).alpha = max((*aa).alpha, bg.a);
|
|
261
261
|
}
|
|
262
262
|
else {
|
|
263
|
-
let
|
|
264
|
-
var emission = textureLinear(envMap,
|
|
263
|
+
let tJ = aS((*aa).ray.d);
|
|
264
|
+
var emission = textureLinear(envMap, tJ).rgb;
|
|
265
265
|
if (SPECTRAL) {
|
|
266
266
|
emission = ai(emission, (*si).wavelength);
|
|
267
267
|
}
|
|
268
268
|
(*aa).li += (*aa).beta * emission *
|
|
269
|
-
fS((*aa).scatteringPdf, iv(
|
|
269
|
+
fS((*aa).scatteringPdf, iv(tJ));
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
272
|
else {
|
|
@@ -297,10 +297,10 @@ if ((*aa).fromEye) {
|
|
|
297
297
|
(USE_BACKGROUND && !USE_BACKGROUND_MAP);
|
|
298
298
|
}
|
|
299
299
|
else {
|
|
300
|
-
let cam =
|
|
301
|
-
let
|
|
300
|
+
let cam = hy(uv);
|
|
301
|
+
let mC = dot(cam.d, (*aa).ray.d) > 0.0;
|
|
302
302
|
if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
303
|
-
if (
|
|
303
|
+
if (mC) {
|
|
304
304
|
(*aa).alpha = max((*aa).alpha, bg.a);
|
|
305
305
|
} else {
|
|
306
306
|
(*aa).alpha = 1.0;
|
|
@@ -309,7 +309,7 @@ if (mz) {
|
|
|
309
309
|
if (!USE_ENVMAP) {
|
|
310
310
|
|
|
311
311
|
|
|
312
|
-
if (
|
|
312
|
+
if (mC) {
|
|
313
313
|
|
|
314
314
|
|
|
315
315
|
(*aa).li += (*aa).beta *
|
|
@@ -321,7 +321,7 @@ fS((*aa).scatteringPdf, 1.0) * bg.rgb;
|
|
|
321
321
|
return;
|
|
322
322
|
}
|
|
323
323
|
|
|
324
|
-
var
|
|
324
|
+
var cH = false;
|
|
325
325
|
if ((matType == STANDARD || matType == UNLIT)) {
|
|
326
326
|
let alpha = clamp((*ma).alpha, 0.0, 1.0);
|
|
327
327
|
|
|
@@ -329,18 +329,18 @@ if (alpha < 1.0) {
|
|
|
329
329
|
|
|
330
330
|
|
|
331
331
|
if (alpha <= 0.0 || eo(3u) > alpha) {
|
|
332
|
-
|
|
332
|
+
cH = true;
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
|
-
if (!
|
|
335
|
+
if (!cH && rtUniform.transmissiveOutputAlphaMin < 1.0) {
|
|
336
336
|
|
|
337
337
|
|
|
338
|
-
let
|
|
339
|
-
(*aa).alpha = max(
|
|
338
|
+
let tP = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
|
|
339
|
+
(*aa).alpha = max(tP, (*aa).alpha);
|
|
340
340
|
}
|
|
341
|
-
if (!
|
|
342
|
-
|
|
343
|
-
|
|
341
|
+
if (!cH) {
|
|
342
|
+
tE = u32(max(*depth, 0));
|
|
343
|
+
lR(si, ma, aa);
|
|
344
344
|
}
|
|
345
345
|
else {
|
|
346
346
|
|
|
@@ -349,7 +349,7 @@ else {
|
|
|
349
349
|
}
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
-
if (!(*si).albedoSampled && !
|
|
352
|
+
if (!(*si).albedoSampled && !cH) {
|
|
353
353
|
|
|
354
354
|
if ((matType == STANDARD || matType == UNLIT)) {
|
|
355
355
|
if (!((*ma).transmissionWeight > 0.5 ||
|
|
@@ -374,12 +374,12 @@ if (*depth > 4) {
|
|
|
374
374
|
|
|
375
375
|
|
|
376
376
|
if (USE_RR) {
|
|
377
|
-
if (*depth >= RR_MAX && !
|
|
378
|
-
let
|
|
377
|
+
if (*depth >= RR_MAX && !cH) {
|
|
378
|
+
let oz = (*aa).beta;
|
|
379
379
|
|
|
380
|
-
let
|
|
381
|
-
let q: f32 = max(0.0, 1.0 -
|
|
382
|
-
if (dz(
|
|
380
|
+
let oo = max(max(oz.x, oz.y), oz.z);
|
|
381
|
+
let q: f32 = max(0.0, 1.0 - oo);
|
|
382
|
+
if (dz(cw(RUSSIAN_ROULETTE)) < q) {
|
|
383
383
|
|
|
384
384
|
|
|
385
385
|
(*aa).alpha = 1.0;
|
|
@@ -409,7 +409,7 @@ if ((*ma).transmissionWeight > 0.001) {
|
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
-
if (
|
|
412
|
+
if (cH) {
|
|
413
413
|
return;
|
|
414
414
|
}
|
|
415
415
|
|
|
@@ -419,10 +419,10 @@ let hu = eo(3u) < (*ma).alpha;
|
|
|
419
419
|
for (var i = 0; i < rtUniform.lightsCount; i++) {
|
|
420
420
|
|
|
421
421
|
let light: Light = analyticLights[i];
|
|
422
|
-
let d =
|
|
422
|
+
let d = mo((*aa).ray, light, &lightSample);
|
|
423
423
|
lightSample.pdf *= light.selectionPmf;
|
|
424
|
-
let
|
|
425
|
-
if (d != INF && !(
|
|
424
|
+
let mt = (*si).hit && d > distance((*si).position, (*aa).ray.o);
|
|
425
|
+
if (d != INF && !(mt && hu)) {
|
|
426
426
|
let eW = fS((*aa).scatteringPdf, lightSample.pdf);
|
|
427
427
|
if (SPECTRAL) {
|
|
428
428
|
lightSample.emission = ai(lightSample.emission, (*si).wavelength);
|
|
@@ -472,7 +472,7 @@ if (!USE_BACKGROUND) {
|
|
|
472
472
|
*depth = *depth + 1;
|
|
473
473
|
}
|
|
474
474
|
|
|
475
|
-
fn
|
|
475
|
+
fn hy(fD: vec2f) -> Ray {
|
|
476
476
|
let origin = cameraUniform.viewProjectionInv * vec4f(fD * 2.0 - 1.0, -1.0, 1.0);
|
|
477
477
|
let center = cameraUniform.viewProjectionInv * vec4f(fD * 2.0 - 1.0, 1.0, 1.0);
|
|
478
478
|
var cam: Ray;
|
|
@@ -482,104 +482,104 @@ return cam;
|
|
|
482
482
|
}
|
|
483
483
|
|
|
484
484
|
|
|
485
|
-
fn
|
|
485
|
+
fn kp(radius: f32, xi: f32) -> vec2f {
|
|
486
486
|
var x = 0.25;
|
|
487
|
-
for (var
|
|
487
|
+
for (var ns = 0; ns < 10; ns++) {
|
|
488
488
|
let x2 = x * x;
|
|
489
489
|
let x3 = x2 * x;
|
|
490
|
-
let
|
|
490
|
+
let kG = 1.0 - x;
|
|
491
491
|
let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
492
492
|
4.0 * x2 * x3 - xi;
|
|
493
|
-
let
|
|
494
|
-
if (abs(value) < 1e-6 ||
|
|
495
|
-
x = clamp(x - value /
|
|
493
|
+
let lY = 20.0 * x * kG * kG * kG;
|
|
494
|
+
if (abs(value) < 1e-6 || lY == 0.0) { break; }
|
|
495
|
+
x = clamp(x - value / lY, 0.0, 1.0);
|
|
496
496
|
}
|
|
497
|
-
let
|
|
498
|
-
return vec2f(
|
|
497
|
+
let jj = x * radius;
|
|
498
|
+
return vec2f(jj, sqrt(max(radius * radius - jj * jj, 0.0)));
|
|
499
499
|
}
|
|
500
500
|
|
|
501
|
-
fn
|
|
502
|
-
if (
|
|
503
|
-
let
|
|
504
|
-
return
|
|
501
|
+
fn iO(radius: f32, gs: f32) -> f32 {
|
|
502
|
+
if (gs >= radius) { return 0.0; }
|
|
503
|
+
let nV = radius - gs;
|
|
504
|
+
return nV * nV * nV;
|
|
505
505
|
}
|
|
506
506
|
|
|
507
507
|
|
|
508
|
-
fn
|
|
508
|
+
fn mi(source: ad, radius: f32) -> vec3f {
|
|
509
509
|
var geometricNormal = source.faceNormal;
|
|
510
510
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) {
|
|
511
511
|
geometricNormal = -geometricNormal;
|
|
512
512
|
}
|
|
513
513
|
var tangent: vec3f;
|
|
514
514
|
var bitangent: vec3f;
|
|
515
|
-
|
|
515
|
+
aL(geometricNormal, &tangent, &bitangent);
|
|
516
516
|
var iB = vec3f(0.0);
|
|
517
517
|
|
|
518
|
-
for (var
|
|
519
|
-
let
|
|
520
|
-
var
|
|
521
|
-
let
|
|
518
|
+
for (var ia = 0; ia < BEVEL_SAMPLES; ia++) {
|
|
519
|
+
let oY = fk(CAMERA_BEVEL_BASE + u32(ia));
|
|
520
|
+
var cA = oY.x;
|
|
521
|
+
let ox = oY.y;
|
|
522
522
|
var di = geometricNormal;
|
|
523
523
|
var fE = tangent;
|
|
524
524
|
var ek = bitangent;
|
|
525
|
-
var
|
|
526
|
-
var
|
|
527
|
-
var
|
|
528
|
-
if (
|
|
529
|
-
|
|
530
|
-
}
|
|
531
|
-
else if (
|
|
532
|
-
let
|
|
525
|
+
var ga = 0.5;
|
|
526
|
+
var hU = 0.25;
|
|
527
|
+
var gA = 0.25;
|
|
528
|
+
if (cA < 0.5) {
|
|
529
|
+
cA *= 2.0;
|
|
530
|
+
}
|
|
531
|
+
else if (cA < 0.75) {
|
|
532
|
+
let mA = di;
|
|
533
533
|
di = fE;
|
|
534
|
-
fE =
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
534
|
+
fE = mA;
|
|
535
|
+
ga = 0.25;
|
|
536
|
+
hU = 0.5;
|
|
537
|
+
cA = (cA - 0.5) * 4.0;
|
|
538
538
|
}
|
|
539
539
|
else {
|
|
540
|
-
let
|
|
540
|
+
let mA = di;
|
|
541
541
|
di = ek;
|
|
542
|
-
ek =
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
542
|
+
ek = mA;
|
|
543
|
+
ga = 0.25;
|
|
544
|
+
gA = 0.5;
|
|
545
|
+
cA = (cA - 0.75) * 4.0;
|
|
546
546
|
}
|
|
547
547
|
|
|
548
|
-
let
|
|
549
|
-
let phi = TWOPI *
|
|
550
|
-
let
|
|
548
|
+
let gQ = kp(radius, ox);
|
|
549
|
+
let phi = TWOPI * cA;
|
|
550
|
+
let qn = gQ.x *
|
|
551
551
|
(cos(phi) * fE + sin(phi) * ek);
|
|
552
552
|
var ray: Ray;
|
|
553
553
|
iw(
|
|
554
554
|
&ray,
|
|
555
|
-
source.position + di *
|
|
555
|
+
source.position + di * gQ.y + qn,
|
|
556
556
|
-di
|
|
557
557
|
);
|
|
558
558
|
var hit: ad;
|
|
559
|
-
|
|
559
|
+
iH(
|
|
560
560
|
ray,
|
|
561
561
|
&hit,
|
|
562
562
|
source.instanceIndex,
|
|
563
|
-
max(2.0 *
|
|
563
|
+
max(2.0 * gQ.y, EPS)
|
|
564
564
|
);
|
|
565
565
|
if (!hit.hit) { continue; }
|
|
566
566
|
|
|
567
|
-
let
|
|
568
|
-
let
|
|
569
|
-
let
|
|
570
|
-
var weight =
|
|
571
|
-
|
|
572
|
-
|
|
567
|
+
let kH = ga * abs(dot(di, hit.faceNormal));
|
|
568
|
+
let mw = hU * abs(dot(fE, hit.faceNormal));
|
|
569
|
+
let jU = gA * abs(dot(ek, hit.faceNormal));
|
|
570
|
+
var weight = kH / max(
|
|
571
|
+
kH * kH + mw * mw +
|
|
572
|
+
jU * jU,
|
|
573
573
|
1e-8
|
|
574
574
|
);
|
|
575
|
-
weight *=
|
|
576
|
-
max(
|
|
575
|
+
weight *= iO(radius, distance(hit.position, source.position)) /
|
|
576
|
+
max(iO(radius, gQ.x), 1e-8);
|
|
577
577
|
iB += weight * hit.vertexNormal;
|
|
578
578
|
}
|
|
579
579
|
|
|
580
580
|
if (dot(iB, iB) <= 1e-12) { return source.normal; }
|
|
581
|
-
let
|
|
582
|
-
let result = source.normal +
|
|
581
|
+
let jC = normalize(iB);
|
|
582
|
+
let result = source.normal + jC - source.vertexNormal;
|
|
583
583
|
if (dot(result, result) > 1e-12) { return normalize(result); }
|
|
584
584
|
return source.normal;
|
|
585
585
|
}
|
|
@@ -596,12 +596,12 @@ aa.scatteringIsDelta = false;
|
|
|
596
596
|
aa.isNextRefraction = false;
|
|
597
597
|
aa.abort = false;
|
|
598
598
|
|
|
599
|
-
let
|
|
599
|
+
let rB = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
|
|
600
600
|
let bounceLimit = max(rtUniform.bounces, 0);
|
|
601
601
|
var depth = 0;
|
|
602
602
|
|
|
603
603
|
for (var idx: i32 = 0; idx < min(bounceLimit * 3, ${MAX_PATH_EVENTS}); idx = idx + 1) {
|
|
604
|
-
if (
|
|
604
|
+
if (rB && idx > bounceLimit) {
|
|
605
605
|
aa.abort = true;
|
|
606
606
|
}
|
|
607
607
|
if (aa.abort) {
|
|
@@ -623,21 +623,21 @@ return bw(uv, si, ray, ma, outAux);
|
|
|
623
623
|
|
|
624
624
|
|
|
625
625
|
|
|
626
|
-
var
|
|
627
|
-
|
|
626
|
+
var nN = ray;
|
|
627
|
+
nN.o = (*si).position + ray.d * (EPS * 0.02);
|
|
628
628
|
var dU = *si;
|
|
629
629
|
dU.albedoSampled = false;
|
|
630
|
-
cY(
|
|
631
|
-
var
|
|
632
|
-
eT(&
|
|
633
|
-
var
|
|
634
|
-
if (dU.hit &&
|
|
635
|
-
|
|
636
|
-
|
|
630
|
+
cY(nN, &dU, 0, false, false);
|
|
631
|
+
var rj: J;
|
|
632
|
+
eT(&rj, dU.materialIndex, dU.uv, dU.uv1, dU.instanceIndex);
|
|
633
|
+
var gh = *outAux;
|
|
634
|
+
if (dU.hit && rj.materialType == STANDARD) {
|
|
635
|
+
gh.albedo = select(
|
|
636
|
+
rj.baseColor,
|
|
637
637
|
vec3f(1.0),
|
|
638
|
-
|
|
638
|
+
rj.transmissionWeight > 0.5
|
|
639
639
|
);
|
|
640
|
-
|
|
640
|
+
gh.normal = select(
|
|
641
641
|
dU.normal,
|
|
642
642
|
-dU.normal,
|
|
643
643
|
dot(
|
|
@@ -645,38 +645,38 @@ dU.normal,
|
|
|
645
645
|
dU.position - cameraUniform.viewInv[3].xyz
|
|
646
646
|
) > 0.0
|
|
647
647
|
);
|
|
648
|
-
dU.albedoSampled =
|
|
648
|
+
dU.albedoSampled = rj.transmissionWeight > 0.5;
|
|
649
649
|
}
|
|
650
650
|
let back = bw(
|
|
651
|
-
uv, &dU,
|
|
651
|
+
uv, &dU, nN, &rj, &gh
|
|
652
652
|
);
|
|
653
653
|
if (coverage <= 0.0) {
|
|
654
|
-
*outAux =
|
|
654
|
+
*outAux = gh;
|
|
655
655
|
return back;
|
|
656
656
|
}
|
|
657
657
|
|
|
658
|
-
var
|
|
659
|
-
var
|
|
660
|
-
|
|
661
|
-
var
|
|
662
|
-
let
|
|
663
|
-
uv, &
|
|
658
|
+
var tk = *si;
|
|
659
|
+
var uB = *ma;
|
|
660
|
+
uB.alpha = 1.0;
|
|
661
|
+
var iR = *outAux;
|
|
662
|
+
let qQ = bw(
|
|
663
|
+
uv, &tk, ray, &uB, &iR
|
|
664
664
|
);
|
|
665
|
-
(*outAux).albedo = mix(
|
|
666
|
-
let fR = mix(
|
|
665
|
+
(*outAux).albedo = mix(gh.albedo, iR.albedo, coverage);
|
|
666
|
+
let fR = mix(gh.normal, iR.normal, coverage);
|
|
667
667
|
(*outAux).normal = select(
|
|
668
668
|
vec3f(0.0),
|
|
669
669
|
normalize(fR),
|
|
670
670
|
dot(fR, fR) > 1e-12
|
|
671
671
|
);
|
|
672
|
-
(*outAux).isBlank =
|
|
673
|
-
(*outAux).isShadowCatcher =
|
|
674
|
-
return mix(back,
|
|
672
|
+
(*outAux).isBlank = gh.isBlank && iR.isBlank;
|
|
673
|
+
(*outAux).isShadowCatcher = gh.isShadowCatcher && iR.isShadowCatcher;
|
|
674
|
+
return mix(back, qQ, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
|
|
675
675
|
}
|
|
676
676
|
|
|
677
677
|
|
|
678
678
|
|
|
679
|
-
fn
|
|
679
|
+
fn mn(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
|
|
680
680
|
var si: ad;
|
|
681
681
|
var ma: J;
|
|
682
682
|
si.albedoSampled = false;
|
|
@@ -690,7 +690,7 @@ si.barycentrics = vec2f(0.0);
|
|
|
690
690
|
cY(ray, &si, 0, false, false);
|
|
691
691
|
eT(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex);
|
|
692
692
|
|
|
693
|
-
if (ma.materialType == SHADOW_CATCHER) {
|
|
693
|
+
if (si.hit && ma.materialType == SHADOW_CATCHER) {
|
|
694
694
|
(*outAux).isShadowCatcher = true;
|
|
695
695
|
|
|
696
696
|
|
|
@@ -708,7 +708,7 @@ return vec4f(vec3f(1.0), aa.alpha);
|
|
|
708
708
|
else {
|
|
709
709
|
if (HAS_BEVEL && rtUniform.bevel != 0) {
|
|
710
710
|
if (ma.bevel > 0.0) {
|
|
711
|
-
si.normal =
|
|
711
|
+
si.normal = mi(si, ma.bevel);
|
|
712
712
|
}
|
|
713
713
|
}
|
|
714
714
|
|
|
@@ -734,39 +734,39 @@ if (SPECTRAL) {
|
|
|
734
734
|
|
|
735
735
|
|
|
736
736
|
|
|
737
|
-
let
|
|
738
|
-
var
|
|
737
|
+
let sI = array<f32, 3>(650.0, 510.0, 475.0);
|
|
738
|
+
var tH = vec3f(0.0);
|
|
739
739
|
var alpha = 0.0;
|
|
740
|
-
var
|
|
741
|
-
var
|
|
742
|
-
var
|
|
740
|
+
var jz = vec3f(0.0);
|
|
741
|
+
var jA = vec3f(0.0);
|
|
742
|
+
var rX = true;
|
|
743
743
|
var si2 = si;
|
|
744
744
|
var ma2 = ma;
|
|
745
|
-
let
|
|
746
|
-
let
|
|
745
|
+
let qD = s0;
|
|
746
|
+
let nJ = em;
|
|
747
747
|
let eh = rtUniform.dispersionWavelengths == 1;
|
|
748
|
-
let
|
|
748
|
+
let jH = si.hit &&
|
|
749
749
|
ma.transmissionWeight > 0.001 &&
|
|
750
750
|
ma.transmissionDispersionScale > 0.001;
|
|
751
|
-
let
|
|
752
|
-
var
|
|
753
|
-
if (eh &&
|
|
751
|
+
let rW = select(3, 1, eh);
|
|
752
|
+
var lF = 0;
|
|
753
|
+
if (eh && jH) {
|
|
754
754
|
|
|
755
755
|
|
|
756
|
-
|
|
756
|
+
lF = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
|
|
757
757
|
}
|
|
758
|
-
for (var i = 0; i <
|
|
758
|
+
for (var i = 0; i < rW; i++) {
|
|
759
759
|
|
|
760
760
|
|
|
761
761
|
|
|
762
762
|
if (!eh) {
|
|
763
|
-
s0 =
|
|
764
|
-
em =
|
|
765
|
-
|
|
763
|
+
s0 = qD;
|
|
764
|
+
em = nJ;
|
|
765
|
+
cF = 0u;
|
|
766
766
|
}
|
|
767
767
|
si.wavelength = 0.0;
|
|
768
|
-
if (!eh ||
|
|
769
|
-
si.wavelength =
|
|
768
|
+
if (!eh || jH) {
|
|
769
|
+
si.wavelength = sI[select(i, lF, eh)];
|
|
770
770
|
ma.specularIor = eK(
|
|
771
771
|
si.wavelength,
|
|
772
772
|
ma.specularIor,
|
|
@@ -786,21 +786,21 @@ dD.isShadowCatcher = false;
|
|
|
786
786
|
let res = iz(uv, &si, ray, &ma, &dD);
|
|
787
787
|
if (eh) {
|
|
788
788
|
*outAux = dD;
|
|
789
|
-
let scale = select(1.0, 3.0,
|
|
789
|
+
let scale = select(1.0, 3.0, jH);
|
|
790
790
|
return vec4f(res.rgb * scale, res.a);
|
|
791
791
|
}
|
|
792
|
-
|
|
792
|
+
tH += res.rgb;
|
|
793
793
|
alpha = max(alpha, res.a);
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
794
|
+
jz += dD.albedo;
|
|
795
|
+
jA += dD.normal;
|
|
796
|
+
rX = rX && dD.isBlank;
|
|
797
797
|
si = si2;
|
|
798
798
|
ma = ma2;
|
|
799
799
|
}
|
|
800
|
-
(*outAux).albedo =
|
|
801
|
-
(*outAux).normal =
|
|
802
|
-
(*outAux).isBlank =
|
|
803
|
-
return vec4f(
|
|
800
|
+
(*outAux).albedo = jz / 3.0;
|
|
801
|
+
(*outAux).normal = jA / 3.0;
|
|
802
|
+
(*outAux).isBlank = rX;
|
|
803
|
+
return vec4f(tH, alpha);
|
|
804
804
|
}
|
|
805
805
|
else {
|
|
806
806
|
return iz(uv, &si, ray, &ma, outAux);
|
|
@@ -808,7 +808,7 @@ return iz(uv, &si, ray, &ma, outAux);
|
|
|
808
808
|
}
|
|
809
809
|
}
|
|
810
810
|
|
|
811
|
-
fn
|
|
811
|
+
fn oC(ip: vec2f) -> vec2f {
|
|
812
812
|
let p = 2.0 * ip - 1.0;
|
|
813
813
|
let greater = abs(p.x) > abs(p.y);
|
|
814
814
|
let r = select(p.y, p.x, greater);
|
|
@@ -847,21 +847,21 @@ let uv = (vec2<f32>(f32(fD.x), f32(fD.y)) + vec2f(0.5)) / outputSize;
|
|
|
847
847
|
|
|
848
848
|
bc = fD;
|
|
849
849
|
bd = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
|
|
850
|
-
|
|
850
|
+
cF = 0u; em = 0u;
|
|
851
851
|
if (SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1) {
|
|
852
852
|
jitter = (fk(CAMERA_PIXEL) - 0.5) / outputSize;
|
|
853
853
|
}
|
|
854
|
-
|
|
855
|
-
var cam =
|
|
854
|
+
ka(fD, i32(bd ^ eg(rtUniform.sequenceSeed)));
|
|
855
|
+
var cam = hy(uv + jitter);
|
|
856
856
|
|
|
857
857
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
858
858
|
|
|
859
859
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
860
|
-
let
|
|
861
|
-
let
|
|
862
|
-
let
|
|
863
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
864
|
-
let dir = normalize(
|
|
860
|
+
let nY = -normalize(cameraUniform.viewInv[2].xyz);
|
|
861
|
+
let qq = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, nY));
|
|
862
|
+
let rC = cameraUniform.apertureRadius * oC(fk(CAMERA_LENS));
|
|
863
|
+
let origin = (cameraUniform.viewInv * vec4f(rC, 0.0, 1.0)).xyz;
|
|
864
|
+
let dir = normalize(qq - origin);
|
|
865
865
|
iw(&cam, origin, dir);
|
|
866
866
|
}
|
|
867
867
|
|
|
@@ -870,43 +870,52 @@ outAux.albedo = vec3f(0.0);
|
|
|
870
870
|
outAux.normal = vec3f(0.0);
|
|
871
871
|
outAux.isBlank = false;
|
|
872
872
|
outAux.isShadowCatcher = false;
|
|
873
|
-
var
|
|
873
|
+
var aF = mn(uv + jitter, cam, &outAux);
|
|
874
874
|
|
|
875
875
|
|
|
876
876
|
|
|
877
877
|
if (rtUniform.clamping > 0.0) {
|
|
878
878
|
let clamping = rtUniform.clamping;
|
|
879
|
-
|
|
879
|
+
aF = vec4(clamp(aF.rgb, -vec3f(clamping), vec3f(clamping)), aF.a);
|
|
880
880
|
}
|
|
881
|
-
if (!(
|
|
882
|
-
|
|
881
|
+
if (!(aF.x < INF && aF.x > -EPS)) {
|
|
882
|
+
aF = vec4f(0.0, 0.0, 0.0, 1.0);
|
|
883
883
|
}
|
|
884
884
|
|
|
885
885
|
if (outAux.isShadowCatcher) {
|
|
886
886
|
|
|
887
887
|
|
|
888
|
-
let dn =
|
|
889
|
-
let
|
|
890
|
-
let
|
|
888
|
+
let dn = hD(cam);
|
|
889
|
+
let pY = select(0.0, 1.0, dn.a >= 0.01);
|
|
890
|
+
let jq = vec4f(dn.rgb * dn.a, dn.a);
|
|
891
891
|
|
|
892
892
|
|
|
893
|
-
outShadowCatcher[idx].mask += vec4f(1.0, dn.a,
|
|
894
|
-
outShadowCatcher[idx].background +=
|
|
895
|
-
outColor[idx] +=
|
|
896
|
-
outAlbedo[idx] += vec4f(outAux.albedo,
|
|
897
|
-
|
|
893
|
+
outShadowCatcher[idx].mask += vec4f(1.0, dn.a, pY, aF.a);
|
|
894
|
+
outShadowCatcher[idx].background += jq;
|
|
895
|
+
outColor[idx] += jq;
|
|
896
|
+
outAlbedo[idx] += vec4f(outAux.albedo, pY);
|
|
897
|
+
hG(idx, dn.rgb, outAux.normal);
|
|
898
898
|
|
|
899
899
|
|
|
900
|
-
let visibility = 1.0 -
|
|
901
|
-
|
|
900
|
+
let visibility = 1.0 - aF.a;
|
|
901
|
+
iN(idx, visibility * select(
|
|
902
902
|
1.0, dot(dn.rgb, luminance), dn.a >= 0.01
|
|
903
903
|
));
|
|
904
904
|
}
|
|
905
905
|
else {
|
|
906
|
-
|
|
906
|
+
if (HAS_SHADOW_CATCHER && outAux.isBlank && USE_BACKGROUND && !USE_BACKGROUND_MAP && rtUniform.backgroundColor.a >= 0.99999) {
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
|
|
912
|
+
outShadowCatcher[idx].background += aF;
|
|
913
|
+
outShadowCatcher[idx].mask.g += aF.a;
|
|
914
|
+
}
|
|
915
|
+
outColor[idx] += aF;
|
|
907
916
|
outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
|
|
908
|
-
|
|
909
|
-
|
|
917
|
+
hG(idx, aF.rgb, outAux.normal);
|
|
918
|
+
iN(idx, dot(aF.rgb, luminance));
|
|
910
919
|
}
|
|
911
920
|
}
|
|
912
921
|
`;
|