Skip to content

Commit 4e44cb0

Browse files
committed
Refactor the coat calculation
1 parent 5d9315c commit 4e44cb0

1 file changed

Lines changed: 30 additions & 27 deletions

File tree

reference/open_pbr_surface.mtlx

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,9 @@
459459
<input name="mix" type="float" interfacename="base_metalness" />
460460
</mix>
461461

462-
<!-- Coat darkening calculation -->
462+
<!-- Coat Layer -->
463+
464+
<!-- Coat inter-reflection darkening darkening calculation -->
463465
<!-- approximate Kcoat, "internal diffuse reflection coefficient" of coat -->
464466
<subtract name="one_minus_coat_F0" type="float">
465467
<input name="in1" type="float" value="1.0" />
@@ -494,74 +496,75 @@
494496
<input name="bg" type="color3" nodename="Edielectric" />
495497
<input name="mix" type="float" interfacename="base_metalness" />
496498
</mix>
497-
<!-- final base darkening factor due to coat: base_darkening = (1 - Kcoat) / (1 - Ebase*Kcoat) -->
499+
<!-- final base inter-reflection darkening darkening factor due to coat,
500+
where Tcoat2 = coat_color:
501+
base_darkening = (1 - Kcoat) / (1 - Ebase*Kcoat*Tcoat2) -->
498502
<multiply name="Ebase_Kcoat" type="color3">
499503
<input name="in1" type="color3" nodename="Ebase" />
500504
<input name="in2" type="float" nodename="Kcoat" />
501505
</multiply>
502-
<multiply name="Ebase_Kcoat_T2" type="color3">
506+
<multiply name="Ebase_Kcoat_Tcoat2" type="color3">
503507
<input name="in1" type="color3" nodename="Ebase_Kcoat" />
504508
<input name="in2" type="color3" interfacename="coat_color" />
505509
</multiply>
506510
<subtract name="one_minus_Kcoat" type="float">
507511
<input name="in1" type="float" value="1.0" />
508512
<input name="in2" type="float" nodename="Kcoat" />
509513
</subtract>
510-
<subtract name="one_minus_Ebase_Kcoat_T2" type="color3">
514+
<subtract name="one_minus_Ebase_Kcoat_Tcoat2" type="color3">
511515
<input name="in1" type="color3" value="1.0, 1.0, 1.0" />
512-
<input name="in2" type="color3" nodename="Ebase_Kcoat_T2" />
516+
<input name="in2" type="color3" nodename="Ebase_Kcoat_Tcoat2" />
513517
</subtract>
514518
<convert name="one_minus_Kcoat_color" type="color3">
515519
<input name="in" type="float" nodename="one_minus_Kcoat" />
516520
</convert>
517521
<divide name="base_darkening" type="color3">
518522
<input name="in1" type="color3" nodename="one_minus_Kcoat_color" />
519-
<input name="in2" type="color3" nodename="one_minus_Ebase_Kcoat" />
523+
<input name="in2" type="color3" nodename="one_minus_Ebase_Kcoat_Tcoat2" />
520524
</divide>
525+
526+
<!-- inter-reflection darkening, modulated by coat_darkening -->
521527
<mix name="modulated_base_darkening" type="color3">
522528
<input name="fg" type="color3" nodename="base_darkening" />
523529
<input name="bg" type="color3" value="1.0, 1.0, 1.0" />
524530
<input name="mix" type="float" interfacename="coat_darkening" />
525531
</mix>
526-
<mix name="coat_modulated_base_darkening" type="color3">
527-
<input name="fg" type="color3" nodename="modulated_base_darkening" />
528-
<input name="bg" type="color3" value="1.0, 1.0, 1.0" />
529-
<input name="mix" type="float" interfacename="coat_weight" />
530-
</mix>
531532
<multiply name="darkened_base_substrate" type="BSDF">
532533
<input name="in1" type="BSDF" nodename="base_substrate" />
533-
<input name="in2" type="color3" nodename="coat_modulated_base_darkening" />
534+
<input name="in2" type="color3" nodename="modulated_base_darkening" />
534535
</multiply>
535-
536-
<!-- Coat Layer -->
537-
<mix name="coat_attenuation" type="color3">
538-
<input name="fg" type="color3" interfacename="coat_color" />
539-
<input name="bg" type="color3" value="1.0, 1.0, 1.0" />
540-
<input name="mix" type="float" interfacename="coat_weight" />
541-
</mix>
542-
<multiply name="coat_substrate_attenuated" type="BSDF">
536+
<!-- base_substrate, attenuated due to absorption color, and inter-reflection darkening -->
537+
<multiply name="base_substrate_attenuated" type="BSDF">
543538
<input name="in1" type="BSDF" nodename="darkened_base_substrate" />
544-
<input name="in2" type="color3" nodename="coat_attenuation" />
539+
<input name="in2" type="color3" nodename="coat_color" />
545540
</multiply>
546-
541+
<!-- coat BSDF -->
547542
<open_pbr_anisotropy name="coat_roughness_vector" type="vector2">
548543
<input name="roughness" type="float" interfacename="coat_roughness" />
549544
<input name="anisotropy" type="float" interfacename="coat_roughness_anisotropy" />
550545
</open_pbr_anisotropy>
551546
<dielectric_bsdf name="coat_bsdf" type="BSDF">
552-
<input name="weight" type="float" interfacename="coat_weight" />
547+
<input name="weight" type="float" value="1.0" />
553548
<input name="ior" type="float" interfacename="coat_ior" />
554549
<input name="roughness" type="vector2" nodename="coat_roughness_vector" />
555550
<input name="normal" type="vector3" interfacename="geometry_coat_normal" />
556551
<input name="tangent" type="vector3" interfacename="geometry_coat_tangent" />
557552
<input name="scatter_mode" type="string" value="R" />
558553
</dielectric_bsdf>
559-
<layer name="coat_layer" type="BSDF">
554+
<!-- coated base -->
555+
<layer name="coated_base_substrate" type="BSDF">
560556
<input name="top" type="BSDF" nodename="coat_bsdf" />
561-
<input name="base" type="BSDF" nodename="coat_substrate_attenuated" />
557+
<input name="base" type="BSDF" nodename="base_substrate_attenuated" />
562558
</layer>
559+
<!-- statistical mix of coated and uncoated base -->
560+
<mix name="partially_coated_base" type="color3">
561+
<input name="fg" type="BSDF" nodename="coated_base_substrate" />
562+
<input name="bg" type="BSDF" nodename="base_substrate" />
563+
<input name="mix" type="float" interfacename="coat_weight" />
564+
</mix>
565+
563566

564-
<!-- Fuzz Layer -->
567+
<!-- Fuzz Layer -->
565568
<sheen_bsdf name="fuzz_bsdf" type="BSDF">
566569
<input name="weight" type="float" interfacename="fuzz_weight" />
567570
<input name="color" type="color3" interfacename="fuzz_color" />
@@ -571,7 +574,7 @@
571574
</sheen_bsdf>
572575
<layer name="fuzz_layer" type="BSDF">
573576
<input name="top" type="BSDF" nodename="fuzz_bsdf" />
574-
<input name="base" type="BSDF" nodename="coat_layer" />
577+
<input name="base" type="BSDF" nodename="partially_coated_base" />
575578
</layer>
576579

577580
<!-- Emission Layer -->

0 commit comments

Comments
 (0)