@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
|
@@ -32,7 +32,7 @@ return;
|
|
|
32
32
|
// So here the code are injected separately.
|
|
33
33
|
const bounceCodeOnIntelMac = glsl `
|
|
34
34
|
|
|
35
|
-
for(int
|
|
35
|
+
for(int vN = 0; vN < BOUNCES; vN++) {{
|
|
36
36
|
if (aa.abort) {
|
|
37
37
|
return vec4(aa.li, aa.alpha);
|
|
38
38
|
}
|
|
@@ -40,10 +40,10 @@ bounce(aa, depth, si, mat, outAux);
|
|
|
40
40
|
}}
|
|
41
41
|
`;
|
|
42
42
|
const bounceCodeOnOther = glsl `
|
|
43
|
-
bool
|
|
44
|
-
int
|
|
43
|
+
bool uY = !si.isTransparency;
|
|
44
|
+
int qF = min(BOUNCES, bounceLimit);
|
|
45
45
|
for(int idx = 0; idx < min(BOUNCES * 3, ${MAX_PATH_EVENTS}); idx++) {
|
|
46
|
-
if (
|
|
46
|
+
if (uY && idx > qF) {
|
|
47
47
|
aa.abort = true;
|
|
48
48
|
}
|
|
49
49
|
if (aa.abort) {
|
|
@@ -93,7 +93,7 @@ ${envMap.main}
|
|
|
93
93
|
${samplingGlsl}
|
|
94
94
|
${openPbrBsdfGlsl}
|
|
95
95
|
|
|
96
|
-
float
|
|
96
|
+
float mk;
|
|
97
97
|
float bf;
|
|
98
98
|
|
|
99
99
|
${sampleLightGlsl}
|
|
@@ -110,7 +110,7 @@ bool isShadowCatcher;
|
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
void bounce(inout Path aa, inout int depth, inout ad si, inout J mat, inout RayTraceAuxiliary outAux) {
|
|
113
|
-
|
|
113
|
+
cF = uint(max(depth, 0));
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
|
|
@@ -135,26 +135,26 @@ if (aa.isNextRefraction) {
|
|
|
135
135
|
|
|
136
136
|
|
|
137
137
|
|
|
138
|
-
vec4 bg =
|
|
138
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
139
139
|
bg.rgb = ai(bg.rgb, bf);
|
|
140
140
|
float cT = aa.scatteringIsDelta ? 1.0
|
|
141
|
-
:
|
|
141
|
+
: aG(aa.scatteringPdf,
|
|
142
142
|
iv(aS(aa.ray.d)) * envLightSelectionPmf);
|
|
143
143
|
aa.li += cT * aa.beta * bg.rgb * bg.a;
|
|
144
144
|
aa.alpha = max(aa.alpha, bg.a);
|
|
145
145
|
}
|
|
146
146
|
else {
|
|
147
|
-
vec2
|
|
148
|
-
vec3 emission = textureLinear(envMap,
|
|
147
|
+
vec2 tJ = aS(aa.ray.d);
|
|
148
|
+
vec3 emission = textureLinear(envMap, tJ).rgb;
|
|
149
149
|
emission = ai(emission, bf);
|
|
150
150
|
aa.li += aa.beta * emission *
|
|
151
|
-
|
|
151
|
+
aG(
|
|
152
152
|
aa.scatteringPdf,
|
|
153
|
-
iv(
|
|
153
|
+
iv(tJ) * envLightSelectionPmf
|
|
154
154
|
);
|
|
155
155
|
}
|
|
156
156
|
#else
|
|
157
|
-
vec4 bg =
|
|
157
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
158
158
|
bg.rgb = ai(bg.rgb, bf);
|
|
159
159
|
aa.li += aa.beta * bg.rgb * bg.a;
|
|
160
160
|
#endif
|
|
@@ -165,7 +165,7 @@ return;
|
|
|
165
165
|
|
|
166
166
|
if (!si.hit) {
|
|
167
167
|
|
|
168
|
-
vec4 bg =
|
|
168
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
|
|
@@ -177,10 +177,10 @@ aa.alpha = bg.a;
|
|
|
177
177
|
outAux.isBlank = bg.a < 0.01;
|
|
178
178
|
}
|
|
179
179
|
else {
|
|
180
|
-
Ray cam =
|
|
181
|
-
bool
|
|
180
|
+
Ray cam = hy(v_Texcoord + rS());
|
|
181
|
+
bool mC = dot(cam.d, aa.ray.d) > 0.0;
|
|
182
182
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
183
|
-
if (
|
|
183
|
+
if (mC) {
|
|
184
184
|
aa.alpha = max(aa.alpha, bg.a);
|
|
185
185
|
} else {
|
|
186
186
|
aa.alpha = 1.0;
|
|
@@ -188,8 +188,8 @@ aa.alpha = 1.0;
|
|
|
188
188
|
}
|
|
189
189
|
#if !defined(USE_ENVMAP)
|
|
190
190
|
|
|
191
|
-
if (
|
|
192
|
-
aa.li = aa.beta *
|
|
191
|
+
if (mC) {
|
|
192
|
+
aa.li = aa.beta * aG(aa.scatteringPdf, 1.0) * bg.rgb;
|
|
193
193
|
}
|
|
194
194
|
#endif
|
|
195
195
|
}
|
|
@@ -197,7 +197,7 @@ aa.abort = true;
|
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
bool
|
|
200
|
+
bool cH = false;
|
|
201
201
|
if ((mat.materialType == STANDARD || mat.materialType == UNLIT)) {
|
|
202
202
|
if (transmissiveOutputAlphaMin < 1.0) {
|
|
203
203
|
|
|
@@ -210,18 +210,18 @@ if (alpha < 1.0) {
|
|
|
210
210
|
|
|
211
211
|
aa.alpha = max(aa.alpha, alpha);
|
|
212
212
|
if (eo(3u) > alpha) {
|
|
213
|
-
|
|
213
|
+
cH = true;
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
-
if (!
|
|
217
|
-
|
|
216
|
+
if (!cH) {
|
|
217
|
+
lR(si, mat, aa);
|
|
218
218
|
}
|
|
219
219
|
else {
|
|
220
220
|
aa.ray.o = si.position + aa.ray.d * EPS;
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
if (!si.albedoSampled && !
|
|
224
|
+
if (!si.albedoSampled && !cH) {
|
|
225
225
|
|
|
226
226
|
if ((mat.materialType == STANDARD || mat.materialType == UNLIT) &&
|
|
227
227
|
!(mat.transmissionWeight > 0.5 ||
|
|
@@ -243,11 +243,11 @@ si.albedoSampled = true;
|
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
#ifdef USE_RR
|
|
246
|
-
if (depth >= RR_MAX && !
|
|
246
|
+
if (depth >= RR_MAX && !cH) {
|
|
247
247
|
|
|
248
|
-
float
|
|
249
|
-
float q = max(0.0, 1.0 -
|
|
250
|
-
if (dz(
|
|
248
|
+
float oo = max(max(aa.beta.x, aa.beta.y), aa.beta.z);
|
|
249
|
+
float q = max(0.0, 1.0 - oo);
|
|
250
|
+
if (dz(cw(RUSSIAN_ROULETTE)) < q) {
|
|
251
251
|
|
|
252
252
|
|
|
253
253
|
aa.alpha = 1.0;
|
|
@@ -272,7 +272,7 @@ si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.0
|
|
|
272
272
|
|
|
273
273
|
|
|
274
274
|
if (dispersionWavelengths == 1 && si.hit && mat.transmissionWeight > 0.001 && mat.transmissionDispersionScale > 0.001) {
|
|
275
|
-
bf =
|
|
275
|
+
bf = mk;
|
|
276
276
|
}
|
|
277
277
|
if (mat.transmissionWeight > 0.001 && bf > 0.0) {
|
|
278
278
|
mat.specularIor = eK(
|
|
@@ -283,7 +283,7 @@ mat.dispersionAbbeNumber
|
|
|
283
283
|
);
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
-
if (
|
|
286
|
+
if (cH) {
|
|
287
287
|
return;
|
|
288
288
|
}
|
|
289
289
|
|
|
@@ -293,12 +293,12 @@ bool hu = eo(3u) < mat.alpha;
|
|
|
293
293
|
LightSampleRec lightSample;
|
|
294
294
|
for (int i = 0; i < NUM_LIGHTS; i++) {
|
|
295
295
|
|
|
296
|
-
Light light =
|
|
297
|
-
float d =
|
|
298
|
-
bool
|
|
299
|
-
if (d != INF && !(
|
|
296
|
+
Light light = qp(i);
|
|
297
|
+
float d = mo(aa.ray, light, lightSample);
|
|
298
|
+
bool mt = si.hit && d > distance(si.position, aa.ray.o);
|
|
299
|
+
if (d != INF && !(mt && hu)) {
|
|
300
300
|
lightSample.pdf *= light.selectionPmf;
|
|
301
|
-
float eW =
|
|
301
|
+
float eW = aG(aa.scatteringPdf, lightSample.pdf);
|
|
302
302
|
lightSample.emission = ai(lightSample.emission, bf);
|
|
303
303
|
aa.li += eW * aa.beta * lightSample.emission;
|
|
304
304
|
|
|
@@ -313,10 +313,10 @@ if (!(si.hit && hu)) {
|
|
|
313
313
|
if (aa.isNextRefraction) {
|
|
314
314
|
|
|
315
315
|
|
|
316
|
-
vec4 bg =
|
|
316
|
+
vec4 bg = cx(aa.ray.o, aa.ray.d);
|
|
317
317
|
bg.rgb = ai(bg.rgb, bf);
|
|
318
318
|
float cT = aa.scatteringIsDelta ? 1.0
|
|
319
|
-
:
|
|
319
|
+
: aG(aa.scatteringPdf,
|
|
320
320
|
iv(aS(aa.ray.d)) * envLightSelectionPmf);
|
|
321
321
|
aa.li += cT * aa.beta * bg.rgb * bg.a;
|
|
322
322
|
aa.alpha = max(aa.alpha, bg.a);
|
|
@@ -325,7 +325,7 @@ return;
|
|
|
325
325
|
}
|
|
326
326
|
vec2 uv = aS(aa.ray.d);
|
|
327
327
|
vec3 emission = textureLinear(envMap, uv).rgb;
|
|
328
|
-
float eW =
|
|
328
|
+
float eW = aG(
|
|
329
329
|
aa.scatteringPdf,
|
|
330
330
|
iv(uv) * envLightSelectionPmf
|
|
331
331
|
);
|
|
@@ -345,105 +345,105 @@ depth++;
|
|
|
345
345
|
}
|
|
346
346
|
|
|
347
347
|
|
|
348
|
-
vec2
|
|
348
|
+
vec2 kp(float radius, float xi) {
|
|
349
349
|
float x = 0.25;
|
|
350
|
-
for (int
|
|
350
|
+
for (int ns = 0; ns < 10; ns++) {
|
|
351
351
|
float x2 = x * x;
|
|
352
352
|
float x3 = x2 * x;
|
|
353
|
-
float
|
|
353
|
+
float kG = 1.0 - x;
|
|
354
354
|
float value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
|
|
355
355
|
4.0 * x2 * x3 - xi;
|
|
356
|
-
float
|
|
357
|
-
if (abs(value) < 1e-6 ||
|
|
358
|
-
x = clamp(x - value /
|
|
356
|
+
float lY = 20.0 * x * kG * kG * kG;
|
|
357
|
+
if (abs(value) < 1e-6 || lY == 0.0) break;
|
|
358
|
+
x = clamp(x - value / lY, 0.0, 1.0);
|
|
359
359
|
}
|
|
360
|
-
float
|
|
360
|
+
float jj = x * radius;
|
|
361
361
|
return vec2(
|
|
362
|
-
|
|
363
|
-
sqrt(max(radius * radius -
|
|
362
|
+
jj,
|
|
363
|
+
sqrt(max(radius * radius - jj * jj, 0.0))
|
|
364
364
|
);
|
|
365
365
|
}
|
|
366
366
|
|
|
367
|
-
float
|
|
368
|
-
if (
|
|
369
|
-
float
|
|
370
|
-
return
|
|
367
|
+
float iO(float radius, float gs) {
|
|
368
|
+
if (gs >= radius) return 0.0;
|
|
369
|
+
float nV = radius - gs;
|
|
370
|
+
return nV * nV * nV;
|
|
371
371
|
}
|
|
372
372
|
|
|
373
373
|
|
|
374
|
-
vec3
|
|
374
|
+
vec3 mi(ad source, float radius) {
|
|
375
375
|
vec3 geometricNormal = source.faceNormal;
|
|
376
376
|
if (dot(geometricNormal, source.vertexNormal) < 0.0) geometricNormal = -geometricNormal;
|
|
377
377
|
vec3 tangent;
|
|
378
378
|
vec3 bitangent;
|
|
379
|
-
|
|
379
|
+
aL(geometricNormal, tangent, bitangent);
|
|
380
380
|
vec3 iB = vec3(0.0);
|
|
381
381
|
|
|
382
|
-
for (int
|
|
383
|
-
vec2
|
|
384
|
-
float
|
|
385
|
-
float
|
|
382
|
+
for (int ia = 0; ia < BEVEL_SAMPLES; ia++) {
|
|
383
|
+
vec2 oY = fk(CAMERA_BEVEL_BASE + uint(ia));
|
|
384
|
+
float cA = oY.x;
|
|
385
|
+
float ox = oY.y;
|
|
386
386
|
vec3 di = geometricNormal;
|
|
387
387
|
vec3 fE = tangent;
|
|
388
388
|
vec3 ek = bitangent;
|
|
389
|
-
float
|
|
390
|
-
float
|
|
391
|
-
float
|
|
392
|
-
if (
|
|
393
|
-
|
|
394
|
-
}
|
|
395
|
-
else if (
|
|
396
|
-
vec3
|
|
389
|
+
float ga = 0.5;
|
|
390
|
+
float hU = 0.25;
|
|
391
|
+
float gA = 0.25;
|
|
392
|
+
if (cA < 0.5) {
|
|
393
|
+
cA *= 2.0;
|
|
394
|
+
}
|
|
395
|
+
else if (cA < 0.75) {
|
|
396
|
+
vec3 mA = di;
|
|
397
397
|
di = fE;
|
|
398
|
-
fE =
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
398
|
+
fE = mA;
|
|
399
|
+
ga = 0.25;
|
|
400
|
+
hU = 0.5;
|
|
401
|
+
cA = (cA - 0.5) * 4.0;
|
|
402
402
|
}
|
|
403
403
|
else {
|
|
404
|
-
vec3
|
|
404
|
+
vec3 mA = di;
|
|
405
405
|
di = ek;
|
|
406
|
-
ek =
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
406
|
+
ek = mA;
|
|
407
|
+
ga = 0.25;
|
|
408
|
+
gA = 0.5;
|
|
409
|
+
cA = (cA - 0.75) * 4.0;
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
-
vec2
|
|
413
|
-
float phi = TWOPI *
|
|
414
|
-
vec3
|
|
412
|
+
vec2 gQ = kp(radius, ox);
|
|
413
|
+
float phi = TWOPI * cA;
|
|
414
|
+
vec3 qn = gQ.x *
|
|
415
415
|
(cos(phi) * fE + sin(phi) * ek);
|
|
416
416
|
Ray ray;
|
|
417
417
|
iw(
|
|
418
418
|
ray,
|
|
419
|
-
source.position + di *
|
|
419
|
+
source.position + di * gQ.y + qn,
|
|
420
420
|
-di
|
|
421
421
|
);
|
|
422
422
|
ad hit;
|
|
423
|
-
|
|
423
|
+
iH(
|
|
424
424
|
ray,
|
|
425
425
|
hit,
|
|
426
426
|
source.instanceIndex,
|
|
427
|
-
max(2.0 *
|
|
427
|
+
max(2.0 * gQ.y, EPS)
|
|
428
428
|
);
|
|
429
429
|
if (!hit.hit) continue;
|
|
430
430
|
|
|
431
|
-
float
|
|
432
|
-
float
|
|
433
|
-
float
|
|
434
|
-
float weight =
|
|
435
|
-
|
|
436
|
-
|
|
431
|
+
float kH = ga * abs(dot(di, hit.faceNormal));
|
|
432
|
+
float mw = hU * abs(dot(fE, hit.faceNormal));
|
|
433
|
+
float jU = gA * abs(dot(ek, hit.faceNormal));
|
|
434
|
+
float weight = kH / max(
|
|
435
|
+
kH * kH + mw * mw +
|
|
436
|
+
jU * jU,
|
|
437
437
|
1e-8
|
|
438
438
|
);
|
|
439
|
-
weight *=
|
|
440
|
-
max(
|
|
439
|
+
weight *= iO(radius, distance(hit.position, source.position)) /
|
|
440
|
+
max(iO(radius, gQ.x), 1e-8);
|
|
441
441
|
iB += weight * hit.vertexNormal;
|
|
442
442
|
}
|
|
443
443
|
|
|
444
444
|
if (dot(iB, iB) <= 1e-12) return source.normal;
|
|
445
|
-
vec3
|
|
446
|
-
vec3 result = source.normal +
|
|
445
|
+
vec3 jC = normalize(iB);
|
|
446
|
+
vec3 result = source.normal + jC - source.vertexNormal;
|
|
447
447
|
return dot(result, result) > 1e-12 ? normalize(result) : source.normal;
|
|
448
448
|
}
|
|
449
449
|
|
|
@@ -473,49 +473,49 @@ return bw(si, ray, mat, outAux);
|
|
|
473
473
|
|
|
474
474
|
|
|
475
475
|
|
|
476
|
-
Ray
|
|
477
|
-
|
|
476
|
+
Ray nN = ray;
|
|
477
|
+
nN.o = si.position + ray.d * (EPS * 0.02);
|
|
478
478
|
ad dU = si;
|
|
479
479
|
dU.albedoSampled = false;
|
|
480
|
-
cY(
|
|
481
|
-
J
|
|
482
|
-
eT(
|
|
483
|
-
RayTraceAuxiliary
|
|
484
|
-
if (dU.hit && (
|
|
485
|
-
|
|
480
|
+
cY(nN, dU, false);
|
|
481
|
+
J nM;
|
|
482
|
+
eT(nM, dU.materialIndex, dU.uv, dU.uv1, dU.instanceIndex);
|
|
483
|
+
RayTraceAuxiliary gh = outAux;
|
|
484
|
+
if (dU.hit && (nM.materialType == STANDARD || nM.materialType == UNLIT)) {
|
|
485
|
+
gh.albedo = nM.transmissionWeight > 0.5
|
|
486
486
|
? vec3(1.0)
|
|
487
|
-
:
|
|
488
|
-
|
|
487
|
+
: nM.baseColor;
|
|
488
|
+
gh.normal = dot(
|
|
489
489
|
dU.normal,
|
|
490
490
|
dU.position - vec3(viewInv[3])
|
|
491
491
|
) > 0.0
|
|
492
492
|
? -dU.normal
|
|
493
493
|
: dU.normal;
|
|
494
|
-
dU.albedoSampled =
|
|
494
|
+
dU.albedoSampled = nM.transmissionWeight > 0.5;
|
|
495
495
|
}
|
|
496
|
-
vec4 back = bw(dU,
|
|
496
|
+
vec4 back = bw(dU, nN, nM, gh);
|
|
497
497
|
if (coverage <= 0.0) {
|
|
498
|
-
outAux =
|
|
498
|
+
outAux = gh;
|
|
499
499
|
return back;
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
ad
|
|
503
|
-
J
|
|
504
|
-
|
|
505
|
-
RayTraceAuxiliary
|
|
506
|
-
vec4
|
|
507
|
-
outAux.albedo = mix(
|
|
508
|
-
vec3 fR = mix(
|
|
502
|
+
ad tk = si;
|
|
503
|
+
J tK = mat;
|
|
504
|
+
tK.alpha = 1.0;
|
|
505
|
+
RayTraceAuxiliary iR = outAux;
|
|
506
|
+
vec4 qQ = bw(tk, ray, tK, iR);
|
|
507
|
+
outAux.albedo = mix(gh.albedo, iR.albedo, coverage);
|
|
508
|
+
vec3 fR = mix(gh.normal, iR.normal, coverage);
|
|
509
509
|
outAux.normal = dot(fR, fR) > 1e-12
|
|
510
510
|
? normalize(fR)
|
|
511
511
|
: vec3(0.0);
|
|
512
|
-
outAux.isBlank =
|
|
513
|
-
return mix(back,
|
|
512
|
+
outAux.isBlank = gh.isBlank && iR.isBlank;
|
|
513
|
+
return mix(back, qQ, coverage);
|
|
514
514
|
}
|
|
515
515
|
|
|
516
516
|
|
|
517
517
|
|
|
518
|
-
vec4
|
|
518
|
+
vec4 mn(Ray ray, out RayTraceAuxiliary outAux) {
|
|
519
519
|
|
|
520
520
|
ad si;
|
|
521
521
|
J mat;
|
|
@@ -534,7 +534,7 @@ si.isTransparency = mat.transmissionWeight > 0.001 || mat.subsurfaceWeight > 0.0
|
|
|
534
534
|
|
|
535
535
|
#ifdef HAS_BEVEL
|
|
536
536
|
if (bevelEnabled && mat.bevel > 0.0) {
|
|
537
|
-
si.normal =
|
|
537
|
+
si.normal = mi(si, mat.bevel);
|
|
538
538
|
}
|
|
539
539
|
#endif
|
|
540
540
|
|
|
@@ -563,20 +563,20 @@ return iz(si, ray, mat, outAux);
|
|
|
563
563
|
|
|
564
564
|
void main() {
|
|
565
565
|
|
|
566
|
-
|
|
567
|
-
|
|
566
|
+
sk();
|
|
567
|
+
ka(v_Texcoord * viewportSize, int(uint(sampleCount) ^ eg(uint(sequenceSeed))));
|
|
568
568
|
|
|
569
569
|
|
|
570
570
|
bf = dispersionWavelengths == 1 ? 0.0 : wavelength;
|
|
571
|
-
|
|
571
|
+
mk = wavelength;
|
|
572
572
|
if (dispersionWavelengths == 1 && wavelength > 0.0) {
|
|
573
573
|
float channel = floor(dz(CAMERA_WAVELENGTH) * 3.0);
|
|
574
|
-
|
|
574
|
+
mk = channel < 1.0 ? 650.0 : channel < 2.0 ? 510.0 : 475.0;
|
|
575
575
|
}
|
|
576
576
|
|
|
577
577
|
|
|
578
578
|
|
|
579
|
-
Ray cam =
|
|
579
|
+
Ray cam = nC();
|
|
580
580
|
|
|
581
581
|
RayTraceAuxiliary outAux;
|
|
582
582
|
outAux.albedo = vec3(0.0);
|
|
@@ -584,38 +584,38 @@ outAux.normal = vec3(0.0);
|
|
|
584
584
|
outAux.isBlank = false;
|
|
585
585
|
outAux.isShadowCatcher = false;
|
|
586
586
|
|
|
587
|
-
vec4
|
|
587
|
+
vec4 aF = mn(cam, outAux);
|
|
588
588
|
|
|
589
589
|
|
|
590
590
|
|
|
591
591
|
#ifdef CLAMPING
|
|
592
592
|
float clamping = float(CLAMPING);
|
|
593
|
-
|
|
593
|
+
aF.rgb = clamp(aF.rgb, -clamping, clamping);
|
|
594
594
|
#endif
|
|
595
595
|
|
|
596
596
|
|
|
597
597
|
if (bf > 0.0) {
|
|
598
598
|
|
|
599
|
-
|
|
599
|
+
aF.rgb *= 3.0;
|
|
600
600
|
if (dispersionWavelengths != 1) {
|
|
601
601
|
|
|
602
602
|
|
|
603
|
-
|
|
603
|
+
aF.a /= 3.0;
|
|
604
604
|
}
|
|
605
605
|
}
|
|
606
|
-
if (!(
|
|
607
|
-
|
|
606
|
+
if (!(aF.x < INF && aF.x > -EPS)) {
|
|
607
|
+
aF = vec4(0, 0, 0, 1);
|
|
608
608
|
}
|
|
609
609
|
|
|
610
|
-
out_color =
|
|
610
|
+
out_color = aF;
|
|
611
611
|
out_albedo = vec4(outAux.albedo, outAux.isBlank ? 0.0 : 1.0);
|
|
612
612
|
out_normal = vec4(outAux.normal, 1.0);
|
|
613
613
|
|
|
614
614
|
|
|
615
|
-
float
|
|
615
|
+
float jl = dot(aF.rgb, vec3(0.2126, 0.7152, 0.0722));
|
|
616
616
|
out_moments = outAux.isShadowCatcher
|
|
617
617
|
? vec4(0.0)
|
|
618
|
-
: vec4(
|
|
618
|
+
: vec4(jl, jl * jl, 1.0, 0.0);
|
|
619
619
|
|
|
620
620
|
}`
|
|
621
621
|
});
|
|
@@ -52,7 +52,7 @@ ${cameraRayGlsl}
|
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
vec4
|
|
55
|
+
vec4 mn(inout Ray ray, out vec4 background) {
|
|
56
56
|
background = vec4(0.0);
|
|
57
57
|
Path aa;
|
|
58
58
|
aa.ray = ray;
|
|
@@ -81,7 +81,7 @@ if (mat.materialType != SHADOW_CATCHER) {
|
|
|
81
81
|
return vec4(0.0, 0.0, 0.0, 1.0);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
vec4 bg =
|
|
84
|
+
vec4 bg = cx(ray.o, ray.d);
|
|
85
85
|
background = vec4(bg.rgb * bg.a, bg.a);
|
|
86
86
|
if (!aa.abort) {
|
|
87
87
|
sampleShadowCatcher(si, 0, aa);
|
|
@@ -90,28 +90,28 @@ return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, aa.alpha);
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
void main() {
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
sk();
|
|
94
|
+
ka(v_Texcoord * viewportSize, int(uint(sampleCount) ^ eg(uint(sequenceSeed))));
|
|
95
95
|
|
|
96
96
|
if (dispersionWavelengths == 1 && wavelength > 0.0) { dz(CAMERA_WAVELENGTH); }
|
|
97
|
-
Ray cam =
|
|
97
|
+
Ray cam = nC();
|
|
98
98
|
vec4 background;
|
|
99
|
-
vec4
|
|
99
|
+
vec4 aF = mn(cam, background);
|
|
100
100
|
|
|
101
|
-
if (!(
|
|
102
|
-
|
|
101
|
+
if (!(aF.x < INF && aF.x > -EPS)) {
|
|
102
|
+
aF = vec4(0, 0, 0, 1);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
out_shadowCatcher =
|
|
105
|
+
out_shadowCatcher = aF;
|
|
106
106
|
out_catcherBackground = background;
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
float
|
|
110
|
+
float jl = aF.a * (background.a >= 0.01
|
|
111
111
|
? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))
|
|
112
112
|
: 1.0);
|
|
113
|
-
out_catcherMoments =
|
|
114
|
-
? vec4(
|
|
113
|
+
out_catcherMoments = aF.r > 0.0
|
|
114
|
+
? vec4(jl, jl * jl, 1.0, 0.0)
|
|
115
115
|
: vec4(0.0);
|
|
116
116
|
|
|
117
117
|
}`
|