@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
|
@@ -37,7 +37,7 @@ J material;
|
|
|
37
37
|
bj basis;
|
|
38
38
|
bj coatBasis;
|
|
39
39
|
bool directionFrames;
|
|
40
|
-
#ifdef
|
|
40
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
41
41
|
vec3 coatViewLocal;
|
|
42
42
|
#endif
|
|
43
43
|
vec3 viewLocal;
|
|
@@ -104,7 +104,7 @@ float F(int sl, int row) {
|
|
|
104
104
|
return texelFetch(openPbrEnergyLut, ivec2(sl, row), 0).r;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
float
|
|
107
|
+
float ge(
|
|
108
108
|
float dJ,
|
|
109
109
|
float bR,
|
|
110
110
|
float hR
|
|
@@ -141,7 +141,7 @@ kE
|
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
float
|
|
144
|
+
float gG(float dJ, float bR) {
|
|
145
145
|
float bA = clamp(dJ, 0.0, 31.0);
|
|
146
146
|
float aH = clamp(bR, 0.0, 31.0);
|
|
147
147
|
int dQ = int(floor(bA));
|
|
@@ -285,7 +285,7 @@ float ior,
|
|
|
285
285
|
float alpha,
|
|
286
286
|
float au
|
|
287
287
|
) {
|
|
288
|
-
float value =
|
|
288
|
+
float value = ge(
|
|
289
289
|
aC(ior),
|
|
290
290
|
sqrt(alpha) * 31.0,
|
|
291
291
|
au * 31.0
|
|
@@ -294,7 +294,7 @@ return aX(value, ior);
|
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
float cr(float ior, float alpha) {
|
|
297
|
-
float value =
|
|
297
|
+
float value = gG(
|
|
298
298
|
aC(ior),
|
|
299
299
|
sqrt(alpha) * 31.0
|
|
300
300
|
);
|
|
@@ -356,7 +356,7 @@ return (ak * L - av * S)
|
|
|
356
356
|
/ (av * S + ak * L);
|
|
357
357
|
}
|
|
358
358
|
|
|
359
|
-
float
|
|
359
|
+
float hd(
|
|
360
360
|
float av,
|
|
361
361
|
float ak,
|
|
362
362
|
float L,
|
|
@@ -366,7 +366,7 @@ return 2.0 * av * L
|
|
|
366
366
|
/ (av * L + ak * S);
|
|
367
367
|
}
|
|
368
368
|
|
|
369
|
-
float
|
|
369
|
+
float hc(
|
|
370
370
|
float av,
|
|
371
371
|
float ak,
|
|
372
372
|
float L,
|
|
@@ -389,9 +389,9 @@ return vec2(
|
|
|
389
389
|
}
|
|
390
390
|
|
|
391
391
|
vec2 hX(vec2 value) {
|
|
392
|
-
float
|
|
393
|
-
float sP = sqrt(max(0.0, 0.5 * (
|
|
394
|
-
float ff = sqrt(max(0.0, 0.5 * (
|
|
392
|
+
float nJ = length(value);
|
|
393
|
+
float sP = sqrt(max(0.0, 0.5 * (nJ + value.x)));
|
|
394
|
+
float ff = sqrt(max(0.0, 0.5 * (nJ - value.x)));
|
|
395
395
|
return vec2(sP, value.y >= 0.0 ? ff : -ff);
|
|
396
396
|
}
|
|
397
397
|
|
|
@@ -401,9 +401,9 @@ float av,
|
|
|
401
401
|
vec2 ak,
|
|
402
402
|
bool qG
|
|
403
403
|
) {
|
|
404
|
-
float
|
|
404
|
+
float oq = sqrt(max(0.0, 1.0 - L * L));
|
|
405
405
|
vec2 sA = aZ(vec2(av, 0.0), ak);
|
|
406
|
-
vec2 hA = sA *
|
|
406
|
+
vec2 hA = sA * oq;
|
|
407
407
|
vec2 S = hX(
|
|
408
408
|
vec2(1.0, 0.0) - aU(hA, hA)
|
|
409
409
|
);
|
|
@@ -411,7 +411,7 @@ if (aU(ak, S).y < 0.0) {
|
|
|
411
411
|
S = -S;
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
-
vec2
|
|
414
|
+
vec2 fL = vec2(av * L, 0.0);
|
|
415
415
|
vec2 eB = aU(ak, S);
|
|
416
416
|
if (qG) {
|
|
417
417
|
vec2 ci = ak * L;
|
|
@@ -422,23 +422,23 @@ ci + ce
|
|
|
422
422
|
);
|
|
423
423
|
}
|
|
424
424
|
return aZ(
|
|
425
|
-
|
|
426
|
-
|
|
425
|
+
fL - eB,
|
|
426
|
+
fL + eB
|
|
427
427
|
);
|
|
428
428
|
}
|
|
429
429
|
|
|
430
430
|
float eq(
|
|
431
431
|
float iH,
|
|
432
|
-
float
|
|
433
|
-
float
|
|
434
|
-
float
|
|
432
|
+
float gN,
|
|
433
|
+
float oG,
|
|
434
|
+
float mM,
|
|
435
435
|
vec2 kf,
|
|
436
436
|
float phase
|
|
437
437
|
) {
|
|
438
|
-
vec2
|
|
439
|
-
vec2 ia = aU(kf,
|
|
440
|
-
vec2 kO = ia * (
|
|
441
|
-
vec2 ap = vec2(1.0, 0.0) - ia *
|
|
438
|
+
vec2 nq = vec2(cos(phase), sin(phase));
|
|
439
|
+
vec2 ia = aU(kf, nq);
|
|
440
|
+
vec2 kO = ia * (gN * mM);
|
|
441
|
+
vec2 ap = vec2(1.0, 0.0) - ia * oG;
|
|
442
442
|
vec2 hz = vec2(iH, 0.0)
|
|
443
443
|
+ aZ(kO, ap);
|
|
444
444
|
return dot(hz, hz);
|
|
@@ -465,13 +465,13 @@ aM, ck, L, cU
|
|
|
465
465
|
float la = jZ(
|
|
466
466
|
aM, ck, L, cU
|
|
467
467
|
);
|
|
468
|
-
float jj =
|
|
468
|
+
float jj = hd(
|
|
469
469
|
aM, ck, L, cU
|
|
470
470
|
);
|
|
471
|
-
float ji =
|
|
471
|
+
float ji = hc(
|
|
472
472
|
aM, ck, L, cU
|
|
473
473
|
);
|
|
474
|
-
float
|
|
474
|
+
float gr = ck * cU
|
|
475
475
|
/ max(aM * L, 1e-9);
|
|
476
476
|
vec2 tb = bX(
|
|
477
477
|
cU, ck, eu, false
|
|
@@ -484,7 +484,7 @@ float tJ = eq(
|
|
|
484
484
|
lb,
|
|
485
485
|
jj,
|
|
486
486
|
-lb,
|
|
487
|
-
jj *
|
|
487
|
+
jj * gr,
|
|
488
488
|
tb,
|
|
489
489
|
phase
|
|
490
490
|
);
|
|
@@ -492,7 +492,7 @@ float tI = eq(
|
|
|
492
492
|
la,
|
|
493
493
|
ji,
|
|
494
494
|
-la,
|
|
495
|
-
ji *
|
|
495
|
+
ji * gr,
|
|
496
496
|
ta,
|
|
497
497
|
phase
|
|
498
498
|
);
|
|
@@ -525,19 +525,19 @@ vec3 dU(float au, vec3 f0, vec3 tint) {
|
|
|
525
525
|
vec3 rk = mix(f0, vec3(1.0), aE(au));
|
|
526
526
|
if (all(equal(tint, vec3(1.0)))) { return rk; }
|
|
527
527
|
float dk = 1.0 / 7.0;
|
|
528
|
-
float
|
|
529
|
-
vec3
|
|
528
|
+
float mk = 1.0 - dk;
|
|
529
|
+
vec3 fJ = mix(f0, vec3(1.0), aE(dk));
|
|
530
530
|
float di = 1.0 - au;
|
|
531
531
|
float qt = au * aE(au) * di
|
|
532
|
-
/ (dk * pow(
|
|
533
|
-
return clamp(rk - qt * (
|
|
532
|
+
/ (dk * pow(mk, 6.0));
|
|
533
|
+
return clamp(rk - qt * (fJ - tint * fJ), vec3(0.0), vec3(1.0));
|
|
534
534
|
}
|
|
535
535
|
|
|
536
536
|
vec2 cQ(float f0, float tp) {
|
|
537
537
|
float dN = clamp(f0, 0.0, 0.99);
|
|
538
|
-
float
|
|
538
|
+
float gM = sqrt(dN);
|
|
539
539
|
float qF = (1.0 - dN) / (1.0 + dN);
|
|
540
|
-
float qD = (1.0 +
|
|
540
|
+
float qD = (1.0 + gM) / max(1.0 - gM, 1e-9);
|
|
541
541
|
float ior = mix(qD, qF, clamp(tp, 0.0, 1.0));
|
|
542
542
|
float jO = (
|
|
543
543
|
(ior + 1.0) * (ior + 1.0) * dN
|
|
@@ -639,7 +639,7 @@ J material,
|
|
|
639
639
|
vec3 color,
|
|
640
640
|
vec3 viewLocal,
|
|
641
641
|
vec3 lightLocal,
|
|
642
|
-
float
|
|
642
|
+
float fu,
|
|
643
643
|
out float pdf
|
|
644
644
|
) {
|
|
645
645
|
pdf = 0.0;
|
|
@@ -648,47 +648,47 @@ return vec3(0.0);
|
|
|
648
648
|
}
|
|
649
649
|
|
|
650
650
|
float roughness = material.diffuseRoughness;
|
|
651
|
-
float
|
|
652
|
-
float
|
|
653
|
-
float
|
|
654
|
-
float
|
|
655
|
-
float hP = dot(lightLocal, viewLocal) -
|
|
656
|
-
float
|
|
657
|
-
? hP / max(max(
|
|
651
|
+
float gX = 0.5 - 2.0 / (3.0 * PI);
|
|
652
|
+
float oi = 2.0 / 3.0 - 28.0 / (15.0 * PI);
|
|
653
|
+
float oA = lightLocal.z;
|
|
654
|
+
float mA = viewLocal.z;
|
|
655
|
+
float hP = dot(lightLocal, viewLocal) - oA * mA;
|
|
656
|
+
float gU = hP > 0.0
|
|
657
|
+
? hP / max(max(oA, mA), 1e-7)
|
|
658
658
|
: hP;
|
|
659
|
-
float il = 1.0 / (1.0 +
|
|
660
|
-
vec3
|
|
661
|
-
* (1.0 + roughness *
|
|
659
|
+
float il = 1.0 / (1.0 + gX * roughness);
|
|
660
|
+
vec3 nv = color * INVPI * il
|
|
661
|
+
* (1.0 + roughness * gU);
|
|
662
662
|
|
|
663
|
-
float dd = 1.0 -
|
|
664
|
-
float cP = 1.0 -
|
|
665
|
-
float
|
|
663
|
+
float dd = 1.0 - oA;
|
|
664
|
+
float cP = 1.0 - mA;
|
|
665
|
+
float os = dd * (
|
|
666
666
|
0.0571085289 + dd * (
|
|
667
667
|
0.491881867 + dd * (
|
|
668
668
|
-0.332181442 + dd * 0.0714429953
|
|
669
669
|
)
|
|
670
670
|
)
|
|
671
671
|
);
|
|
672
|
-
float
|
|
672
|
+
float np = cP * (
|
|
673
673
|
0.0571085289 + cP * (
|
|
674
674
|
0.491881867 + cP * (
|
|
675
675
|
-0.332181442 + cP * 0.0714429953
|
|
676
676
|
)
|
|
677
677
|
)
|
|
678
678
|
);
|
|
679
|
-
float pv = (1.0 + roughness *
|
|
680
|
-
/ (1.0 +
|
|
681
|
-
float
|
|
682
|
-
/ (1.0 +
|
|
683
|
-
float
|
|
684
|
-
vec3 hF = color * color *
|
|
685
|
-
/ max(vec3(1e-7), vec3(1.0) - color * (1.0 -
|
|
686
|
-
vec3
|
|
687
|
-
* max(1e-7, 1.0 -
|
|
679
|
+
float pv = (1.0 + roughness * os)
|
|
680
|
+
/ (1.0 + gX * roughness);
|
|
681
|
+
float oC = (1.0 + roughness * np)
|
|
682
|
+
/ (1.0 + gX * roughness);
|
|
683
|
+
float fV = il * (1.0 + oi * roughness);
|
|
684
|
+
vec3 hF = color * color * fV
|
|
685
|
+
/ max(vec3(1e-7), vec3(1.0) - color * (1.0 - fV));
|
|
686
|
+
vec3 lE = hF * INVPI
|
|
687
|
+
* max(1e-7, 1.0 - oC)
|
|
688
688
|
* max(1e-7, 1.0 - pv)
|
|
689
|
-
/ max(1e-7, 1.0 -
|
|
689
|
+
/ max(1e-7, 1.0 - fV);
|
|
690
690
|
pdf = lightLocal.z * INVPI;
|
|
691
|
-
return (
|
|
691
|
+
return (nv + lE) * fu;
|
|
692
692
|
}
|
|
693
693
|
|
|
694
694
|
float aO(float viewCosine, float roughness) {
|
|
@@ -737,7 +737,7 @@ return vec3(0.0);
|
|
|
737
737
|
}
|
|
738
738
|
|
|
739
739
|
vec2 alpha = vec2(material.alphaX, material.alphaY);
|
|
740
|
-
float distribution =
|
|
740
|
+
float distribution = gL(V, alpha);
|
|
741
741
|
float jV = bk(viewLocal, alpha);
|
|
742
742
|
float ea = jV
|
|
743
743
|
* bk(lightLocal, alpha);
|
|
@@ -770,7 +770,7 @@ if (bQ <= 0.0 || kL >= 0.0) {
|
|
|
770
770
|
return vec3(0.0);
|
|
771
771
|
}
|
|
772
772
|
vec2 alpha = vec2(material.alphaX, material.alphaY);
|
|
773
|
-
float distribution =
|
|
773
|
+
float distribution = gL(V, alpha);
|
|
774
774
|
float jV = bk(viewLocal, alpha);
|
|
775
775
|
float ea = jV
|
|
776
776
|
* bk(lightLocal, alpha);
|
|
@@ -803,11 +803,11 @@ vec3 aP(
|
|
|
803
803
|
vec3 ah,
|
|
804
804
|
float transmissionWeight
|
|
805
805
|
) {
|
|
806
|
-
vec3
|
|
806
|
+
vec3 gm = 2.0 * ah
|
|
807
807
|
/ (vec3(1.0) + ah);
|
|
808
808
|
return mix(
|
|
809
809
|
ah,
|
|
810
|
-
|
|
810
|
+
gm,
|
|
811
811
|
clamp(transmissionWeight, 0.0, 1.0)
|
|
812
812
|
);
|
|
813
813
|
}
|
|
@@ -842,12 +842,12 @@ if (viewLocal.z <= 0.0 || lightLocal.z >= 0.0) {
|
|
|
842
842
|
return vec3(0.0);
|
|
843
843
|
}
|
|
844
844
|
float S = -lightLocal.z;
|
|
845
|
-
float
|
|
845
|
+
float oe = cu(
|
|
846
846
|
viewLocal.z,
|
|
847
847
|
material.relativeIor
|
|
848
848
|
);
|
|
849
849
|
pdf = S * INVPI;
|
|
850
|
-
return vec3(1.0 -
|
|
850
|
+
return vec3(1.0 - oe) * INVPI;
|
|
851
851
|
}
|
|
852
852
|
|
|
853
853
|
void dR(inout ag prepared) {
|
|
@@ -861,9 +861,9 @@ prepared.probabilities[hU] = 0.0;
|
|
|
861
861
|
}
|
|
862
862
|
return;
|
|
863
863
|
}
|
|
864
|
-
float
|
|
864
|
+
float ov = 1.0 / total;
|
|
865
865
|
for (int hU = 0; hU < OPENPBR_LOBE_COUNT; hU++) {
|
|
866
|
-
prepared.probabilities[hU] *=
|
|
866
|
+
prepared.probabilities[hU] *= ov;
|
|
867
867
|
}
|
|
868
868
|
}
|
|
869
869
|
|
|
@@ -877,8 +877,8 @@ return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * e
|
|
|
877
877
|
|
|
878
878
|
vec3 bP(vec3 f0, vec3 tint) {
|
|
879
879
|
float dk = 1.0 / 7.0;
|
|
880
|
-
vec3
|
|
881
|
-
vec3 b =
|
|
880
|
+
vec3 fJ = mix(f0, vec3(1.0), aE(dk));
|
|
881
|
+
vec3 b = fJ * (vec3(1.0) - tint) / (dk * pow(1.0 - dk, 6.0));
|
|
882
882
|
return clamp(f0 + (vec3(1.0) - f0) / 21.0 - b / 126.0, vec3(0.0), vec3(1.0));
|
|
883
883
|
}
|
|
884
884
|
|
|
@@ -886,12 +886,12 @@ return clamp(f0 + (vec3(1.0) - f0) / 21.0 - b / 126.0, vec3(0.0), vec3(1.0));
|
|
|
886
886
|
|
|
887
887
|
vec3 cD(J material, float au) {
|
|
888
888
|
if (au <= 0.0) { return vec3(1.0); }
|
|
889
|
-
float
|
|
890
|
-
vec3 tD = pow(max(material.coatColor, vec3(0.0)), vec3(0.5 / max(
|
|
889
|
+
float lG = sqrt(max(0.0, 1.0 - (1.0 - au * au) / (material.coatIor * material.coatIor)));
|
|
890
|
+
vec3 tD = pow(max(material.coatColor, vec3(0.0)), vec3(0.5 / max(lG, 1e-5)));
|
|
891
891
|
return mix(vec3(1.0), tD, material.coatWeight);
|
|
892
892
|
}
|
|
893
893
|
|
|
894
|
-
float
|
|
894
|
+
float gq(J material, float au) {
|
|
895
895
|
if (material.coatRoughness <= ROUGHNESS_MIN) {
|
|
896
896
|
return af(au, 1.0 / material.coatIor);
|
|
897
897
|
}
|
|
@@ -901,21 +901,21 @@ return clamp(1.0 - aJ(material.coatIor,
|
|
|
901
901
|
material.coatRoughness * material.coatRoughness, au), 0.0, 1.0);
|
|
902
902
|
}
|
|
903
903
|
|
|
904
|
-
vec3
|
|
904
|
+
vec3 hb(ag prepared) {
|
|
905
905
|
J material = prepared.material;
|
|
906
906
|
float dielectric = 1.0 - material.baseMetalness;
|
|
907
907
|
float opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
|
|
908
908
|
float sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
|
|
909
909
|
float ug = dielectric * material.transmissionWeight;
|
|
910
|
-
float
|
|
910
|
+
float fP = bM(prepared.specularEtaTOverEtaI);
|
|
911
911
|
float kU = bM(1.0 / prepared.transmissionReflectionIor);
|
|
912
|
-
float pR = clamp(opaque *
|
|
912
|
+
float pR = clamp(opaque * fP + (sss + ug) * kU + material.baseMetalness, 0.0, 1.0);
|
|
913
913
|
float jp = mix(1.0, material.specularRoughness, pR);
|
|
914
914
|
float ks = bM(material.coatIor);
|
|
915
915
|
float kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
|
|
916
916
|
float k = mix(ks, kr, jp);
|
|
917
917
|
vec3 eb = material.baseMetalness * material.specularWeight * bP(material.baseWeight * material.baseColor, material.specularColor)
|
|
918
|
-
+ opaque * mix(material.baseWeight * material.baseColor, vec3(1.0),
|
|
918
|
+
+ opaque * mix(material.baseWeight * material.baseColor, vec3(1.0), fP)
|
|
919
919
|
+ sss * material.subsurfaceColor + vec3(ug);
|
|
920
920
|
vec3 qU = vec3(1.0 - k) / max(vec3(1.0) - eb * k, vec3(1e-6));
|
|
921
921
|
return mix(vec3(1.0), qU, material.coatWeight * material.coatDarkening);
|
|
@@ -961,7 +961,7 @@ max(material.specularAnisotropy, material.coatAnisotropy)
|
|
|
961
961
|
);
|
|
962
962
|
prepared.coatBasis = prepared.basis;
|
|
963
963
|
prepared.directionFrames = false;
|
|
964
|
-
#ifdef
|
|
964
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
965
965
|
|
|
966
966
|
|
|
967
967
|
if (material.coatNormalEnabled) {
|
|
@@ -978,7 +978,7 @@ prepared.coatBasis = du(prepared.coatBasis, material.geometryTangent, material.g
|
|
|
978
978
|
prepared.directionFrames = true;
|
|
979
979
|
}
|
|
980
980
|
prepared.viewLocal = openpbr_to_local(prepared.basis, bF);
|
|
981
|
-
#ifdef
|
|
981
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
982
982
|
prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bF);
|
|
983
983
|
#endif
|
|
984
984
|
prepared.diffuseColor = material.baseColor;
|
|
@@ -1047,7 +1047,7 @@ float ah = af(
|
|
|
1047
1047
|
viewCosine,
|
|
1048
1048
|
1.0 / prepared.specularEtaTOverEtaI
|
|
1049
1049
|
);
|
|
1050
|
-
vec3
|
|
1050
|
+
vec3 fA = material.specularColor * (
|
|
1051
1051
|
material.thinWalled
|
|
1052
1052
|
? mix(
|
|
1053
1053
|
ah,
|
|
@@ -1064,7 +1064,7 @@ material.specularColor
|
|
|
1064
1064
|
float eO = material.thinWalled
|
|
1065
1065
|
? cS(af(viewCosine, prepared.transmissionReflectionIor))
|
|
1066
1066
|
: af(viewCosine, prepared.transmissionReflectionIor);
|
|
1067
|
-
vec3
|
|
1067
|
+
vec3 gO = bG(
|
|
1068
1068
|
material,
|
|
1069
1069
|
viewCosine,
|
|
1070
1070
|
prepared.refractionEtaTOverEtaI
|
|
@@ -1074,12 +1074,12 @@ prepared.specularEtaTOverEtaI,
|
|
|
1074
1074
|
prepared.specularAlpha,
|
|
1075
1075
|
viewCosine
|
|
1076
1076
|
);
|
|
1077
|
-
float
|
|
1077
|
+
float gs = cr(
|
|
1078
1078
|
prepared.specularEtaTOverEtaI,
|
|
1079
1079
|
prepared.specularAlpha
|
|
1080
1080
|
);
|
|
1081
1081
|
prepared.diffuseSpecularEnergyCompensation = iu
|
|
1082
|
-
/ max(
|
|
1082
|
+
/ max(gs, 1e-12);
|
|
1083
1083
|
|
|
1084
1084
|
prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
|
|
1085
1085
|
* aw(material.fuzzColor)
|
|
@@ -1090,21 +1090,21 @@ material.fuzzRoughness
|
|
|
1090
1090
|
prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
|
|
1091
1091
|
prepared.coatBaseScale = vec3(1.0);
|
|
1092
1092
|
if (material.coatWeight > 0.0 && !material.inside) {
|
|
1093
|
-
#ifdef
|
|
1093
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1094
1094
|
float coatViewCosine = material.coatNormalEnabled ? max(prepared.coatViewLocal.z, 0.0) : viewCosine;
|
|
1095
|
-
float kB =
|
|
1095
|
+
float kB = gq(material, coatViewCosine);
|
|
1096
1096
|
#else
|
|
1097
|
-
float kB =
|
|
1097
|
+
float kB = gq(material, viewCosine);
|
|
1098
1098
|
#endif
|
|
1099
1099
|
prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kB;
|
|
1100
1100
|
prepared.coatBaseScale = cD(material,
|
|
1101
|
-
#ifdef
|
|
1101
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1102
1102
|
coatViewCosine
|
|
1103
1103
|
#else
|
|
1104
1104
|
viewCosine
|
|
1105
1105
|
#endif
|
|
1106
1106
|
)
|
|
1107
|
-
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kB) *
|
|
1107
|
+
* (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kB) * hb(prepared);
|
|
1108
1108
|
}
|
|
1109
1109
|
prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
|
|
1110
1110
|
* aw(hV);
|
|
@@ -1121,10 +1121,10 @@ prepared.probabilities[OPENPBR_LOBE_METAL] += fi;
|
|
|
1121
1121
|
prepared.metalMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
|
|
1122
1122
|
}
|
|
1123
1123
|
prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
|
|
1124
|
-
* aw(
|
|
1124
|
+
* aw(fA);
|
|
1125
1125
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1126
1126
|
* (1.0 - eO)
|
|
1127
|
-
* aw(
|
|
1127
|
+
* aw(gO);
|
|
1128
1128
|
|
|
1129
1129
|
|
|
1130
1130
|
|
|
@@ -1139,14 +1139,14 @@ prepared.dielectricMsProbability = 0.0;
|
|
|
1139
1139
|
if (!material.thinWalled && material.transmissionWeight > 0.0 &&
|
|
1140
1140
|
prepared.specularAlpha >= 0.0016 && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 &&
|
|
1141
1141
|
abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6) {
|
|
1142
|
-
float
|
|
1143
|
-
prepared.dielectricMsReflectionScale = (material.inside ? vec3(1.0) : material.specularColor) *
|
|
1144
|
-
prepared.dielectricMsTransmissionScale =
|
|
1142
|
+
float lF = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
|
|
1143
|
+
prepared.dielectricMsReflectionScale = (material.inside ? vec3(1.0) : material.specularColor) * lF;
|
|
1144
|
+
prepared.dielectricMsTransmissionScale = gO * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
|
|
1145
1145
|
+ vec3(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
|
|
1146
1146
|
prepared.dielectricMsReflectionRatio = ch(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
|
|
1147
1147
|
prepared.dielectricMsViewLoss = bO(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
|
|
1148
|
-
vec3
|
|
1149
|
-
float fi = aw(
|
|
1148
|
+
vec3 nV = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
|
|
1149
|
+
float fi = aw(nV) * prepared.dielectricMsViewLoss;
|
|
1150
1150
|
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fi;
|
|
1151
1151
|
prepared.dielectricMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1152
1152
|
}
|
|
@@ -1165,12 +1165,12 @@ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENP
|
|
|
1165
1165
|
prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lj);
|
|
1166
1166
|
}
|
|
1167
1167
|
if (material.coatWeight > 0.0 && !material.inside) {
|
|
1168
|
-
float
|
|
1169
|
-
prepared.probabilities[OPENPBR_LOBE_METAL] *=
|
|
1170
|
-
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *=
|
|
1171
|
-
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *=
|
|
1172
|
-
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *=
|
|
1173
|
-
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *=
|
|
1168
|
+
float gt = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
|
|
1169
|
+
prepared.probabilities[OPENPBR_LOBE_METAL] *= gt;
|
|
1170
|
+
prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gt;
|
|
1171
|
+
prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gt;
|
|
1172
|
+
prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gt;
|
|
1173
|
+
prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gt;
|
|
1174
1174
|
}
|
|
1175
1175
|
dR(prepared);
|
|
1176
1176
|
return prepared;
|
|
@@ -1182,9 +1182,9 @@ return af(au, prepared.material.relativeIor);
|
|
|
1182
1182
|
}
|
|
1183
1183
|
float kp = af(au, prepared.transmissionReflectionIor);
|
|
1184
1184
|
if (!reflection) { return kp; }
|
|
1185
|
-
float
|
|
1185
|
+
float nk = af(au, 1.0 / prepared.specularEtaTOverEtaI);
|
|
1186
1186
|
float rP = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
|
|
1187
|
-
return mix(
|
|
1187
|
+
return mix(nk, kp, rP);
|
|
1188
1188
|
}
|
|
1189
1189
|
|
|
1190
1190
|
vec3 bI(
|
|
@@ -1196,7 +1196,7 @@ J material = prepared.material;
|
|
|
1196
1196
|
vec3 viewLocal = prepared.viewLocal;
|
|
1197
1197
|
vec3 lightLocal = openpbr_to_local(prepared.basis, lightDirection);
|
|
1198
1198
|
bool reflection = lightLocal.z * viewLocal.z > 0.0;
|
|
1199
|
-
#ifdef
|
|
1199
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1200
1200
|
bool independentCoat = material.coatNormalEnabled;
|
|
1201
1201
|
bool geometricReflection = dot(material.geometricNormal, lightDirection) > 0.0;
|
|
1202
1202
|
float coatLightCosine = dot(prepared.coatBasis.normal, lightDirection);
|
|
@@ -1226,7 +1226,7 @@ prepared.specularAlpha,
|
|
|
1226
1226
|
abs(lightLocal.z)
|
|
1227
1227
|
);
|
|
1228
1228
|
|
|
1229
|
-
#ifdef
|
|
1229
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1230
1230
|
if (!independentCoat || (lightLocal.z != 0.0 && reflection == geometricReflection)) {
|
|
1231
1231
|
#endif
|
|
1232
1232
|
if (reflection) {
|
|
@@ -1340,12 +1340,12 @@ vec3 df = normalize(kY + viewLocal);
|
|
|
1340
1340
|
if (df.z < 0.0) {
|
|
1341
1341
|
df = -df;
|
|
1342
1342
|
}
|
|
1343
|
-
float
|
|
1344
|
-
vec3
|
|
1343
|
+
float nQ = abs(dot(viewLocal, df));
|
|
1344
|
+
vec3 lK = vec3(cR(prepared, nQ, false));
|
|
1345
1345
|
if (material.thinFilmWeight > 0.0) {
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1346
|
+
lK = bW(
|
|
1347
|
+
lK,
|
|
1348
|
+
nQ,
|
|
1349
1349
|
material.thinFilmThickness,
|
|
1350
1350
|
material.thinFilmIor,
|
|
1351
1351
|
prepared.thinFilmBaseIor,
|
|
@@ -1353,8 +1353,8 @@ material.thinFilmWeight,
|
|
|
1353
1353
|
prepared.thinFilmExteriorIor
|
|
1354
1354
|
);
|
|
1355
1355
|
}
|
|
1356
|
-
vec3
|
|
1357
|
-
|
|
1356
|
+
vec3 gm = aP(
|
|
1357
|
+
lK,
|
|
1358
1358
|
1.0
|
|
1359
1359
|
);
|
|
1360
1360
|
vec3 tint = bG(
|
|
@@ -1368,7 +1368,7 @@ material,
|
|
|
1368
1368
|
viewLocal,
|
|
1369
1369
|
kY,
|
|
1370
1370
|
df,
|
|
1371
|
-
tint * (vec3(1.0) -
|
|
1371
|
+
tint * (vec3(1.0) - gm),
|
|
1372
1372
|
aI
|
|
1373
1373
|
);
|
|
1374
1374
|
}
|
|
@@ -1392,13 +1392,13 @@ pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aI;
|
|
|
1392
1392
|
}
|
|
1393
1393
|
if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) {
|
|
1394
1394
|
if (material.thinWalled) {
|
|
1395
|
-
vec3
|
|
1395
|
+
vec3 oh = vec3(lightLocal.xy, -lightLocal.z);
|
|
1396
1396
|
response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
|
|
1397
1397
|
* cE(
|
|
1398
1398
|
material,
|
|
1399
1399
|
material.subsurfaceColor,
|
|
1400
1400
|
viewLocal,
|
|
1401
|
-
|
|
1401
|
+
oh,
|
|
1402
1402
|
diffuseSpecularEnergyCompensation,
|
|
1403
1403
|
aI
|
|
1404
1404
|
);
|
|
@@ -1433,24 +1433,24 @@ pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMs
|
|
|
1433
1433
|
}
|
|
1434
1434
|
}
|
|
1435
1435
|
|
|
1436
|
-
#ifdef
|
|
1436
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1437
1437
|
}
|
|
1438
1438
|
#endif
|
|
1439
1439
|
if (material.coatWeight > 0.0) {
|
|
1440
1440
|
response *= ds(prepared,
|
|
1441
|
-
#ifdef
|
|
1441
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1442
1442
|
independentCoat ? coatLightCosine : lightLocal.z
|
|
1443
1443
|
#else
|
|
1444
1444
|
lightLocal.z
|
|
1445
1445
|
#endif
|
|
1446
1446
|
);
|
|
1447
1447
|
}
|
|
1448
|
-
#ifdef
|
|
1448
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1449
1449
|
if (independentCoat) { response *= abs(lightLocal.z); }
|
|
1450
1450
|
#endif
|
|
1451
1451
|
|
|
1452
1452
|
if (
|
|
1453
|
-
#ifdef
|
|
1453
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1454
1454
|
(independentCoat ? coatReflection : reflection)
|
|
1455
1455
|
#else
|
|
1456
1456
|
reflection
|
|
@@ -1458,17 +1458,17 @@ reflection
|
|
|
1458
1458
|
&& prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
|
|
1459
1459
|
vec3 dI = viewLocal;
|
|
1460
1460
|
vec3 kD = lightLocal;
|
|
1461
|
-
vec3
|
|
1461
|
+
vec3 gw = V;
|
|
1462
1462
|
float jK = bQ;
|
|
1463
1463
|
if (prepared.directionFrames) {
|
|
1464
1464
|
dI = openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal));
|
|
1465
|
-
#ifdef
|
|
1465
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1466
1466
|
if (independentCoat) { dI = prepared.coatViewLocal; }
|
|
1467
1467
|
#endif
|
|
1468
1468
|
kD = openpbr_to_local(prepared.coatBasis, lightDirection);
|
|
1469
|
-
|
|
1470
|
-
if (
|
|
1471
|
-
jK = abs(dot(dI,
|
|
1469
|
+
gw = normalize(kD + dI);
|
|
1470
|
+
if (gw.z < 0.0) { gw = -gw; }
|
|
1471
|
+
jK = abs(dot(dI, gw));
|
|
1472
1472
|
}
|
|
1473
1473
|
|
|
1474
1474
|
vec3 lg = vec3(af(
|
|
@@ -1480,14 +1480,14 @@ vec2 jx = aK(material.coatRoughness, material.coatAnisotropy);
|
|
|
1480
1480
|
dH.alphaX = jx.x;
|
|
1481
1481
|
dH.alphaY = jx.y;
|
|
1482
1482
|
response += prepared.weights[OPENPBR_LOBE_COAT]
|
|
1483
|
-
#ifdef
|
|
1483
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1484
1484
|
* (independentCoat ? max(coatLightCosine, 0.0) : 1.0)
|
|
1485
1485
|
#endif
|
|
1486
1486
|
* am(
|
|
1487
1487
|
dH,
|
|
1488
1488
|
dI,
|
|
1489
1489
|
kD,
|
|
1490
|
-
|
|
1490
|
+
gw,
|
|
1491
1491
|
lg,
|
|
1492
1492
|
aI
|
|
1493
1493
|
);
|
|
@@ -1495,7 +1495,7 @@ pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aI;
|
|
|
1495
1495
|
}
|
|
1496
1496
|
|
|
1497
1497
|
if (
|
|
1498
|
-
#ifdef
|
|
1498
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1499
1499
|
(independentCoat ? geometricReflection : reflection)
|
|
1500
1500
|
#else
|
|
1501
1501
|
reflection
|
|
@@ -1510,7 +1510,7 @@ vec3(0.0),
|
|
|
1510
1510
|
vec3(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * qz)
|
|
1511
1511
|
);
|
|
1512
1512
|
response += prepared.weights[OPENPBR_LOBE_FUZZ]
|
|
1513
|
-
#ifdef
|
|
1513
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1514
1514
|
* (independentCoat ? max(lightLocal.z, 0.0) : 1.0)
|
|
1515
1515
|
#endif
|
|
1516
1516
|
* jY(
|
|
@@ -1522,7 +1522,7 @@ aI
|
|
|
1522
1522
|
pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * aI;
|
|
1523
1523
|
}
|
|
1524
1524
|
|
|
1525
|
-
#ifdef
|
|
1525
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1526
1526
|
if (independentCoat) { return response; }
|
|
1527
1527
|
#endif
|
|
1528
1528
|
return response * abs(lightLocal.z);
|
|
@@ -1574,7 +1574,7 @@ out bool isTransmissionEvent
|
|
|
1574
1574
|
J material = prepared.material;
|
|
1575
1575
|
vec3 viewLocal = prepared.viewLocal;
|
|
1576
1576
|
float cy = cm.x;
|
|
1577
|
-
float
|
|
1577
|
+
float fv = cm.y;
|
|
1578
1578
|
float bm = cm.z;
|
|
1579
1579
|
pdf = 0.0;
|
|
1580
1580
|
isTransmissionEvent = false;
|
|
@@ -1589,7 +1589,7 @@ lightDirection = openpbr_to_world(prepared.basis, -viewLocal);
|
|
|
1589
1589
|
pdf = 1.0;
|
|
1590
1590
|
isTransmissionEvent = true;
|
|
1591
1591
|
return (bn(prepared.material) * ds(prepared,
|
|
1592
|
-
#ifdef
|
|
1592
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1593
1593
|
prepared.material.coatNormalEnabled ? dot(prepared.coatBasis.normal, lightDirection) : -prepared.viewLocal.z
|
|
1594
1594
|
#else
|
|
1595
1595
|
-prepared.viewLocal.z
|
|
@@ -1610,25 +1610,25 @@ vec3 lightLocal;
|
|
|
1610
1610
|
if (bm < cdf[OPENPBR_LOBE_FUZZ] || (
|
|
1611
1611
|
bm >= cdf[OPENPBR_LOBE_TRANSMISSION] && bm < cdf[OPENPBR_LOBE_DIFFUSE]
|
|
1612
1612
|
)) {
|
|
1613
|
-
lightLocal = bi(vec2(cy,
|
|
1613
|
+
lightLocal = bi(vec2(cy, fv));
|
|
1614
1614
|
}
|
|
1615
1615
|
else if (bm < cdf[OPENPBR_LOBE_COAT]) {
|
|
1616
1616
|
vec3 dI = viewLocal;
|
|
1617
1617
|
if (prepared.directionFrames) { dI = openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)); }
|
|
1618
|
-
#ifdef
|
|
1618
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1619
1619
|
if (material.coatNormalEnabled) { dI = prepared.coatViewLocal; }
|
|
1620
1620
|
#endif
|
|
1621
1621
|
vec3 V = aQ(
|
|
1622
1622
|
dI,
|
|
1623
1623
|
|
|
1624
1624
|
aK(material.coatRoughness, material.coatAnisotropy),
|
|
1625
|
-
vec2(cy,
|
|
1625
|
+
vec2(cy, fv)
|
|
1626
1626
|
);
|
|
1627
1627
|
if (V.z < 0.0) {
|
|
1628
1628
|
V = -V;
|
|
1629
1629
|
}
|
|
1630
1630
|
lightLocal = normalize(reflect(-dI, V));
|
|
1631
|
-
#ifdef
|
|
1631
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1632
1632
|
if (material.coatNormalEnabled) {
|
|
1633
1633
|
lightDirection = openpbr_to_world(prepared.coatBasis, lightLocal);
|
|
1634
1634
|
if (lightLocal.z <= 0.0 || dot(material.geometricNormal, lightDirection) <= 0.0) { return vec3(0.0); }
|
|
@@ -1643,14 +1643,14 @@ float rM = (bm - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LO
|
|
|
1643
1643
|
if (tw && rM < prepared.metalMsProbability) {
|
|
1644
1644
|
float z = cy;
|
|
1645
1645
|
float fl = sqrt(max(0.0, 1.0 - z * z));
|
|
1646
|
-
float br = TWOPI *
|
|
1646
|
+
float br = TWOPI * fv;
|
|
1647
1647
|
lightLocal = vec3(fl * cos(br), fl * sin(br), z);
|
|
1648
1648
|
}
|
|
1649
1649
|
else {
|
|
1650
1650
|
vec3 V = aQ(
|
|
1651
1651
|
viewLocal,
|
|
1652
1652
|
vec2(material.alphaX, material.alphaY),
|
|
1653
|
-
vec2(cy,
|
|
1653
|
+
vec2(cy, fv)
|
|
1654
1654
|
);
|
|
1655
1655
|
if (V.z < 0.0) {
|
|
1656
1656
|
V = -V;
|
|
@@ -1665,20 +1665,20 @@ isTransmissionEvent = true;
|
|
|
1665
1665
|
float us = (bm - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
|
|
1666
1666
|
if (prepared.dielectricMsProbability > 0.0 && us < prepared.dielectricMsProbability) {
|
|
1667
1667
|
float ja = prepared.dielectricMsReflectionRatio;
|
|
1668
|
-
bool
|
|
1668
|
+
bool lY = cy < ja;
|
|
1669
1669
|
float z;
|
|
1670
|
-
if (
|
|
1670
|
+
if (lY) { z = min(cy / ja, 0.99999994); }
|
|
1671
1671
|
else { z = -min((cy - ja) / (1.0 - ja), 0.99999994); }
|
|
1672
1672
|
float fl = sqrt(max(0.0, 1.0 - z * z));
|
|
1673
|
-
float br = TWOPI *
|
|
1673
|
+
float br = TWOPI * fv;
|
|
1674
1674
|
lightLocal = vec3(fl * cos(br), fl * sin(br), z);
|
|
1675
|
-
isTransmissionEvent = !
|
|
1675
|
+
isTransmissionEvent = !lY;
|
|
1676
1676
|
}
|
|
1677
1677
|
else {
|
|
1678
1678
|
vec3 V = aQ(
|
|
1679
1679
|
viewLocal,
|
|
1680
1680
|
vec2(material.alphaX, material.alphaY),
|
|
1681
|
-
vec2(cy,
|
|
1681
|
+
vec2(cy, fv)
|
|
1682
1682
|
);
|
|
1683
1683
|
if (V.z < 0.0) {
|
|
1684
1684
|
V = -V;
|
|
@@ -1725,7 +1725,7 @@ bool pT = kK >= 0.5;
|
|
|
1725
1725
|
cy = pT
|
|
1726
1726
|
? (kK - 0.5) * 2.0
|
|
1727
1727
|
: kK * 2.0;
|
|
1728
|
-
lightLocal = bi(vec2(cy,
|
|
1728
|
+
lightLocal = bi(vec2(cy, fv));
|
|
1729
1729
|
if (pT) {
|
|
1730
1730
|
lightLocal.z = -lightLocal.z;
|
|
1731
1731
|
}
|
|
@@ -1734,7 +1734,7 @@ isTransmissionEvent = false;
|
|
|
1734
1734
|
}
|
|
1735
1735
|
}
|
|
1736
1736
|
else {
|
|
1737
|
-
lightLocal = bi(vec2(cy,
|
|
1737
|
+
lightLocal = bi(vec2(cy, fv));
|
|
1738
1738
|
lightLocal.z = -lightLocal.z;
|
|
1739
1739
|
}
|
|
1740
1740
|
}
|
|
@@ -1744,7 +1744,7 @@ lightDirection = openpbr_to_world(prepared.basis, lightLocal);
|
|
|
1744
1744
|
if (lightLocal.z == 0.0 || (lightLocal.z < 0.0) != isTransmissionEvent) {
|
|
1745
1745
|
return vec3(0.0);
|
|
1746
1746
|
}
|
|
1747
|
-
#ifdef
|
|
1747
|
+
#ifdef USE_COAT_NORMAL_FRAMES
|
|
1748
1748
|
if (material.coatNormalEnabled &&
|
|
1749
1749
|
((dot(material.geometricNormal, lightDirection) <= 0.0) != isTransmissionEvent)) { return vec3(0.0); }
|
|
1750
1750
|
#endif
|