diff --git a/examples/open_pbr_aluminum_brushed.mtlx b/examples/open_pbr_aluminum_brushed.mtlx index faaf1cc4..99f5d810 100644 --- a/examples/open_pbr_aluminum_brushed.mtlx +++ b/examples/open_pbr_aluminum_brushed.mtlx @@ -1,13 +1,13 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_beryllium.mtlx b/examples/open_pbr_beryllium.mtlx new file mode 100644 index 00000000..de7c1cf4 --- /dev/null +++ b/examples/open_pbr_beryllium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_blackboard.mtlx b/examples/open_pbr_blackboard.mtlx new file mode 100644 index 00000000..fc322b35 --- /dev/null +++ b/examples/open_pbr_blackboard.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_blood.mtlx b/examples/open_pbr_blood.mtlx new file mode 100644 index 00000000..9a0d96a3 --- /dev/null +++ b/examples/open_pbr_blood.mtlx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_brass.mtlx b/examples/open_pbr_brass.mtlx new file mode 100644 index 00000000..66b4359e --- /dev/null +++ b/examples/open_pbr_brass.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_brick.mtlx b/examples/open_pbr_brick.mtlx new file mode 100644 index 00000000..71967937 --- /dev/null +++ b/examples/open_pbr_brick.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_carpaint.mtlx b/examples/open_pbr_carpaint.mtlx index d4b24bd6..29803cd7 100644 --- a/examples/open_pbr_carpaint.mtlx +++ b/examples/open_pbr_carpaint.mtlx @@ -1,14 +1,14 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_cesium.mtlx b/examples/open_pbr_cesium.mtlx new file mode 100644 index 00000000..4fba86ed --- /dev/null +++ b/examples/open_pbr_cesium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_charcoal.mtlx b/examples/open_pbr_charcoal.mtlx new file mode 100644 index 00000000..f1b1a14a --- /dev/null +++ b/examples/open_pbr_charcoal.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_chocolate.mtlx b/examples/open_pbr_chocolate.mtlx new file mode 100644 index 00000000..51be4c17 --- /dev/null +++ b/examples/open_pbr_chocolate.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_chromium.mtlx b/examples/open_pbr_chromium.mtlx new file mode 100644 index 00000000..8b313fe0 --- /dev/null +++ b/examples/open_pbr_chromium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_cobalt.mtlx b/examples/open_pbr_cobalt.mtlx new file mode 100644 index 00000000..1f0b2a96 --- /dev/null +++ b/examples/open_pbr_cobalt.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_coffee.mtlx b/examples/open_pbr_coffee.mtlx new file mode 100644 index 00000000..5c522f9c --- /dev/null +++ b/examples/open_pbr_coffee.mtlx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_concrete.mtlx b/examples/open_pbr_concrete.mtlx new file mode 100644 index 00000000..2b7b44b4 --- /dev/null +++ b/examples/open_pbr_concrete.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_cooking_oil.mtlx b/examples/open_pbr_cooking_oil.mtlx new file mode 100644 index 00000000..818ca558 --- /dev/null +++ b/examples/open_pbr_cooking_oil.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_copper.mtlx b/examples/open_pbr_copper.mtlx new file mode 100644 index 00000000..eea505b1 --- /dev/null +++ b/examples/open_pbr_copper.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_default.mtlx b/examples/open_pbr_default.mtlx index 8125541a..cf1af1ca 100644 --- a/examples/open_pbr_default.mtlx +++ b/examples/open_pbr_default.mtlx @@ -1,5 +1,5 @@ - + diff --git a/examples/open_pbr_diamond.mtlx b/examples/open_pbr_diamond.mtlx new file mode 100644 index 00000000..2d088fb3 --- /dev/null +++ b/examples/open_pbr_diamond.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_egg_shell.mtlx b/examples/open_pbr_egg_shell.mtlx new file mode 100644 index 00000000..9e9a3aa1 --- /dev/null +++ b/examples/open_pbr_egg_shell.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_eye_cornea.mtlx b/examples/open_pbr_eye_cornea.mtlx new file mode 100644 index 00000000..ab69360c --- /dev/null +++ b/examples/open_pbr_eye_cornea.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_eye_lens.mtlx b/examples/open_pbr_eye_lens.mtlx new file mode 100644 index 00000000..da534cfd --- /dev/null +++ b/examples/open_pbr_eye_lens.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_eye_sclera.mtlx b/examples/open_pbr_eye_sclera.mtlx new file mode 100644 index 00000000..50d5cdd3 --- /dev/null +++ b/examples/open_pbr_eye_sclera.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_gasoline.mtlx b/examples/open_pbr_gasoline.mtlx new file mode 100644 index 00000000..fc92408d --- /dev/null +++ b/examples/open_pbr_gasoline.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_germanium.mtlx b/examples/open_pbr_germanium.mtlx new file mode 100644 index 00000000..2b659097 --- /dev/null +++ b/examples/open_pbr_germanium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_glass.mtlx b/examples/open_pbr_glass.mtlx index d4148800..95bccb64 100644 --- a/examples/open_pbr_glass.mtlx +++ b/examples/open_pbr_glass.mtlx @@ -1,13 +1,13 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_gold.mtlx b/examples/open_pbr_gold.mtlx new file mode 100644 index 00000000..3bdb43d2 --- /dev/null +++ b/examples/open_pbr_gold.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_gray_card.mtlx b/examples/open_pbr_gray_card.mtlx new file mode 100644 index 00000000..32367a82 --- /dev/null +++ b/examples/open_pbr_gray_card.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_honey.mtlx b/examples/open_pbr_honey.mtlx deleted file mode 100644 index 4c689193..00000000 --- a/examples/open_pbr_honey.mtlx +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/open_pbr_honey_crystallized.mtlx b/examples/open_pbr_honey_crystallized.mtlx new file mode 100644 index 00000000..9dcccb78 --- /dev/null +++ b/examples/open_pbr_honey_crystallized.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_honey_liquid.mtlx b/examples/open_pbr_honey_liquid.mtlx new file mode 100644 index 00000000..c806ecf8 --- /dev/null +++ b/examples/open_pbr_honey_liquid.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_ice.mtlx b/examples/open_pbr_ice.mtlx new file mode 100644 index 00000000..cbb31e14 --- /dev/null +++ b/examples/open_pbr_ice.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_iridium.mtlx b/examples/open_pbr_iridium.mtlx new file mode 100644 index 00000000..3c935e9c --- /dev/null +++ b/examples/open_pbr_iridium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_iron.mtlx b/examples/open_pbr_iron.mtlx new file mode 100644 index 00000000..bcd3f338 --- /dev/null +++ b/examples/open_pbr_iron.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_ketchup.mtlx b/examples/open_pbr_ketchup.mtlx index c3f08a49..b808c5b2 100644 --- a/examples/open_pbr_ketchup.mtlx +++ b/examples/open_pbr_ketchup.mtlx @@ -1,14 +1,13 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_lcd_display_6500k.mtlx b/examples/open_pbr_lcd_display_6500k.mtlx new file mode 100644 index 00000000..5c527148 --- /dev/null +++ b/examples/open_pbr_lcd_display_6500k.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_lead.mtlx b/examples/open_pbr_lead.mtlx new file mode 100644 index 00000000..4464e860 --- /dev/null +++ b/examples/open_pbr_lead.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_lightbulb.mtlx b/examples/open_pbr_light_bulb_2700k.mtlx similarity index 64% rename from examples/open_pbr_lightbulb.mtlx rename to examples/open_pbr_light_bulb_2700k.mtlx index 284d7eec..45c8952f 100644 --- a/examples/open_pbr_lightbulb.mtlx +++ b/examples/open_pbr_light_bulb_2700k.mtlx @@ -1,11 +1,11 @@ - - + + - + - + \ No newline at end of file diff --git a/examples/open_pbr_light_bulb_5000k.mtlx b/examples/open_pbr_light_bulb_5000k.mtlx new file mode 100644 index 00000000..dde43156 --- /dev/null +++ b/examples/open_pbr_light_bulb_5000k.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_lithium.mtlx b/examples/open_pbr_lithium.mtlx new file mode 100644 index 00000000..5887eb27 --- /dev/null +++ b/examples/open_pbr_lithium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_magnesium.mtlx b/examples/open_pbr_magnesium.mtlx new file mode 100644 index 00000000..c80aa9d2 --- /dev/null +++ b/examples/open_pbr_magnesium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_manganese.mtlx b/examples/open_pbr_manganese.mtlx new file mode 100644 index 00000000..ff3e719c --- /dev/null +++ b/examples/open_pbr_manganese.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_marble.mtlx b/examples/open_pbr_marble.mtlx new file mode 100644 index 00000000..1c7f1e5c --- /dev/null +++ b/examples/open_pbr_marble.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_mercury.mtlx b/examples/open_pbr_mercury.mtlx new file mode 100644 index 00000000..2c21d82a --- /dev/null +++ b/examples/open_pbr_mercury.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_milk.mtlx b/examples/open_pbr_milk.mtlx new file mode 100644 index 00000000..27b7932c --- /dev/null +++ b/examples/open_pbr_milk.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_molybdenum.mtlx b/examples/open_pbr_molybdenum.mtlx new file mode 100644 index 00000000..f92c5c0c --- /dev/null +++ b/examples/open_pbr_molybdenum.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_nickel.mtlx b/examples/open_pbr_nickel.mtlx new file mode 100644 index 00000000..6e67c363 --- /dev/null +++ b/examples/open_pbr_nickel.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_office_paper.mtlx b/examples/open_pbr_office_paper.mtlx new file mode 100644 index 00000000..d901b98c --- /dev/null +++ b/examples/open_pbr_office_paper.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_palladium.mtlx b/examples/open_pbr_palladium.mtlx new file mode 100644 index 00000000..f46e2f62 --- /dev/null +++ b/examples/open_pbr_palladium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_pearl.mtlx b/examples/open_pbr_pearl.mtlx index cfc69c58..79ef6d96 100644 --- a/examples/open_pbr_pearl.mtlx +++ b/examples/open_pbr_pearl.mtlx @@ -1,20 +1,19 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_petroleum.mtlx b/examples/open_pbr_petroleum.mtlx new file mode 100644 index 00000000..63b11d2a --- /dev/null +++ b/examples/open_pbr_petroleum.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_acrylic.mtlx b/examples/open_pbr_plastic_acrylic.mtlx new file mode 100644 index 00000000..bd9dd091 --- /dev/null +++ b/examples/open_pbr_plastic_acrylic.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_pc.mtlx b/examples/open_pbr_plastic_pc.mtlx new file mode 100644 index 00000000..bab55cc7 --- /dev/null +++ b/examples/open_pbr_plastic_pc.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_pet.mtlx b/examples/open_pbr_plastic_pet.mtlx new file mode 100644 index 00000000..14ccae41 --- /dev/null +++ b/examples/open_pbr_plastic_pet.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_polyurethane.mtlx b/examples/open_pbr_plastic_polyurethane.mtlx new file mode 100644 index 00000000..d0939376 --- /dev/null +++ b/examples/open_pbr_plastic_polyurethane.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_pp.mtlx b/examples/open_pbr_plastic_pp.mtlx new file mode 100644 index 00000000..d604e8c8 --- /dev/null +++ b/examples/open_pbr_plastic_pp.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_plastic_pvc.mtlx b/examples/open_pbr_plastic_pvc.mtlx new file mode 100644 index 00000000..524b2e95 --- /dev/null +++ b/examples/open_pbr_plastic_pvc.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_platinum.mtlx b/examples/open_pbr_platinum.mtlx new file mode 100644 index 00000000..693ccfbf --- /dev/null +++ b/examples/open_pbr_platinum.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_potassium.mtlx b/examples/open_pbr_potassium.mtlx new file mode 100644 index 00000000..d78fb58d --- /dev/null +++ b/examples/open_pbr_potassium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_quartz.mtlx b/examples/open_pbr_quartz.mtlx new file mode 100644 index 00000000..2f309de0 --- /dev/null +++ b/examples/open_pbr_quartz.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_rubidium.mtlx b/examples/open_pbr_rubidium.mtlx new file mode 100644 index 00000000..c3f57296 --- /dev/null +++ b/examples/open_pbr_rubidium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_salt.mtlx b/examples/open_pbr_salt.mtlx new file mode 100644 index 00000000..6cd52192 --- /dev/null +++ b/examples/open_pbr_salt.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_sand.mtlx b/examples/open_pbr_sand.mtlx new file mode 100644 index 00000000..228bfa6a --- /dev/null +++ b/examples/open_pbr_sand.mtlx @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_sapphire.mtlx b/examples/open_pbr_sapphire.mtlx new file mode 100644 index 00000000..d30c669a --- /dev/null +++ b/examples/open_pbr_sapphire.mtlx @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_silicon.mtlx b/examples/open_pbr_silicon.mtlx new file mode 100644 index 00000000..1dbe2356 --- /dev/null +++ b/examples/open_pbr_silicon.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_silver.mtlx b/examples/open_pbr_silver.mtlx new file mode 100644 index 00000000..b09d9211 --- /dev/null +++ b/examples/open_pbr_silver.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_i.mtlx b/examples/open_pbr_skin_i.mtlx new file mode 100644 index 00000000..e8cb63ad --- /dev/null +++ b/examples/open_pbr_skin_i.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_ii.mtlx b/examples/open_pbr_skin_ii.mtlx new file mode 100644 index 00000000..5496ba3b --- /dev/null +++ b/examples/open_pbr_skin_ii.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_iii.mtlx b/examples/open_pbr_skin_iii.mtlx new file mode 100644 index 00000000..9add76aa --- /dev/null +++ b/examples/open_pbr_skin_iii.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_iv.mtlx b/examples/open_pbr_skin_iv.mtlx new file mode 100644 index 00000000..f0efa2b1 --- /dev/null +++ b/examples/open_pbr_skin_iv.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_v.mtlx b/examples/open_pbr_skin_v.mtlx new file mode 100644 index 00000000..450b2ec9 --- /dev/null +++ b/examples/open_pbr_skin_v.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_skin_vi.mtlx b/examples/open_pbr_skin_vi.mtlx new file mode 100644 index 00000000..22890100 --- /dev/null +++ b/examples/open_pbr_skin_vi.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_snow.mtlx b/examples/open_pbr_snow.mtlx new file mode 100644 index 00000000..d2e9ed08 --- /dev/null +++ b/examples/open_pbr_snow.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_soapbubble.mtlx b/examples/open_pbr_soapbubble.mtlx index 89245f00..f5ed6c32 100644 --- a/examples/open_pbr_soapbubble.mtlx +++ b/examples/open_pbr_soapbubble.mtlx @@ -1,15 +1,15 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_sodium.mtlx b/examples/open_pbr_sodium.mtlx new file mode 100644 index 00000000..2b6461c5 --- /dev/null +++ b/examples/open_pbr_sodium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_stainless_steel.mtlx b/examples/open_pbr_stainless_steel.mtlx new file mode 100644 index 00000000..1e2364f0 --- /dev/null +++ b/examples/open_pbr_stainless_steel.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_tire.mtlx b/examples/open_pbr_tire.mtlx new file mode 100644 index 00000000..261908fe --- /dev/null +++ b/examples/open_pbr_tire.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_titanium.mtlx b/examples/open_pbr_titanium.mtlx new file mode 100644 index 00000000..ff40817f --- /dev/null +++ b/examples/open_pbr_titanium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_toner_black.mtlx b/examples/open_pbr_toner_black.mtlx new file mode 100644 index 00000000..0bc0e98f --- /dev/null +++ b/examples/open_pbr_toner_black.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_tungsten.mtlx b/examples/open_pbr_tungsten.mtlx new file mode 100644 index 00000000..a769bf9a --- /dev/null +++ b/examples/open_pbr_tungsten.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_vanadium.mtlx b/examples/open_pbr_vanadium.mtlx new file mode 100644 index 00000000..f48b43f0 --- /dev/null +++ b/examples/open_pbr_vanadium.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_velvet.mtlx b/examples/open_pbr_velvet.mtlx index 2b2da96c..247ffffe 100644 --- a/examples/open_pbr_velvet.mtlx +++ b/examples/open_pbr_velvet.mtlx @@ -1,13 +1,14 @@ - + - - - - + + + + + diff --git a/examples/open_pbr_water.mtlx b/examples/open_pbr_water.mtlx new file mode 100644 index 00000000..07ecc50c --- /dev/null +++ b/examples/open_pbr_water.mtlx @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_whiteboard.mtlx b/examples/open_pbr_whiteboard.mtlx new file mode 100644 index 00000000..3460792a --- /dev/null +++ b/examples/open_pbr_whiteboard.mtlx @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/open_pbr_zinc.mtlx b/examples/open_pbr_zinc.mtlx new file mode 100644 index 00000000..2611836c --- /dev/null +++ b/examples/open_pbr_zinc.mtlx @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 7a6b10fa..7fd107ec 100644 --- a/index.html +++ b/index.html @@ -9,8 +9,7 @@ homepage - -
OpenPBR Surface specification v1.1, 2024-06-28
+
*Specification v1.1, 2024-06-28.     homepage *

