From ea4c2ef0b274eed9d2fd5947652695299692fcff Mon Sep 17 00:00:00 2001 From: Alaska Date: Wed, 13 Sep 2023 18:48:45 +1200 Subject: [PATCH 1/4] Add panels to Principled BSDF UI --- .../nodes/node_shader_bsdf_principled.cc | 178 ++++++++++-------- 1 file changed, 98 insertions(+), 80 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc index 1179fa869c2..2d7edfbf876 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc @@ -19,9 +19,43 @@ static void node_declare(NodeDeclarationBuilder &b) * Define static socket numbers to avoid string based lookups for GPU material creation as these * could run on animated materials. */ + + b.use_custom_socket_order(); + + b.add_output("BSDF"); + b.add_input("Base Color").default_value({0.8f, 0.8f, 0.8f, 1.0f}); #define SOCK_BASE_COLOR_ID 0 - b.add_input("Subsurface") + b.add_input("Metallic") + .default_value(0.0f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_METALLIC_ID 1 + b.add_input("Roughness") + .default_value(0.5f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_ROUGHNESS_ID 2 + b.add_input("IOR").default_value(1.45f).min(1.0f).max(1000.0f); +#define SOCK_IOR_ID 3 + b.add_input("Transmission") + .default_value(0.0f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_TRANSMISSION_ID 4 + b.add_input("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); +#define SOCK_ALPHA_ID 5 + b.add_input("Normal").hide_value(); +#define SOCK_NORMAL_ID 6 + b.add_input("Weight").unavailable(); +#define SOCK_WEIGHT_ID 7 + + /* Panel for Subsurface scattering settings. */ + PanelDeclarationBuilder &sss = b.add_panel("Subsurface").default_closed(true); + sss.add_input("Subsurface") .default_value(0.0f) .min(0.0f) .max(1.0f) @@ -29,81 +63,81 @@ static void node_declare(NodeDeclarationBuilder &b) .description( "Blend between diffuse surface and subsurface scattering. " "Typically should be zero or one (either fully diffuse or subsurface)"); -#define SOCK_SUBSURFACE_ID 1 - b.add_input("Subsurface Scale") +#define SOCK_SUBSURFACE_ID 8 + sss.add_input("Subsurface Scale") .default_value(0.05f) .min(0.0f) .max(10.0f) .subtype(PROP_DISTANCE) .description("Scale of the subsurface scattering (multiplied with Radius)"); -#define SOCK_SUBSURFACE_SCALE_ID 2 - b.add_input("Subsurface Radius") +#define SOCK_SUBSURFACE_SCALE_ID 9 + sss.add_input("Subsurface Radius") .default_value({1.0f, 0.2f, 0.1f}) .min(0.0f) .max(100.0f) .compact() .description("Scattering radius to use for subsurface component (multiplied with Scale)"); -#define SOCK_SUBSURFACE_RADIUS_ID 3 - b.add_input("Subsurface IOR") +#define SOCK_SUBSURFACE_RADIUS_ID 10 + sss.add_input("Subsurface IOR") .default_value(1.4f) .min(1.01f) .max(3.8f) .subtype(PROP_FACTOR) .description("Index of refraction used for rays that enter the subsurface component"); -#define SOCK_SUBSURFACE_IOR_ID 4 - b.add_input("Subsurface Anisotropy") +#define SOCK_SUBSURFACE_IOR_ID 11 + sss.add_input("Subsurface Anisotropy") .default_value(0.0f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR); -#define SOCK_SUBSURFACE_ANISOTROPY_ID 5 - b.add_input("Metallic") - .default_value(0.0f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_METALLIC_ID 6 - b.add_input("Specular") +#define SOCK_SUBSURFACE_ANISOTROPY_ID 12 + + /* Panel for Specular settings. */ + PanelDeclarationBuilder &spec = b.add_panel("Specular").default_closed(true); + spec.add_input("Specular") .default_value(0.5f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR); -#define SOCK_SPECULAR_ID 7 - b.add_input("Specular Tint") +#define SOCK_SPECULAR_ID 13 + spec.add_input("Specular Tint") .default_value(0.0f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR); -#define SOCK_SPECULAR_TINT_ID 8 - b.add_input("Roughness") +#define SOCK_SPECULAR_TINT_ID 14 + spec.add_input("Anisotropic") + .default_value(0.0f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_ANISOTROPIC_ID 15 + spec.add_input("Anisotropic Rotation") + .default_value(0.0f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_ANISOTROPIC_ROTATION_ID 16 + spec.add_input("Tangent").hide_value(); +#define SOCK_TANGENT_ID 17 + + /* Panel for Sheen settings. */ + PanelDeclarationBuilder &sheen = b.add_panel("Sheen").default_closed(true); + sheen.add_input("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype( + PROP_FACTOR); +#define SOCK_SHEEN_ID 18 + sheen.add_input("Sheen Roughness") .default_value(0.5f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR); -#define SOCK_ROUGHNESS_ID 9 - b.add_input("Anisotropic") - .default_value(0.0f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_ANISOTROPIC_ID 10 - b.add_input("Anisotropic Rotation") - .default_value(0.0f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_ANISOTROPIC_ROTATION_ID 11 - b.add_input("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); -#define SOCK_SHEEN_ID 12 - b.add_input("Sheen Roughness") - .default_value(0.5f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_SHEEN_ROUGHNESS_ID 13 - b.add_input("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f}); -#define SOCK_SHEEN_TINT_ID 14 - b.add_input("Coat") +#define SOCK_SHEEN_ROUGHNESS_ID 19 + sheen.add_input("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f}); +#define SOCK_SHEEN_TINT_ID 20 + + /* Panel for Coat settings. */ + PanelDeclarationBuilder &coat = b.add_panel("Coat").default_closed(true); + coat.add_input("Coat") .default_value(0.0f) .min(0.0f) .max(1.0f) @@ -111,54 +145,38 @@ static void node_declare(NodeDeclarationBuilder &b) .description( "Controls the intensity of the coat layer, both the reflection and the tinting. " "Typically should be zero or one for physically-based materials"); -#define SOCK_COAT_ID 15 - b.add_input("Coat Roughness") +#define SOCK_COAT_ID 21 + coat.add_input("Coat Roughness") .default_value(0.03f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR) .description("The roughness of the coat layer"); -#define SOCK_COAT_ROUGHNESS_ID 16 - b.add_input("Coat IOR") +#define SOCK_COAT_ROUGHNESS_ID 22 + coat.add_input("Coat IOR") .default_value(1.5f) .min(1.0f) .max(4.0f) .description( - "The index of refraction of the coat layer (affects its reflectivity as well " - "as the falloff of coat tinting)"); -#define SOCK_COAT_IOR_ID 17 - b.add_input("Coat Tint") + "The index of refraction of the coat layer " + "(affects its reflectivity as well as the falloff of coat tinting)"); +#define SOCK_COAT_IOR_ID 23 + coat.add_input("Coat Tint") .default_value({1.0f, 1.0f, 1.0f, 1.0f}) .description( "Adds a colored tint to the coat layer by modeling absorption in the layer. " - "Saturation increases at shallower angles, as the light travels farther through the " - "medium " - "(depending on the Coat IOR)"); -#define SOCK_COAT_TINT_ID 18 - b.add_input("IOR").default_value(1.45f).min(1.0f).max(1000.0f); -#define SOCK_IOR_ID 19 - b.add_input("Transmission") - .default_value(0.0f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_TRANSMISSION_ID 20 - b.add_input("Emission").default_value({1.0f, 1.0f, 1.0f, 1.0f}); -#define SOCK_EMISSION_ID 21 - b.add_input("Emission Strength").default_value(0.0).min(0.0f).max(1000000.0f); -#define SOCK_EMISSION_STRENGTH_ID 22 - b.add_input("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); -#define SOCK_ALPHA_ID 23 - b.add_input("Normal").hide_value(); -#define SOCK_NORMAL_ID 24 - b.add_input("Coat Normal").hide_value(); + "Saturation increases at shallower angles, as the light travels farther " + "through the medium (depending on the Coat IOR)"); +#define SOCK_COAT_TINT_ID 24 + coat.add_input("Coat Normal").hide_value(); #define SOCK_COAT_NORMAL_ID 25 - b.add_input("Tangent").hide_value(); -#define SOCK_TANGENT_ID 26 - b.add_input("Weight").unavailable(); -#define SOCK_WEIGHT_ID 27 - b.add_output("BSDF"); -#define SOCK_BSDF_ID 28 + + /* Panel for Emission settings. */ + PanelDeclarationBuilder &emis = b.add_panel("Emission").default_closed(true); + emis.add_input("Emission").default_value({1.0f, 1.0f, 1.0f, 1.0f}); +#define SOCK_EMISSION_ID 26 + emis.add_input("Emission Strength").default_value(0.0).min(0.0f).max(1000000.0f); +#define SOCK_EMISSION_STRENGTH_ID 27 } static void node_shader_buts_principled(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) -- 2.30.2 From b9bdc0daa3026f1ff6b162b630689d0b028e0d73 Mon Sep 17 00:00:00 2001 From: Alaska Date: Wed, 13 Sep 2023 18:55:54 +1200 Subject: [PATCH 2/4] Re-arrange EEVEE inputs to fix crashing --- .../gpu_shader_material_principled.glsl | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 6ad5ac6c289..8ecca43f551 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -19,33 +19,33 @@ float principled_sheen(float NV, float rough) } void node_bsdf_principled(vec4 base_color, - float subsurface, + float metallic, + float roughness, + float ior, + float transmission, + float alpha, + vec3 N, + float weight, + float subsurface, /* Start of SSS */ float subsurface_scale, vec3 subsurface_radius, float subsurface_ior, float subsurface_anisotropy, - float metallic, - float specular, + float specular, /* Start of Specular */ float specular_tint, - float roughness, float anisotropic, float anisotropic_rotation, - float sheen, + vec3 T, + float sheen, /* Start of Sheen */ float sheen_roughness, vec4 sheen_tint, - float coat, + float coat, /* Start of Coat */ float coat_roughness, float coat_ior, vec4 coat_tint, - float ior, - float transmission, - vec4 emission, - float emission_strength, - float alpha, - vec3 N, vec3 CN, - vec3 T, - float weight, + vec4 emission, /* Start of Emission */ + float emission_strength, const float do_diffuse, const float do_coat, const float do_refraction, -- 2.30.2 From 72186f949a40ed63e8134c359bf492a68b8c43c9 Mon Sep 17 00:00:00 2001 From: Alaska Date: Wed, 13 Sep 2023 19:17:41 +1200 Subject: [PATCH 3/4] Remove code comments that was causing crashing --- .../material/gpu_shader_material_principled.glsl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 8ecca43f551..2be0899fa76 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -26,25 +26,25 @@ void node_bsdf_principled(vec4 base_color, float alpha, vec3 N, float weight, - float subsurface, /* Start of SSS */ + float subsurface, float subsurface_scale, vec3 subsurface_radius, float subsurface_ior, float subsurface_anisotropy, - float specular, /* Start of Specular */ + float specular, float specular_tint, float anisotropic, float anisotropic_rotation, vec3 T, - float sheen, /* Start of Sheen */ + float sheen, float sheen_roughness, vec4 sheen_tint, - float coat, /* Start of Coat */ + float coat, float coat_roughness, float coat_ior, vec4 coat_tint, vec3 CN, - vec4 emission, /* Start of Emission */ + vec4 emission, float emission_strength, const float do_diffuse, const float do_coat, -- 2.30.2 From 3985c8a6e70d95847c60e158d9fbe827b167d415 Mon Sep 17 00:00:00 2001 From: Alaska Date: Thu, 14 Sep 2023 10:59:23 +1200 Subject: [PATCH 4/4] Place coat before sheen to match layering inside the Principled BSDF shader --- .../gpu_shader_material_principled.glsl | 6 +-- .../nodes/node_shader_bsdf_principled.cc | 38 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl index 2be0899fa76..87e459b095a 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_principled.glsl @@ -36,14 +36,14 @@ void node_bsdf_principled(vec4 base_color, float anisotropic, float anisotropic_rotation, vec3 T, - float sheen, - float sheen_roughness, - vec4 sheen_tint, float coat, float coat_roughness, float coat_ior, vec4 coat_tint, vec3 CN, + float sheen, + float sheen_roughness, + vec4 sheen_tint, vec4 emission, float emission_strength, const float do_diffuse, diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc index 2d7edfbf876..4cd09c181d7 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.cc @@ -121,20 +121,6 @@ static void node_declare(NodeDeclarationBuilder &b) spec.add_input("Tangent").hide_value(); #define SOCK_TANGENT_ID 17 - /* Panel for Sheen settings. */ - PanelDeclarationBuilder &sheen = b.add_panel("Sheen").default_closed(true); - sheen.add_input("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype( - PROP_FACTOR); -#define SOCK_SHEEN_ID 18 - sheen.add_input("Sheen Roughness") - .default_value(0.5f) - .min(0.0f) - .max(1.0f) - .subtype(PROP_FACTOR); -#define SOCK_SHEEN_ROUGHNESS_ID 19 - sheen.add_input("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f}); -#define SOCK_SHEEN_TINT_ID 20 - /* Panel for Coat settings. */ PanelDeclarationBuilder &coat = b.add_panel("Coat").default_closed(true); coat.add_input("Coat") @@ -145,14 +131,14 @@ static void node_declare(NodeDeclarationBuilder &b) .description( "Controls the intensity of the coat layer, both the reflection and the tinting. " "Typically should be zero or one for physically-based materials"); -#define SOCK_COAT_ID 21 +#define SOCK_COAT_ID 18 coat.add_input("Coat Roughness") .default_value(0.03f) .min(0.0f) .max(1.0f) .subtype(PROP_FACTOR) .description("The roughness of the coat layer"); -#define SOCK_COAT_ROUGHNESS_ID 22 +#define SOCK_COAT_ROUGHNESS_ID 19 coat.add_input("Coat IOR") .default_value(1.5f) .min(1.0f) @@ -160,16 +146,30 @@ static void node_declare(NodeDeclarationBuilder &b) .description( "The index of refraction of the coat layer " "(affects its reflectivity as well as the falloff of coat tinting)"); -#define SOCK_COAT_IOR_ID 23 +#define SOCK_COAT_IOR_ID 20 coat.add_input("Coat Tint") .default_value({1.0f, 1.0f, 1.0f, 1.0f}) .description( "Adds a colored tint to the coat layer by modeling absorption in the layer. " "Saturation increases at shallower angles, as the light travels farther " "through the medium (depending on the Coat IOR)"); -#define SOCK_COAT_TINT_ID 24 +#define SOCK_COAT_TINT_ID 21 coat.add_input("Coat Normal").hide_value(); -#define SOCK_COAT_NORMAL_ID 25 +#define SOCK_COAT_NORMAL_ID 22 + + /* Panel for Sheen settings. */ + PanelDeclarationBuilder &sheen = b.add_panel("Sheen").default_closed(true); + sheen.add_input("Sheen").default_value(0.0f).min(0.0f).max(1.0f).subtype( + PROP_FACTOR); +#define SOCK_SHEEN_ID 23 + sheen.add_input("Sheen Roughness") + .default_value(0.5f) + .min(0.0f) + .max(1.0f) + .subtype(PROP_FACTOR); +#define SOCK_SHEEN_ROUGHNESS_ID 24 + sheen.add_input("Sheen Tint").default_value({1.0f, 1.0f, 1.0f, 1.0f}); +#define SOCK_SHEEN_TINT_ID 25 /* Panel for Emission settings. */ PanelDeclarationBuilder &emis = b.add_panel("Emission").default_closed(true); -- 2.30.2