@meimu/mutracer 0.1.4 → 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 +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- 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/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -104,7 +104,7 @@ fn F(sl: i32, row: i32) -> f32 {
|
|
|
104
104
|
return textureLoad(openPbrEnergyLut, vec2i(sl, row), 0).r;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
fn
|
|
107
|
+
fn ge(
|
|
108
108
|
dJ: f32,
|
|
109
109
|
bR: f32,
|
|
110
110
|
hR: f32
|
|
@@ -141,7 +141,7 @@ kE
|
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
fn
|
|
144
|
+
fn gG(dJ: f32, bR: f32) -> f32 {
|
|
145
145
|
let bA = clamp(dJ, 0.0, 31.0);
|
|
146
146
|
let aH = clamp(bR, 0.0, 31.0);
|
|
147
147
|
let dQ = i32(floor(bA));
|
|
@@ -286,7 +286,7 @@ ior: f32,
|
|
|
286
286
|
alpha: f32,
|
|
287
287
|
au: f32
|
|
288
288
|
) -> f32 {
|
|
289
|
-
let value =
|
|
289
|
+
let value = ge(
|
|
290
290
|
aC(ior),
|
|
291
291
|
sqrt(alpha) * 31.0,
|
|
292
292
|
au * 31.0
|
|
@@ -295,7 +295,7 @@ return aX(value, ior);
|
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
fn cr(ior: f32, alpha: f32) -> f32 {
|
|
298
|
-
let value =
|
|
298
|
+
let value = gG(
|
|
299
299
|
aC(ior),
|
|
300
300
|
sqrt(alpha) * 31.0
|
|
301
301
|
);
|
|
@@ -357,7 +357,7 @@ return (ak * L - av * S)
|
|
|
357
357
|
/ (av * S + ak * L);
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
fn
|
|
360
|
+
fn hd(
|
|
361
361
|
av: f32,
|
|
362
362
|
ak: f32,
|
|
363
363
|
L: f32,
|
|
@@ -367,7 +367,7 @@ return 2.0 * av * L
|
|
|
367
367
|
/ (av * L + ak * S);
|
|
368
368
|
}
|
|
369
369
|
|
|
370
|
-
fn
|
|
370
|
+
fn hc(
|
|
371
371
|
av: f32,
|
|
372
372
|
ak: f32,
|
|
373
373
|
L: f32,
|
|
@@ -390,9 +390,9 @@ return vec2f(
|
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
fn hX(value: vec2f) -> vec2f {
|
|
393
|
-
let
|
|
394
|
-
let sP = sqrt(max(0.0, 0.5 * (
|
|
395
|
-
let ff = sqrt(max(0.0, 0.5 * (
|
|
393
|
+
let nJ = length(value);
|
|
394
|
+
let sP = sqrt(max(0.0, 0.5 * (nJ + value.x)));
|
|
395
|
+
let ff = sqrt(max(0.0, 0.5 * (nJ - value.x)));
|
|
396
396
|
return vec2f(sP, select(-ff, ff, value.y >= 0.0));
|
|
397
397
|
}
|
|
398
398
|
|
|
@@ -402,9 +402,9 @@ av: f32,
|
|
|
402
402
|
ak: vec2f,
|
|
403
403
|
qG: bool
|
|
404
404
|
) -> vec2f {
|
|
405
|
-
let
|
|
405
|
+
let oq = sqrt(max(0.0, 1.0 - L * L));
|
|
406
406
|
let sA = aZ(vec2f(av, 0.0), ak);
|
|
407
|
-
let hA = sA *
|
|
407
|
+
let hA = sA * oq;
|
|
408
408
|
var S = hX(
|
|
409
409
|
vec2f(1.0, 0.0) - aU(hA, hA)
|
|
410
410
|
);
|
|
@@ -412,7 +412,7 @@ if (aU(ak, S).y < 0.0) {
|
|
|
412
412
|
S = -S;
|
|
413
413
|
}
|
|
414
414
|
|
|
415
|
-
let
|
|
415
|
+
let fL = vec2f(av * L, 0.0);
|
|
416
416
|
let eB = aU(ak, S);
|
|
417
417
|
if (qG) {
|
|
418
418
|
let ci = ak * L;
|
|
@@ -423,23 +423,23 @@ ci + ce
|
|
|
423
423
|
);
|
|
424
424
|
}
|
|
425
425
|
return aZ(
|
|
426
|
-
|
|
427
|
-
|
|
426
|
+
fL - eB,
|
|
427
|
+
fL + eB
|
|
428
428
|
);
|
|
429
429
|
}
|
|
430
430
|
|
|
431
431
|
fn eq(
|
|
432
432
|
iH: f32,
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
433
|
+
gN: f32,
|
|
434
|
+
oG: f32,
|
|
435
|
+
mM: f32,
|
|
436
436
|
kf: vec2f,
|
|
437
437
|
phase: f32
|
|
438
438
|
) -> f32 {
|
|
439
|
-
let
|
|
440
|
-
let ia = aU(kf,
|
|
441
|
-
let kO = ia * (
|
|
442
|
-
let ap = vec2f(1.0, 0.0) - ia *
|
|
439
|
+
let nq = vec2f(cos(phase), sin(phase));
|
|
440
|
+
let ia = aU(kf, nq);
|
|
441
|
+
let kO = ia * (gN * mM);
|
|
442
|
+
let ap = vec2f(1.0, 0.0) - ia * oG;
|
|
443
443
|
let hz = vec2f(iH, 0.0)
|
|
444
444
|
+ aZ(kO, ap);
|
|
445
445
|
return dot(hz, hz);
|
|
@@ -466,24 +466,24 @@ aM, ck, dm, cU
|
|
|
466
466
|
let la = jZ(
|
|
467
467
|
aM, ck, dm, cU
|
|
468
468
|
);
|
|
469
|
-
let jj =
|
|
469
|
+
let jj = hd(
|
|
470
470
|
aM, ck, dm, cU
|
|
471
471
|
);
|
|
472
|
-
let ji =
|
|
472
|
+
let ji = hc(
|
|
473
473
|
aM, ck, dm, cU
|
|
474
474
|
);
|
|
475
|
-
let
|
|
475
|
+
let gr = ck * cU
|
|
476
476
|
/ max(aM * dm, 1e-9);
|
|
477
477
|
let phase = 2.0 * PI * (2.0 * ck * cn * cU) / wavelength;
|
|
478
478
|
var sb = 0.0;
|
|
479
479
|
|
|
480
480
|
for (var ke = 0u; ke < (rtUniform.loopUnrollGuard >> 1u); ke++) {
|
|
481
481
|
let iH = select(lb, la, ke == 1u);
|
|
482
|
-
let
|
|
482
|
+
let gN = select(jj, ji, ke == 1u);
|
|
483
483
|
let kf = bX(
|
|
484
484
|
cU, ck, eu, ke == 1u);
|
|
485
|
-
sb += eq(iH,
|
|
486
|
-
-iH,
|
|
485
|
+
sb += eq(iH, gN,
|
|
486
|
+
-iH, gN * gr, kf, phase);
|
|
487
487
|
}
|
|
488
488
|
return clamp(0.5 * sb, 0.0, 1.0);
|
|
489
489
|
}
|
|
@@ -495,19 +495,19 @@ fn dU(au: f32, f0: vec3f, tint: vec3f) -> vec3f {
|
|
|
495
495
|
let rk = mix(f0, vec3f(1.0), aE(au));
|
|
496
496
|
if (all(tint == vec3f(1.0))) { return rk; }
|
|
497
497
|
let dk = 1.0 / 7.0;
|
|
498
|
-
let
|
|
499
|
-
let
|
|
498
|
+
let mk = 1.0 - dk;
|
|
499
|
+
let fJ = mix(f0, vec3f(1.0), aE(dk));
|
|
500
500
|
let di = 1.0 - au;
|
|
501
501
|
let qt = au * aE(au) * di
|
|
502
|
-
/ (dk * pow(
|
|
503
|
-
return clamp(rk - qt * (
|
|
502
|
+
/ (dk * pow(mk, 6.0));
|
|
503
|
+
return clamp(rk - qt * (fJ - tint * fJ), vec3f(0.0), vec3f(1.0));
|
|
504
504
|
}
|
|
505
505
|
|
|
506
506
|
fn cQ(f0: f32, tp: f32) -> vec2f {
|
|
507
507
|
let dN = clamp(f0, 0.0, 0.99);
|
|
508
|
-
let
|
|
508
|
+
let gM = sqrt(dN);
|
|
509
509
|
let qF = (1.0 - dN) / (1.0 + dN);
|
|
510
|
-
let qD = (1.0 +
|
|
510
|
+
let qD = (1.0 + gM) / max(1.0 - gM, 1e-9);
|
|
511
511
|
let ior = mix(qD, qF, clamp(tp, 0.0, 1.0));
|
|
512
512
|
let jO = (
|
|
513
513
|
(ior + 1.0) * (ior + 1.0) * dN
|
|
@@ -528,7 +528,7 @@ material: J,
|
|
|
528
528
|
color: vec3f,
|
|
529
529
|
viewLocal: vec3f,
|
|
530
530
|
lightLocal: vec3f,
|
|
531
|
-
|
|
531
|
+
fu: f32,
|
|
532
532
|
pdf: ptr<function, f32>
|
|
533
533
|
) -> vec3f {
|
|
534
534
|
*pdf = 0.0;
|
|
@@ -537,49 +537,49 @@ return vec3f(0.0);
|
|
|
537
537
|
}
|
|
538
538
|
|
|
539
539
|
let roughness = material.diffuseRoughness;
|
|
540
|
-
let
|
|
541
|
-
let
|
|
542
|
-
let
|
|
543
|
-
let
|
|
544
|
-
let hP = dot(lightLocal, viewLocal) -
|
|
545
|
-
let
|
|
540
|
+
let gX = 0.5 - 2.0 / (3.0 * PI);
|
|
541
|
+
let oi = 2.0 / 3.0 - 28.0 / (15.0 * PI);
|
|
542
|
+
let oA = lightLocal.z;
|
|
543
|
+
let mA = viewLocal.z;
|
|
544
|
+
let hP = dot(lightLocal, viewLocal) - oA * mA;
|
|
545
|
+
let gU = select(
|
|
546
546
|
hP,
|
|
547
|
-
hP / max(max(
|
|
547
|
+
hP / max(max(oA, mA), 1e-7),
|
|
548
548
|
hP > 0.0
|
|
549
549
|
);
|
|
550
|
-
let il = 1.0 / (1.0 +
|
|
551
|
-
let
|
|
552
|
-
* (1.0 + roughness *
|
|
550
|
+
let il = 1.0 / (1.0 + gX * roughness);
|
|
551
|
+
let nv = color * INVPI * il
|
|
552
|
+
* (1.0 + roughness * gU);
|
|
553
553
|
|
|
554
|
-
let dd = 1.0 -
|
|
555
|
-
let cP = 1.0 -
|
|
556
|
-
let
|
|
554
|
+
let dd = 1.0 - oA;
|
|
555
|
+
let cP = 1.0 - mA;
|
|
556
|
+
let os = dd * (
|
|
557
557
|
0.0571085289 + dd * (
|
|
558
558
|
0.491881867 + dd * (
|
|
559
559
|
-0.332181442 + dd * 0.0714429953
|
|
560
560
|
)
|
|
561
561
|
)
|
|
562
562
|
);
|
|
563
|
-
let
|
|
563
|
+
let np = cP * (
|
|
564
564
|
0.0571085289 + cP * (
|
|
565
565
|
0.491881867 + cP * (
|
|
566
566
|
-0.332181442 + cP * 0.0714429953
|
|
567
567
|
)
|
|
568
568
|
)
|
|
569
569
|
);
|
|
570
|
-
let pv = (1.0 + roughness *
|
|
571
|
-
/ (1.0 +
|
|
572
|
-
let
|
|
573
|
-
/ (1.0 +
|
|
574
|
-
let
|
|
575
|
-
let hF = color * color *
|
|
576
|
-
/ max(vec3f(1e-7), vec3f(1.0) - color * (1.0 -
|
|
577
|
-
let
|
|
578
|
-
* max(1e-7, 1.0 -
|
|
570
|
+
let pv = (1.0 + roughness * os)
|
|
571
|
+
/ (1.0 + gX * roughness);
|
|
572
|
+
let oC = (1.0 + roughness * np)
|
|
573
|
+
/ (1.0 + gX * roughness);
|
|
574
|
+
let fV = il * (1.0 + oi * roughness);
|
|
575
|
+
let hF = color * color * fV
|
|
576
|
+
/ max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fV));
|
|
577
|
+
let lE = hF * INVPI
|
|
578
|
+
* max(1e-7, 1.0 - oC)
|
|
579
579
|
* max(1e-7, 1.0 - pv)
|
|
580
|
-
/ max(1e-7, 1.0 -
|
|
580
|
+
/ max(1e-7, 1.0 - fV);
|
|
581
581
|
*pdf = lightLocal.z * INVPI;
|
|
582
|
-
return (
|
|
582
|
+
return (nv + lE) * fu;
|
|
583
583
|
}
|
|
584
584
|
|
|
585
585
|
fn aO(viewCosine: f32, roughness: f32) -> f32 {
|
|
@@ -628,7 +628,7 @@ return vec3f(0.0);
|
|
|
628
628
|
}
|
|
629
629
|
|
|
630
630
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
631
|
-
let distribution =
|
|
631
|
+
let distribution = gL(V, alpha);
|
|
632
632
|
let jV = bk(viewLocal, alpha);
|
|
633
633
|
let ea = jV
|
|
634
634
|
* bk(lightLocal, alpha);
|
|
@@ -661,7 +661,7 @@ if (bQ <= 0.0 || kL >= 0.0) {
|
|
|
661
661
|
return vec3f(0.0);
|
|
662
662
|
}
|
|
663
663
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
664
|
-
let distribution =
|
|
664
|
+
let distribution = gL(V, alpha);
|
|
665
665
|
let jV = bk(viewLocal, alpha);
|
|
666
666
|
let ea = jV
|
|
667
667
|
* bk(lightLocal, alpha);
|
|
@@ -692,11 +692,11 @@ fn aP(
|
|
|
692
692
|
ah: vec3f,
|
|
693
693
|
transmissionWeight: f32
|
|
694
694
|
) -> vec3f {
|
|
695
|
-
let
|
|
695
|
+
let gm = 2.0 * ah
|
|
696
696
|
/ (vec3f(1.0) + ah);
|
|
697
697
|
return mix(
|
|
698
698
|
ah,
|
|
699
|
-
|
|
699
|
+
gm,
|
|
700
700
|
clamp(transmissionWeight, 0.0, 1.0)
|
|
701
701
|
);
|
|
702
702
|
}
|
|
@@ -731,31 +731,31 @@ if (viewLocal.z <= 0.0 || lightLocal.z >= 0.0) {
|
|
|
731
731
|
return vec3f(0.0);
|
|
732
732
|
}
|
|
733
733
|
let S = -lightLocal.z;
|
|
734
|
-
let
|
|
734
|
+
let oe = cu(
|
|
735
735
|
viewLocal.z,
|
|
736
736
|
material.relativeIor
|
|
737
737
|
);
|
|
738
738
|
*pdf = S * INVPI;
|
|
739
|
-
return vec3f(1.0 -
|
|
739
|
+
return vec3f(1.0 - oe) * INVPI;
|
|
740
740
|
}
|
|
741
741
|
|
|
742
742
|
fn dR(prepared: ptr<function, ag>) {
|
|
743
743
|
|
|
744
744
|
|
|
745
|
-
let
|
|
745
|
+
let nI = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
|
|
746
746
|
var total = (*prepared).probabilities[OPENPBR_LOBE_FUZZ];
|
|
747
|
-
for (var hU = 1; hU <
|
|
747
|
+
for (var hU = 1; hU < nI; hU++) {
|
|
748
748
|
total += (*prepared).probabilities[hU];
|
|
749
749
|
}
|
|
750
750
|
if (total <= 1e-8) {
|
|
751
|
-
for (var hU = 0; hU <
|
|
751
|
+
for (var hU = 0; hU < nI; hU++) {
|
|
752
752
|
(*prepared).probabilities[hU] = 0.0;
|
|
753
753
|
}
|
|
754
754
|
return;
|
|
755
755
|
}
|
|
756
|
-
let
|
|
757
|
-
for (var hU = 0; hU <
|
|
758
|
-
(*prepared).probabilities[hU] *=
|
|
756
|
+
let ov = 1.0 / total;
|
|
757
|
+
for (var hU = 0; hU < nI; hU++) {
|
|
758
|
+
(*prepared).probabilities[hU] *= ov;
|
|
759
759
|
}
|
|
760
760
|
}
|
|
761
761
|
|
|
@@ -769,8 +769,8 @@ return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * e
|
|
|
769
769
|
|
|
770
770
|
fn bP(f0: vec3f, tint: vec3f) -> vec3f {
|
|
771
771
|
let dk = 1.0 / 7.0;
|
|
772
|
-
let
|
|
773
|
-
let b =
|
|
772
|
+
let fJ = mix(f0, vec3f(1.0), aE(dk));
|
|
773
|
+
let b = fJ * (vec3f(1.0) - tint) / (dk * pow(1.0 - dk, 6.0));
|
|
774
774
|
return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
|
|
775
775
|
}
|
|
776
776
|
|
|
@@ -778,12 +778,12 @@ return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
|
|
|
778
778
|
|
|
779
779
|
fn cD(material: J, au: f32) -> vec3f {
|
|
780
780
|
if (au <= 0.0) { return vec3f(1.0); }
|
|
781
|
-
let
|
|
782
|
-
let tD = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(
|
|
781
|
+
let lG = sqrt(max(0.0, 1.0 - (1.0 - au * au) / (material.coatIor * material.coatIor)));
|
|
782
|
+
let tD = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lG, 1e-5)));
|
|
783
783
|
return mix(vec3f(1.0), tD, material.coatWeight);
|
|
784
784
|
}
|
|
785
785
|
|
|
786
|
-
fn
|
|
786
|
+
fn gq(material: J, au: f32) -> f32 {
|
|
787
787
|
if (material.coatRoughness <= ROUGHNESS_MIN) {
|
|
788
788
|
return af(au, 1.0 / material.coatIor);
|
|
789
789
|
}
|
|
@@ -793,21 +793,21 @@ return clamp(1.0 - aJ(material.coatIor,
|
|
|
793
793
|
material.coatRoughness * material.coatRoughness, au), 0.0, 1.0);
|
|
794
794
|
}
|
|
795
795
|
|
|
796
|
-
fn
|
|
796
|
+
fn hb(prepared: ag) -> vec3f {
|
|
797
797
|
let material = prepared.material;
|
|
798
798
|
let dielectric = 1.0 - material.baseMetalness;
|
|
799
799
|
let opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
|
|
800
800
|
let sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
|
|
801
801
|
let ug = dielectric * material.transmissionWeight;
|
|
802
|
-
let
|
|
802
|
+
let fP = bM(prepared.specularEtaTOverEtaI);
|
|
803
803
|
let kU = bM(1.0 / prepared.transmissionReflectionIor);
|
|
804
|
-
let pR = clamp(opaque *
|
|
804
|
+
let pR = clamp(opaque * fP + (sss + ug) * kU + material.baseMetalness, 0.0, 1.0);
|
|
805
805
|
let jp = mix(1.0, material.specularRoughness, pR);
|
|
806
806
|
let ks = bM(material.coatIor);
|
|
807
807
|
let kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
|
|
808
808
|
let k = mix(ks, kr, jp);
|
|
809
809
|
let eb = material.baseMetalness * material.specularWeight * bP(material.baseWeight * material.baseColor, material.specularColor)
|
|
810
|
-
+ opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0),
|
|
810
|
+
+ opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), fP)
|
|
811
811
|
+ sss * material.subsurfaceColor + vec3f(ug);
|
|
812
812
|
let qU = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
|
|
813
813
|
return mix(vec3f(1.0), qU, material.coatWeight * material.coatDarkening);
|
|
@@ -941,7 +941,7 @@ let ah = af(
|
|
|
941
941
|
viewCosine,
|
|
942
942
|
1.0 / prepared.specularEtaTOverEtaI
|
|
943
943
|
);
|
|
944
|
-
let
|
|
944
|
+
let fA = material.specularColor * select(
|
|
945
945
|
ah,
|
|
946
946
|
mix(
|
|
947
947
|
ah,
|
|
@@ -960,7 +960,7 @@ af(viewCosine, prepared.transmissionReflectionIor),
|
|
|
960
960
|
cS(af(viewCosine, prepared.transmissionReflectionIor)),
|
|
961
961
|
material.thinWalled
|
|
962
962
|
);
|
|
963
|
-
let
|
|
963
|
+
let gO = bG(
|
|
964
964
|
material,
|
|
965
965
|
viewCosine,
|
|
966
966
|
prepared.refractionEtaTOverEtaI
|
|
@@ -970,12 +970,12 @@ prepared.specularEtaTOverEtaI,
|
|
|
970
970
|
prepared.specularAlpha,
|
|
971
971
|
viewCosine
|
|
972
972
|
);
|
|
973
|
-
let
|
|
973
|
+
let gs = cr(
|
|
974
974
|
prepared.specularEtaTOverEtaI,
|
|
975
975
|
prepared.specularAlpha
|
|
976
976
|
);
|
|
977
977
|
prepared.diffuseSpecularEnergyCompensation = iu
|
|
978
|
-
/ max(
|
|
978
|
+
/ max(gs, 1e-12);
|
|
979
979
|
|
|
980
980
|
prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
|
|
981
981
|
* aw(material.fuzzColor)
|
|
@@ -987,10 +987,10 @@ prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
|
|
|
987
987
|
prepared.coatBaseScale = vec3f(1.0);
|
|
988
988
|
if (material.coatWeight > 0.0 && !material.inside) {
|
|
989
989
|
${hasCoatNormals ? /* wgsl */ `let coatViewCosine = select(viewCosine, max(prepared.coatViewLocal.z, 0.0), material.coatNormalEnabled);` : ''}
|
|
990
|
-
let kB =
|
|
990
|
+
let kB = gq(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
|
|
991
991
|
prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kB;
|
|
992
992
|
prepared.coatBaseScale = cD(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
|
|
993
|
-
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kB) *
|
|
993
|
+
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kB) * hb(prepared);
|
|
994
994
|
}
|
|
995
995
|
prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
|
|
996
996
|
* aw(hV);
|
|
@@ -1009,10 +1009,10 @@ prepared.probabilities[OPENPBR_LOBE_METAL] += fi;
|
|
|
1009
1009
|
prepared.metalMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1010
1010
|
}
|
|
1011
1011
|
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
|
|
1012
|
-
* aw(
|
|
1012
|
+
* aw(fA);
|
|
1013
1013
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1014
1014
|
* (1.0 - eO)
|
|
1015
|
-
* aw(
|
|
1015
|
+
* aw(gO);
|
|
1016
1016
|
|
|
1017
1017
|
|
|
1018
1018
|
|
|
@@ -1027,14 +1027,14 @@ prepared.dielectricMsProbability = 0.0;
|
|
|
1027
1027
|
if (!material.thinWalled && material.transmissionWeight > 0.0 &&
|
|
1028
1028
|
prepared.specularAlpha >= 0.0016 && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 &&
|
|
1029
1029
|
abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6) {
|
|
1030
|
-
let
|
|
1031
|
-
prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) *
|
|
1032
|
-
prepared.dielectricMsTransmissionScale =
|
|
1030
|
+
let lF = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
|
|
1031
|
+
prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lF;
|
|
1032
|
+
prepared.dielectricMsTransmissionScale = gO * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1033
1033
|
+ vec3f(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
|
|
1034
1034
|
prepared.dielectricMsReflectionRatio = ch(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
|
|
1035
1035
|
prepared.dielectricMsViewLoss = bO(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
|
|
1036
|
-
let
|
|
1037
|
-
let fi = aw(
|
|
1036
|
+
let nV = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
|
|
1037
|
+
let fi = aw(nV) * prepared.dielectricMsViewLoss;
|
|
1038
1038
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fi;
|
|
1039
1039
|
prepared.dielectricMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1040
1040
|
}
|
|
@@ -1053,12 +1053,12 @@ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENP
|
|
|
1053
1053
|
prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lj);
|
|
1054
1054
|
}
|
|
1055
1055
|
if (material.coatWeight > 0.0 && !material.inside) {
|
|
1056
|
-
let
|
|
1057
|
-
prepared.probabilities[OPENPBR_LOBE_METAL] *=
|
|
1058
|
-
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *=
|
|
1059
|
-
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *=
|
|
1060
|
-
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *=
|
|
1061
|
-
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *=
|
|
1056
|
+
let gt = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
|
|
1057
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] *= gt;
|
|
1058
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gt;
|
|
1059
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gt;
|
|
1060
|
+
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gt;
|
|
1061
|
+
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gt;
|
|
1062
1062
|
}
|
|
1063
1063
|
dR(&prepared);
|
|
1064
1064
|
return prepared;
|
|
@@ -1071,15 +1071,15 @@ return af(au, prepared.material.relativeIor);
|
|
|
1071
1071
|
}
|
|
1072
1072
|
let kp = af(au, prepared.transmissionReflectionIor);
|
|
1073
1073
|
if (!reflection) { return kp; }
|
|
1074
|
-
let
|
|
1074
|
+
let nk = af(au, 1.0 / prepared.specularEtaTOverEtaI);
|
|
1075
1075
|
let rP = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
|
|
1076
|
-
return mix(
|
|
1076
|
+
return mix(nk, kp, rP);
|
|
1077
1077
|
}
|
|
1078
1078
|
|
|
1079
|
-
fn
|
|
1079
|
+
fn mD(
|
|
1080
1080
|
prepared: ag,
|
|
1081
1081
|
lightDirection: vec3f,
|
|
1082
|
-
|
|
1082
|
+
gP: i32,
|
|
1083
1083
|
pdf: ptr<function, f32>
|
|
1084
1084
|
) -> vec3f {
|
|
1085
1085
|
let material = prepared.material;
|
|
@@ -1107,16 +1107,16 @@ V = -V;
|
|
|
1107
1107
|
var response = vec3f(0.0);
|
|
1108
1108
|
*pdf = 0.0;
|
|
1109
1109
|
var aI = 0.0;
|
|
1110
|
-
let
|
|
1111
|
-
let uN =
|
|
1112
|
-
let tc =
|
|
1113
|
-
let sg =
|
|
1114
|
-
let qf =
|
|
1115
|
-
let jG =
|
|
1116
|
-
|
|
1117
|
-
let th =
|
|
1118
|
-
let
|
|
1119
|
-
|
|
1110
|
+
let me = gP < 0;
|
|
1111
|
+
let uN = me || gP == OPENPBR_LOBE_FUZZ;
|
|
1112
|
+
let tc = me || gP == OPENPBR_LOBE_COAT;
|
|
1113
|
+
let sg = me || gP == OPENPBR_LOBE_METAL;
|
|
1114
|
+
let qf = me || gP == OPENPBR_LOBE_SPECULAR;
|
|
1115
|
+
let jG = me ||
|
|
1116
|
+
gP == OPENPBR_LOBE_TRANSMISSION;
|
|
1117
|
+
let th = me || gP == OPENPBR_LOBE_DIFFUSE;
|
|
1118
|
+
let oT = me ||
|
|
1119
|
+
gP == OPENPBR_LOBE_SUBSURFACE;
|
|
1120
1120
|
let bQ = abs(dot(viewLocal, V));
|
|
1121
1121
|
|
|
1122
1122
|
|
|
@@ -1128,22 +1128,22 @@ df = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
|
|
|
1128
1128
|
if (df.z < 0.0) { df = -df; }
|
|
1129
1129
|
jn = abs(dot(viewLocal, df));
|
|
1130
1130
|
}
|
|
1131
|
-
let
|
|
1131
|
+
let mo =
|
|
1132
1132
|
(reflection && prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0 && qf) ||
|
|
1133
1133
|
(!reflection && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jG);
|
|
1134
1134
|
let qj = reflection && prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && sg;
|
|
1135
|
-
var
|
|
1136
|
-
if (
|
|
1137
|
-
|
|
1135
|
+
var nD: array<vec3f, 2>;
|
|
1136
|
+
if (mo) {
|
|
1137
|
+
nD[0] = vec3f(cR(prepared, jn, reflection));
|
|
1138
1138
|
}
|
|
1139
1139
|
if (qj) {
|
|
1140
|
-
|
|
1140
|
+
nD[1] = dU(bQ, material.baseWeight * material.baseColor, material.specularColor);
|
|
1141
1141
|
}
|
|
1142
1142
|
if (HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
|
|
1143
1143
|
let wavelengths = vec3f(620.0, 540.0, 450.0);
|
|
1144
1144
|
|
|
1145
1145
|
for (var kT = 0u; kT < (rtUniform.loopUnrollGuard >> 1u); kT++) {
|
|
1146
|
-
if (!select(
|
|
1146
|
+
if (!select(mo, qj, kT == 1u)) { continue; }
|
|
1147
1147
|
var wp = vec3f(0.0);
|
|
1148
1148
|
let L = select(jn, bQ, kT == 1u);
|
|
1149
1149
|
for (var channel = 0u; channel + 1u < rtUniform.loopUnrollGuard; channel++) {
|
|
@@ -1154,11 +1154,11 @@ ior = cQ(material.baseWeight * material.baseColor[channel], material.specularCol
|
|
|
1154
1154
|
wp[channel] = ar(L,
|
|
1155
1155
|
wavelengths[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
|
|
1156
1156
|
}
|
|
1157
|
-
|
|
1157
|
+
nD[kT] = mix(nD[kT], wp,
|
|
1158
1158
|
bN(material.thinFilmThickness, material.thinFilmWeight));
|
|
1159
1159
|
}
|
|
1160
1160
|
}
|
|
1161
|
-
let ei =
|
|
1161
|
+
let ei = nD[0];
|
|
1162
1162
|
let diffuseSpecularEnergyCompensation =
|
|
1163
1163
|
prepared.diffuseSpecularEnergyCompensation
|
|
1164
1164
|
* aJ(
|
|
@@ -1185,7 +1185,7 @@ diffuseSpecularEnergyCompensation,
|
|
|
1185
1185
|
}
|
|
1186
1186
|
|
|
1187
1187
|
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && material.thinWalled &&
|
|
1188
|
-
|
|
1188
|
+
oT) {
|
|
1189
1189
|
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * cE(
|
|
1190
1190
|
material,
|
|
1191
1191
|
material.subsurfaceColor,
|
|
@@ -1218,7 +1218,7 @@ cK,
|
|
|
1218
1218
|
}
|
|
1219
1219
|
|
|
1220
1220
|
if (prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && sg) {
|
|
1221
|
-
let cK = material.specularWeight *
|
|
1221
|
+
let cK = material.specularWeight * nD[1];
|
|
1222
1222
|
response += prepared.weights[OPENPBR_LOBE_METAL] * am(
|
|
1223
1223
|
material,
|
|
1224
1224
|
viewLocal,
|
|
@@ -1240,7 +1240,7 @@ let cK = ei;
|
|
|
1240
1240
|
if (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jG) {
|
|
1241
1241
|
if (material.thinWalled) {
|
|
1242
1242
|
let kY = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1243
|
-
let
|
|
1243
|
+
let gm = aP(
|
|
1244
1244
|
ei,
|
|
1245
1245
|
1.0
|
|
1246
1246
|
);
|
|
@@ -1255,7 +1255,7 @@ material,
|
|
|
1255
1255
|
viewLocal,
|
|
1256
1256
|
kY,
|
|
1257
1257
|
df,
|
|
1258
|
-
tint * (vec3f(1.0) -
|
|
1258
|
+
tint * (vec3f(1.0) - gm),
|
|
1259
1259
|
&aI
|
|
1260
1260
|
);
|
|
1261
1261
|
}
|
|
@@ -1277,15 +1277,15 @@ aI *= 1.0 - prepared.dielectricMsProbability;
|
|
|
1277
1277
|
}
|
|
1278
1278
|
*pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aI;
|
|
1279
1279
|
}
|
|
1280
|
-
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 &&
|
|
1280
|
+
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && oT) {
|
|
1281
1281
|
if (material.thinWalled) {
|
|
1282
|
-
let
|
|
1282
|
+
let oh = vec3f(lightLocal.xy, -lightLocal.z);
|
|
1283
1283
|
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
|
|
1284
1284
|
* cE(
|
|
1285
1285
|
material,
|
|
1286
1286
|
material.subsurfaceColor,
|
|
1287
1287
|
viewLocal,
|
|
1288
|
-
|
|
1288
|
+
oh,
|
|
1289
1289
|
diffuseSpecularEnergyCompensation,
|
|
1290
1290
|
&aI
|
|
1291
1291
|
);
|
|
@@ -1333,14 +1333,14 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1333
1333
|
if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
|
|
1334
1334
|
var dI = viewLocal;
|
|
1335
1335
|
var kD = lightLocal;
|
|
1336
|
-
var
|
|
1336
|
+
var gw = V;
|
|
1337
1337
|
var jK = bQ;
|
|
1338
1338
|
if (prepared.directionFrames) {
|
|
1339
1339
|
dI = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
|
|
1340
1340
|
kD = openpbr_to_local(prepared.coatBasis, lightDirection);
|
|
1341
|
-
|
|
1342
|
-
if (
|
|
1343
|
-
jK = abs(dot(dI,
|
|
1341
|
+
gw = normalize(kD + dI);
|
|
1342
|
+
if (gw.z < 0.0) { gw = -gw; }
|
|
1343
|
+
jK = abs(dot(dI, gw));
|
|
1344
1344
|
}
|
|
1345
1345
|
|
|
1346
1346
|
let lg = vec3f(af(
|
|
@@ -1356,7 +1356,7 @@ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0
|
|
|
1356
1356
|
dH,
|
|
1357
1357
|
dI,
|
|
1358
1358
|
kD,
|
|
1359
|
-
|
|
1359
|
+
gw,
|
|
1360
1360
|
lg,
|
|
1361
1361
|
&aI
|
|
1362
1362
|
);
|
|
@@ -1415,7 +1415,7 @@ prepared: ag,
|
|
|
1415
1415
|
lightDirection: vec3f,
|
|
1416
1416
|
pdf: ptr<function, f32>
|
|
1417
1417
|
) -> vec3f {
|
|
1418
|
-
return
|
|
1418
|
+
return mD(prepared, lightDirection, -1, pdf);
|
|
1419
1419
|
}
|
|
1420
1420
|
|
|
1421
1421
|
|
|
@@ -1443,7 +1443,7 @@ return bI(prepared, lightDirection, pdf);
|
|
|
1443
1443
|
|
|
1444
1444
|
|
|
1445
1445
|
|
|
1446
|
-
fn
|
|
1446
|
+
fn nl(
|
|
1447
1447
|
prepared: ag, cm: vec3f,
|
|
1448
1448
|
lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
|
|
1449
1449
|
aA: ptr<function, f32>, aS: ptr<function, bool>,
|
|
@@ -1452,7 +1452,7 @@ bE: ptr<function, bool>, aR: ptr<function, u32>
|
|
|
1452
1452
|
let material = prepared.material;
|
|
1453
1453
|
let viewLocal = prepared.viewLocal;
|
|
1454
1454
|
var cy = cm.x;
|
|
1455
|
-
let
|
|
1455
|
+
let fv = cm.y;
|
|
1456
1456
|
let bm = cm.z;
|
|
1457
1457
|
*isTransmissionEvent = false;
|
|
1458
1458
|
*aA = 1.0;
|
|
@@ -1463,8 +1463,8 @@ let bm = cm.z;
|
|
|
1463
1463
|
|
|
1464
1464
|
var cdf: array<f32, OPENPBR_LOBE_COUNT>;
|
|
1465
1465
|
cdf[OPENPBR_LOBE_FUZZ] = prepared.probabilities[OPENPBR_LOBE_FUZZ];
|
|
1466
|
-
let
|
|
1467
|
-
for (var hU = 1; hU <
|
|
1466
|
+
let nI = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
|
|
1467
|
+
for (var hU = 1; hU < nI; hU++) {
|
|
1468
1468
|
cdf[hU] = cdf[hU - 1] + prepared.probabilities[hU];
|
|
1469
1469
|
}
|
|
1470
1470
|
if (cdf[OPENPBR_LOBE_SUBSURFACE] <= 0.0) {
|
|
@@ -1487,7 +1487,7 @@ u32(OPENPBR_LOBE_DIFFUSE),
|
|
|
1487
1487
|
u32(OPENPBR_LOBE_FUZZ),
|
|
1488
1488
|
pQ
|
|
1489
1489
|
);
|
|
1490
|
-
lightLocal = bi(vec2f(cy,
|
|
1490
|
+
lightLocal = bi(vec2f(cy, fv));
|
|
1491
1491
|
}
|
|
1492
1492
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1493
1493
|
else if (bm < cdf[OPENPBR_LOBE_COAT]) {
|
|
@@ -1500,7 +1500,7 @@ var V = aQ(
|
|
|
1500
1500
|
dI,
|
|
1501
1501
|
|
|
1502
1502
|
aK(material.coatRoughness, material.coatAnisotropy),
|
|
1503
|
-
vec2f(cy,
|
|
1503
|
+
vec2f(cy, fv)
|
|
1504
1504
|
);
|
|
1505
1505
|
if (V.z < 0.0) {
|
|
1506
1506
|
V = -V;
|
|
@@ -1524,7 +1524,7 @@ var V = aQ(
|
|
|
1524
1524
|
viewLocal,
|
|
1525
1525
|
|
|
1526
1526
|
aK(material.coatRoughness, material.coatAnisotropy),
|
|
1527
|
-
vec2f(cy,
|
|
1527
|
+
vec2f(cy, fv)
|
|
1528
1528
|
);
|
|
1529
1529
|
if (V.z < 0.0) {
|
|
1530
1530
|
V = -V;
|
|
@@ -1545,14 +1545,14 @@ let rM = (bm - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE
|
|
|
1545
1545
|
if (tw && rM < prepared.metalMsProbability) {
|
|
1546
1546
|
let z = cy;
|
|
1547
1547
|
let fl = sqrt(max(0.0, 1.0 - z * z));
|
|
1548
|
-
let br = TWOPI *
|
|
1548
|
+
let br = TWOPI * fv;
|
|
1549
1549
|
lightLocal = vec3f(fl * cos(br), fl * sin(br), z);
|
|
1550
1550
|
}
|
|
1551
1551
|
else {
|
|
1552
1552
|
var V = aQ(
|
|
1553
1553
|
viewLocal,
|
|
1554
1554
|
vec2f(material.alphaX, material.alphaY),
|
|
1555
|
-
vec2f(cy,
|
|
1555
|
+
vec2f(cy, fv)
|
|
1556
1556
|
);
|
|
1557
1557
|
if (V.z < 0.0) {
|
|
1558
1558
|
V = -V;
|
|
@@ -1570,21 +1570,21 @@ else if (bm < cdf[OPENPBR_LOBE_TRANSMISSION]) {
|
|
|
1570
1570
|
let us = (bm - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1571
1571
|
if (prepared.dielectricMsProbability > 0.0 && us < prepared.dielectricMsProbability) {
|
|
1572
1572
|
let ja = prepared.dielectricMsReflectionRatio;
|
|
1573
|
-
let
|
|
1573
|
+
let lY = cy < ja;
|
|
1574
1574
|
var z: f32;
|
|
1575
|
-
if (
|
|
1575
|
+
if (lY) { z = min(cy / ja, 0.99999994); }
|
|
1576
1576
|
else { z = -min((cy - ja) / (1.0 - ja), 0.99999994); }
|
|
1577
1577
|
let fl = sqrt(max(0.0, 1.0 - z * z));
|
|
1578
|
-
let br = TWOPI *
|
|
1578
|
+
let br = TWOPI * fv;
|
|
1579
1579
|
lightLocal = vec3f(fl * cos(br), fl * sin(br), z);
|
|
1580
|
-
*isTransmissionEvent = !
|
|
1581
|
-
*aR = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR),
|
|
1580
|
+
*isTransmissionEvent = !lY;
|
|
1581
|
+
*aR = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), lY);
|
|
1582
1582
|
}
|
|
1583
1583
|
else {
|
|
1584
1584
|
var V = aQ(
|
|
1585
1585
|
viewLocal,
|
|
1586
1586
|
vec2f(material.alphaX, material.alphaY),
|
|
1587
|
-
vec2f(cy,
|
|
1587
|
+
vec2f(cy, fv)
|
|
1588
1588
|
);
|
|
1589
1589
|
if (V.z < 0.0) {
|
|
1590
1590
|
V = -V;
|
|
@@ -1620,7 +1620,7 @@ cy = (cy - 0.5) * 2.0;
|
|
|
1620
1620
|
else {
|
|
1621
1621
|
cy *= 2.0;
|
|
1622
1622
|
}
|
|
1623
|
-
lightLocal = bi(vec2f(cy,
|
|
1623
|
+
lightLocal = bi(vec2f(cy, fv));
|
|
1624
1624
|
if (pT) {
|
|
1625
1625
|
lightLocal.z = -lightLocal.z;
|
|
1626
1626
|
}
|
|
@@ -1629,7 +1629,7 @@ else {
|
|
|
1629
1629
|
}
|
|
1630
1630
|
}
|
|
1631
1631
|
else {
|
|
1632
|
-
lightLocal = bi(vec2f(cy,
|
|
1632
|
+
lightLocal = bi(vec2f(cy, fv));
|
|
1633
1633
|
lightLocal.z = -lightLocal.z;
|
|
1634
1634
|
}
|
|
1635
1635
|
}
|
|
@@ -1659,11 +1659,11 @@ aS: ptr<function, bool>,
|
|
|
1659
1659
|
bE: ptr<function, bool>,
|
|
1660
1660
|
aR: ptr<function, u32>,
|
|
1661
1661
|
lo: ptr<function, f32>,
|
|
1662
|
-
|
|
1662
|
+
gY: ptr<function, vec3f>
|
|
1663
1663
|
) -> vec3f {
|
|
1664
1664
|
*pdf = 0.0;
|
|
1665
1665
|
*lo = 0.0;
|
|
1666
|
-
*
|
|
1666
|
+
*gY = vec3f(0.0);
|
|
1667
1667
|
|
|
1668
1668
|
|
|
1669
1669
|
|
|
@@ -1675,24 +1675,24 @@ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6) {
|
|
|
1675
1675
|
prepared.basis,
|
|
1676
1676
|
-prepared.viewLocal
|
|
1677
1677
|
);
|
|
1678
|
-
let
|
|
1678
|
+
let nL = bn(prepared.material)
|
|
1679
1679
|
* ds(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
|
|
1680
1680
|
*pdf = 1.0;
|
|
1681
1681
|
*lo = 1.0;
|
|
1682
|
-
*
|
|
1682
|
+
*gY = nL;
|
|
1683
1683
|
*isTransmissionEvent = true;
|
|
1684
1684
|
*aA = 0.0;
|
|
1685
1685
|
*aS = true;
|
|
1686
1686
|
*bE = false;
|
|
1687
1687
|
*aR = u32(OPENPBR_LOBE_TRANSMISSION);
|
|
1688
|
-
return
|
|
1688
|
+
return nL;
|
|
1689
1689
|
}
|
|
1690
|
-
if (!
|
|
1690
|
+
if (!nl(prepared, cm, lightDirection,
|
|
1691
1691
|
isTransmissionEvent, aA, aS,
|
|
1692
1692
|
bE, aR)) { return vec3f(0.0); }
|
|
1693
1693
|
let response = bI(prepared, *lightDirection, pdf);
|
|
1694
1694
|
*lo = *pdf;
|
|
1695
|
-
*
|
|
1695
|
+
*gY = response;
|
|
1696
1696
|
return response;
|
|
1697
1697
|
}
|
|
1698
1698
|
|
|
@@ -1717,7 +1717,7 @@ material,
|
|
|
1717
1717
|
bF,
|
|
1718
1718
|
normal
|
|
1719
1719
|
);
|
|
1720
|
-
var
|
|
1720
|
+
var gY = vec3f(0.0);
|
|
1721
1721
|
return dv(
|
|
1722
1722
|
prepared,
|
|
1723
1723
|
cm,
|
|
@@ -1729,7 +1729,7 @@ aS,
|
|
|
1729
1729
|
bE,
|
|
1730
1730
|
aR,
|
|
1731
1731
|
lo,
|
|
1732
|
-
&
|
|
1732
|
+
&gY
|
|
1733
1733
|
);
|
|
1734
1734
|
}`;
|
|
1735
1735
|
}
|