This document is a specification of a surface shading model intended as a standard for computer graphics: the OpenPBR Surface model. Designed as an über-shader, it aims to be capable of accurately modeling the vast majority of CG materials used in practical visual effects and feature animation productions. The model has been developed as a synthesis of the Autodesk Standard Surface and the Adobe Standard Material models. @@ -202,8 +201,6 @@ \end{equation} where $T^2_\mathrm{coat}$ accounts for the total volumetric transmittance of the coat along the input and output rays. Similarly if the coat is rough this will effectively roughen the substrate BSDF lobe also, which can be accounted for approximately via various heuristics. -Complete conformance to the spec is defined as reproducing all the physical inter-layer light transport effects, though this is not typically practical. In practice, each implementation must decide what level of approximation to use for the light transport within layers, trading off accuracy for efficiency according to its own particular use case. - Mixing ------------------------------------- @@ -294,7 +291,7 @@ However the parameters of the physical model that we describe do not specify all of the assumptions that would be needed to obtain a good visual match. We recommend therefore, for the purposes of asset exchange, that the parameters be packaged with certain metadata that provides the following missing information: - The version of the specification implemented. - - The assumed color space of all the color parameters. If unspecified, following MaterialX [#Smythe2016], by default this color space is assumed to be [ACEScg](https://docs.acescentral.com/specifications/acescg/). + - The assumed color space of all the color parameters. If unspecified, following MaterialX [#Smythe2016], by default this color space is assumed to be [ACEScg](https://docs.acescentral.com/specifications/acescg/). [^ingamut] - The floating-point conversion factor from the parameters given in world space length units to meters. @@ -369,9 +366,7 @@ In addition to the weight and opacity parameters explicit in the model structure above, the properties of each component slab are controlled via further parameters detailed below (see the Parameter reference section for the full set). -Since the model is simply a physical description of a material structure, in principle it would be amenable to solution via accurate methods such as those developed in [#Jakob2014], [#Belcour2018], and [#Zeltner2018], which attempt to compute all the various modes of reflection and transmission through the whole stack of layers, generating a final BSDF which is not necessarily a simple linear combination of the individual interface BSDFs. However we want this material model to be renderable on a wide range of platforms, from offline path tracers all the way to real-time game engines on mobile devices. Enforcing a particular implementation would make the use of the material model impractical for certain classes of renderers, and ultimately make the model less useful. For this reason we consider the choice of a specific implementation of the final BSDF to be outside the scope of this specification. - -For convenience and efficiency, at present it is most likely to be mapped to a model consisting of a mixture of BSDF lobes similar to the Autodesk Standard Surface shader [#Georgiev2019] and its representation in MaterialX. An example derivation of such a model is provided in the ["Reduction to a mixture of lobes"](index.html#model/reductiontoamixtureoflobes) section below. We also provide a [reference implementation](reference/open_pbr_surface.mtlx) in MaterialX based on this derivation. +Since the model is simply a physical description of a material structure, in principle it would be amenable to solution via accurate methods such as those developed in [#Jakob2014], [#Belcour2018], and [#Zeltner2018], which attempt to compute all the various modes of reflection and transmission through the whole stack of layers, generating a final BSDF which is not necessarily a simple linear combination of the individual interface BSDFs. At present however, for the reasons described in the Flexibility of implementation section, it is most likely to be mapped to a model consisting of a mixture of BSDF lobes similar to the Autodesk Standard Surface shader [#Georgiev2019] and its representation in MaterialX. An example derivation of such a model is provided in the ["Reduction to a mixture of lobes"](index.html#model/reductiontoamixtureoflobes) section below. We also provide a [reference implementation](reference/open_pbr_surface.mtlx) in MaterialX based on this derivation. We now discuss the detailed form of the BSDFs and media of the slabs in the structure. @@ -428,6 +423,11 @@ - **`specular_roughness_anisotropy`** for $f_\mathrm{dielectric}$ and $f_\mathrm{conductor}$, and **`coat_roughness_anisotropy`** for $f_\mathrm{coat}$, specify $a \in [0, 1]$ (the degree to which the NDF is stretched in the direction of the local surface tangent). The resulting NDF $\alpha_t$, $\alpha_b$ parameters are then determined by equation [openpbr-anisotropy-formula]. Note that the appearance of the specular highlight is identical for tangent vectors of opposite directions; this also allows the preservation of value when converting to or from other models that support directional anisotropy. +![](images/carbon_fiber_a0.0.png width=99%) ![](images/carbon_fiber_a0.5.png width=99%) ![](images/carbon_fiber_a0.9.png width=99%) +
+ ![Figure [anisotropy]: Textured **`geometry_tangent`**, with **`specular_roughness_anisotropy`** varying over 0 (default), 0.5, 0.9.](dummy) +
+ ### Multiple Scattering The single-scattering microfacet BRDF of equation [microfacet_brdf_ss] does not conserve energy, as it neglects to account for multiple scattering between the microfacets. An implementation should ideally account for this, via one of a number of schemes, otherwise the reflection from rough metals and dielectrics is dimmer and less saturated than it should be. A fully accurate approach is described in [#Heitz2016a], where the multiple bounces are explicitly modeled via Monte Carlo. Simpler approximate models are presented in [#Kulla2017] (which functions by adding compensation lobes to account for the missing energy), and [#Turquin2019] (which scales the albedo of the lobe to maintain energy preservation at the expense of reciprocity). @@ -435,7 +435,7 @@ ### Retroreflectivity It is useful to be able to model *retroreflective* materials in which the light is predominantly scattered backwards towards its source, which are familiar in safety applications such as road markings, signs, vehicles and clothing items. Such materials are typically designed to be retroreflective via a substructure of elements which preferentially scatter light backwards. Various models have been proposed, but we adopt here the empirically-based approach of [#Belcour2014], in which the standard conductor microfacet BRDF is made retroreflective via a simple modification, which produces a visually plausible retroreflective effect. -It can be shown [#Raab2025] that this is equivalent to simply reflecting the view vector about the shading normal $N$ before evaluation or sampling of the BRDF, i.e.: +It can be shown [#Portsmouth2025] that this is equivalent to simply reflecting the view vector about the shading normal $N$ before evaluation or sampling of the BRDF, i.e.: \begin{equation} f_\mathrm{retroreflective}(\omega_i, \omega_o) = f_\mathrm{microfacet}(\mathrm{reflect}(\omega_i, N), \omega_o) \end{equation} @@ -443,14 +443,9 @@ \begin{equation} f_\mathrm{conductor} \rightarrow (1 - w_\mathrm{retro}) f_\mathrm{conductor} + w_\mathrm{retro}f_\mathrm{retroreflective} \end{equation} -This is applied in both the metallic BRDF $f_\mathrm{conductor}$ and dielectric BSDF $f_\mathrm{dielectric}$. Howevever, in the dielectric case we require that the view vector reflection is applied in the BRDF *only*, leaving the BTDF unchanged, since this produces a more physically plausible look with undisturbed refraction, while remaining energy conserving and reciprocal [#Raab2025],. +This is applied in both the metallic BRDF $f_\mathrm{conductor}$ and dielectric BSDF $f_\mathrm{dielectric}$. Howevever, in the dielectric case we require that the view vector reflection is applied in the BRDF *only*, leaving the BTDF unchanged, since this produces a more physically plausible look with undisturbed refraction, while remaining energy conserving and reciprocal [#Portsmouth2025],. -![](images/carbon_fiber_a0.0.png width=99%) ![](images/carbon_fiber_a0.5.png width=99%) ![](images/carbon_fiber_a0.9.png width=99%) -
- ![Figure [anisotropy]: Textured **`geometry_tangent`**, with **`specular_roughness_anisotropy`** varying over 0 (default), 0.5, 0.9.](dummy) -
- Base Substrate ------------------------------------- @@ -810,7 +805,7 @@ The phase function anisotropy $g$ of the medium is taken to be given directly by the **`subsurface_scatter_anisotropy`** parameter [^anisotropy_g]. It is assumed that the phase function has the standard Henyey--Greenstein form. -Once the underlying volumetric medium properties $\boldsymbol{\mu}_t$, $\boldsymbol{\alpha}$ and $g$ are determined, implementations are free to choose how to compute the light transport in the subsurface medium according to their use case, for example accurately via volumetric path tracing ([#Novak2018], [#Pharr2023]), or approximately via a bidirectional scattering surface reflectance distribution (BSSRDF) model using e.g. the dipole approximation [#Jensen2001].``` +Once the underlying volumetric medium properties $\boldsymbol{\mu}_t$, $\boldsymbol{\alpha}$ and $g$ are determined, implementations are free to choose how to compute the light transport in the subsurface medium according to their use case, for example accurately via volumetric path tracing ([#Novak2018], [#Pharr2023]), or approximately via a bidirectional scattering surface reflectance distribution (BSSRDF) model using e.g. the dipole approximation [#Jensen2001]. Note that the default value of **`subsurface_radius_scale`** is set at $(1, 0.5, 0.25)$ to approximate the effect of Rayleigh scattering. If we roughly approximate the wavelength corresponding to each of the RGB channels as $\lambda/\mathrm{nm} \approx 650, 550, 450$ and assume the radii scale like the reciprocal of the extinction, then since in Rayleigh scattering the extinction scales like $\lambda^{-4}$ for light of wavelength $\lambda$ the expected relative magnitudes of the radii are $(1, (550/650)^4, (450/650)^4) \approx (1, 0.5, 0.25)$, hence the chosen default. This provides a slightly more realistic default look for the subsurface than resulting from gray radii. @@ -1213,7 +1208,7 @@ * +-------------------------------------------------+ * ******************************************************* -The intensity of the EDF is controlled by a luminance value with color and weight multipliers. The color and weight act as multipliers, i.e. the HDR emission in the model color space is defined to have a color given by **`emission_weight`** * **`emission_color`** * **`emission_luminance`**. The **`emission_luminance`** parameter thus refers to the luminance the emissive layer would have when the color is white and weight is 1, and in the absence of coat and fuzz. Thus the final resulting luminance may be less than the input parameter, or even zero if the color or weight are zeroed. +The intensity of the EDF is controlled by a luminance value with color and weight multipliers. The color and weight act as multipliers, i.e. the HDR emission in the model color space is defined to have a color given by **`emission_weight`** * **`emission_color`** * **`emission_luminance`**. The **`emission_luminance`** parameter thus refers to the luminance the emissive layer would have when the color is white and weight is 1, and in the absence of coat and fuzz. Thus the final resulting luminance may be less than the input parameter, or even zero if the color or weight are zeroed. Note that the **`emission_color`** components may exceed 1, in order to be able to plug in an HDR texture. [^ingamut] Moreover, the overall material luminance may be further reduced in the presence of coat or fuzz, as they can absorb light coming from the emissive layer before it exits the surface. The emission from the top surface should in principle gain a directional dependence due to the combined effects of absorption, total internal reflection (TIR) and multiple bounces in the coat layer, and absorption in the fuzz layer. The combined effect should result mostly in darkening and saturation at grazing angles. @@ -1224,7 +1219,7 @@ -------------------------|-----------|----------|:---------------:|:-------------:|:-------------:|---------------------------------------------- **`emission_weight`** | Weight | `float` | $ [0, 1] $ | | $ 0 $ | Emission weight luminance multiplier **`emission_luminance`** | Luminance | `float` | $ [0, \infty) $ | $ [0, 1000] $ | $ 1000 $ | Emission luminance, in cd/m^2 (aka. nits) -**`emission_color`** | Color | `color3` | $ [0, 1]^3 $ | | $ (1, 1, 1) $ | Emission color luminance multiplier +**`emission_color`** | Color | `color3` | $[0, \infty)^3$ | | $ (1, 1, 1) $ | Emission color multiplier ![](images/emitting_lava.png width=90% align=left) ![](images/emission_under_coat.png width=90% align=right)
@@ -1335,7 +1330,9 @@ E_R[f^R_\mathrm{diffuse}] + E_T[f^T_\mathrm{diffuse}] = S \le 1 \ . \end{equation} At the default of zero anisotropy ($g=0$) the energy is balanced equally between diffuse reflection and transmission. - The diffuse transmission lobe shape (in both hemispheres) is assumed to be controlled by the **`base_diffuse_roughness`** parameter. Typically the diffuse lobes $f_+$, $f_-$ will be represented by an Oren-Nayar lobe flipped into the appropriate hemisphere (which technically should be modified due to the dielectric boundaries, though a renderer may choose to ignore this). This model is useful for rendering cases such as light scattering through a thin sheet of paper (Figure [thinwalled]). + The diffuse transmission lobe shape (in both hemispheres) is assumed to be controlled by the **`base_diffuse_roughness`** parameter. Typically the diffuse lobes $f_+$, $f_-$ will be represented by an Oren-Nayar lobe flipped into the appropriate hemisphere (which technically should be modified due to the dielectric boundaries, though a renderer may choose to ignore this). Note that in this mode, the **`subsurface_radius`** and **`subsurface_radius_scale`** are ignored and have no effect, since the scattering MFP is infinitesimal. + + This model is useful for rendering cases such as light scattering through a thin sheet of paper (Figure [thinwalled]). ![](images/thin_walled1.jpg width=99% align=right) ![](images/thin_walled2.jpg width=99% align=left) @@ -1517,6 +1514,20 @@ We provide a [reference implementation](reference/open_pbr_surface.mtlx) in MaterialX, which is based on the derivation in the previous section and the implementation of Autodesk Standard Surface [#Georgiev2019]. +Flexibility of implementation +============================= + +We want this material model to be renderable on a wide range of platforms, from offline path tracers all the way to real-time game engines on mobile devices. + +The Historical background and objectives section explains how the goal of this specification is to provide an ideal, reference appearance. Complete conformance to the specification is defined as reproducing all the physical light transport effects of that ideal appearance. + +However, a number of features can be computationally expensive and therefore impractical to support under certain constraints. Enforcing a specific implementation would tailor the material model to a particular set of constraints, limiting its versatility, which would ultimately make it less useful. For this reason, the specification focuses solely on defining the target appearance. The choice of the final BSDF implementation and its associated trade-off is left entirely to the implementer, allowing them to best suit it to their needs. + +Each implementation must decide what level of approximation to use, trading off accuracy for efficiency according to its own particular use case. As a guideline, we suggest approaching those approximations conceptually like different level of detail (LOD) variants of an asset. Just like such an asset would become coarser with distance while retaining as much detail as necessary to remain faithful to the original, an implementation of OpenPBR may decide to make simplifications, as long as the result remains reasonably faithful to the intent given the practical constraints. In the most extreme hypothetical case, the model might even get reduced to as little as a single Lambert BRDF. + +This means the implementer must carefully consider the handling of parameters they do not plan to fully support. A parameter that drastically modifies the appearance of a material should not be discarded just because the corresponding effect is not supported. As an example, in a renderer that doesn't have subsurface scattering, the subsurface color might be used as the albedo of a diffuse BRDF. + +