From 4c97c7d4023341e8b7236454958ad445c0bf151b Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Thu, 14 Sep 2023 19:43:01 +0300 Subject: [PATCH 1/4] MaterialX: add GlassBSDF node --- .../shader/nodes/node_shader_bsdf_glass.cc | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc index 02b721e29208..19c3629c3e30 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc @@ -42,6 +42,45 @@ static int node_shader_gpu_bsdf_glass(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_bsdf_glass", in, out, GPU_constant(&use_multi_scatter)); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + if (to_type_ != NodeItem::Type::SurfaceShader) { + /* TODO: implement for BSDF and EDF */ + return empty(); + } + + NodeItem color = get_input_value("Color", NodeItem::Type::Color3); + NodeItem roughness = get_input_value("Roughness", NodeItem::Type::Float); + NodeItem ior = get_input_value("IOR", NodeItem::Type::Float); + NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); + + NodeItem res = create_node("standard_surface", NodeItem::Type::SurfaceShader); + res.set_input("base", val(1.0f)); + if (normal) { + res.set_input("normal", normal); + } + res.set_input("base_color", color); + res.set_input("diffuse_roughness", roughness); + res.set_input("metalness", val(0.0f)); + res.set_input("specular", val(0.5f)); + res.set_input("specular_color", color); + res.set_input("specular_roughness", roughness); + res.set_input("specular_IOR", ior); + res.set_input("specular_anisotropy", val(0.0f)); + res.set_input("specular_rotation", val(0.0f)); + res.set_input("transmission", val(1.0f)); + res.set_input("transmission_color", color); + res.set_input("transmission_depth", val(10.0f)); + res.set_input("transmission_scatter_anisotropy", val(0.0f)); + res.set_input("transmission_dispersion", val(0.0f)); + res.set_input("transmission_extra_roughness", val(0.0f)); + + return res; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_bsdf_glass_cc /* node type definition */ @@ -57,6 +96,7 @@ void register_node_type_sh_bsdf_glass() blender::bke::node_type_size_preset(&ntype, blender::bke::eNodeSizePreset::MIDDLE); ntype.initfunc = file_ns::node_shader_init_glass; ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_glass; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 05d7a277d8cde19b23ae98bce0b45d0c20a8bdc0 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 15 Sep 2023 13:56:35 +0300 Subject: [PATCH 2/4] MaterialX: add GlossyBSDF node and fix GlassBSDF node --- .../nodes/shader/materialx/node_item.cc | 5 +++ .../nodes/shader/materialx/node_item.h | 2 +- .../shader/nodes/node_shader_bsdf_glass.cc | 6 ---- .../shader/nodes/node_shader_bsdf_glossy.cc | 36 +++++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index af3d6af54f62..ddade2e77042 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -13,6 +13,9 @@ NodeItem::NodeItem(MaterialX::GraphElement *graph) : graph_(graph) {} NodeItem::Type NodeItem::type(const std::string &type_str) { + if (type_str == "multioutput") { + return Type::Multioutput; + } if (type_str == "string") { return Type::String; } @@ -64,6 +67,8 @@ std::string NodeItem::type(Type type) switch (type) { case Type::Any: return ""; + case Type::Multioutput: + return "multioutput"; case Type::String: return "string"; case Type::Filename: diff --git a/source/blender/nodes/shader/materialx/node_item.h b/source/blender/nodes/shader/materialx/node_item.h index 704e70832a47..d35824f5c641 100644 --- a/source/blender/nodes/shader/materialx/node_item.h +++ b/source/blender/nodes/shader/materialx/node_item.h @@ -16,7 +16,7 @@ class NodeItem { enum class Type { Any = 0, Empty, - + Multioutput, /* Value types */ String, Filename, diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc index 19c3629c3e30..447ffcea429d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc @@ -62,19 +62,13 @@ NODE_SHADER_MATERIALX_BEGIN } res.set_input("base_color", color); res.set_input("diffuse_roughness", roughness); - res.set_input("metalness", val(0.0f)); res.set_input("specular", val(0.5f)); res.set_input("specular_color", color); res.set_input("specular_roughness", roughness); res.set_input("specular_IOR", ior); - res.set_input("specular_anisotropy", val(0.0f)); - res.set_input("specular_rotation", val(0.0f)); res.set_input("transmission", val(1.0f)); res.set_input("transmission_color", color); res.set_input("transmission_depth", val(10.0f)); - res.set_input("transmission_scatter_anisotropy", val(0.0f)); - res.set_input("transmission_dispersion", val(0.0f)); - res.set_input("transmission_extra_roughness", val(0.0f)); return res; } diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc index 44e6887233bd..60956f9f0a2b 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc @@ -56,6 +56,41 @@ static int node_shader_gpu_bsdf_glossy(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_bsdf_glossy", in, out, GPU_constant(&use_multi_scatter)); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + if (to_type_ != NodeItem::Type::BSDF) { + return empty(); + } + + NodeItem color = get_input_value("Color", NodeItem::Type::Color3); + NodeItem roughness = get_input_value("Roughness", NodeItem::Type::Vector2); + NodeItem anisotropy = get_input_value("Anisotropy", NodeItem::Type::Color3); + NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); + NodeItem tangent = get_input_link("Tangent", NodeItem::Type::Vector3); + + NodeItem artistic_ior = create_node("artistic_ior", NodeItem::Type::Multioutput); + artistic_ior.add_output("ior", NodeItem::Type::Color3); + artistic_ior.add_output("extinction", NodeItem::Type::Color3); + artistic_ior.set_input("reflectivity", color); + artistic_ior.set_input("edge_color", color); + + NodeItem res = create_node("conductor_bsdf", NodeItem::Type::BSDF); + if (normal) { + res.set_input("normal", normal); + } + if (tangent) { + res.set_input("tangent", tangent); + } + res.set_input_output("ior", artistic_ior, "ior"); + res.set_input_output("extinction", artistic_ior, "extinction"); + res.set_input("roughness", roughness); + + return res; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_bsdf_glossy_cc /* node type definition */ @@ -72,6 +107,7 @@ void register_node_type_sh_bsdf_glossy() blender::bke::node_type_size_preset(&ntype, blender::bke::eNodeSizePreset::MIDDLE); ntype.initfunc = file_ns::node_shader_init_glossy; ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_glossy; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); -- 2.30.2 From f59d10b59b1f4843f7789df4d4f33861f80b061a Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 15 Sep 2023 14:28:19 +0300 Subject: [PATCH 3/4] MaterialX: add RefractionBSDF node --- .../nodes/node_shader_bsdf_refraction.cc | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc index 4e0de9a05171..c3427ec91380 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc @@ -40,6 +40,32 @@ static int node_shader_gpu_bsdf_refraction(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_bsdf_refraction", in, out); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + if (to_type_ != NodeItem::Type::BSDF) { + return empty(); + } + + NodeItem color = get_input_value("Color", NodeItem::Type::Color3); + NodeItem roughness = get_input_value("Roughness", NodeItem::Type::Vector2); + NodeItem ior = get_input_value("IOR", NodeItem::Type::Float); + NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); + + NodeItem res = create_node("dielectric_bsdf", NodeItem::Type::BSDF); + if (normal) { + res.set_input("normal", normal); + } + res.set_input("tint", color); + res.set_input("roughness", roughness); + res.set_input("ior", ior); + res.set_input("scatter_mode", val(std::string("T"))); + + return res; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_bsdf_refraction_cc /* node type definition */ @@ -55,6 +81,7 @@ void register_node_type_sh_bsdf_refraction() blender::bke::node_type_size_preset(&ntype, blender::bke::eNodeSizePreset::MIDDLE); ntype.initfunc = file_ns::node_shader_init_refraction; ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_refraction; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From 1979715b31757890c1f60a8116ab23fe47a8bd34 Mon Sep 17 00:00:00 2001 From: "georgiy.m.markelov@gmail.com" Date: Fri, 15 Sep 2023 14:42:37 +0300 Subject: [PATCH 4/4] MaterialX: changed implementation of GlassBSDF --- .../shader/nodes/node_shader_bsdf_glass.cc | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc index 447ffcea429d..5469569339b0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc @@ -45,32 +45,44 @@ static int node_shader_gpu_bsdf_glass(GPUMaterial *mat, NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { - if (to_type_ != NodeItem::Type::SurfaceShader) { - /* TODO: implement for BSDF and EDF */ + if (to_type_ != NodeItem::Type::BSDF) { return empty(); } NodeItem color = get_input_value("Color", NodeItem::Type::Color3); - NodeItem roughness = get_input_value("Roughness", NodeItem::Type::Float); + NodeItem roughness = get_input_value("Roughness", NodeItem::Type::Vector2); NodeItem ior = get_input_value("IOR", NodeItem::Type::Float); NodeItem normal = get_input_link("Normal", NodeItem::Type::Vector3); - NodeItem res = create_node("standard_surface", NodeItem::Type::SurfaceShader); - res.set_input("base", val(1.0f)); + NodeItem dielectric = create_node("dielectric_bsdf", NodeItem::Type::BSDF); if (normal) { - res.set_input("normal", normal); + dielectric.set_input("normal", normal); } - res.set_input("base_color", color); - res.set_input("diffuse_roughness", roughness); - res.set_input("specular", val(0.5f)); - res.set_input("specular_color", color); - res.set_input("specular_roughness", roughness); - res.set_input("specular_IOR", ior); - res.set_input("transmission", val(1.0f)); - res.set_input("transmission_color", color); - res.set_input("transmission_depth", val(10.0f)); + dielectric.set_input("tint", color); + dielectric.set_input("roughness", roughness); + dielectric.set_input("ior", ior); + dielectric.set_input("scatter_mode", val(std::string("RT"))); - return res; + NodeItem artistic_ior = create_node("artistic_ior", NodeItem::Type::Multioutput); + artistic_ior.add_output("ior", NodeItem::Type::Color3); + artistic_ior.add_output("extinction", NodeItem::Type::Color3); + artistic_ior.set_input("reflectivity", color); + artistic_ior.set_input("edge_color", color); + + NodeItem conductor = create_node("conductor_bsdf", NodeItem::Type::BSDF); + if (normal) { + conductor.set_input("normal", normal); + } + conductor.set_input_output("ior", artistic_ior, "ior"); + conductor.set_input_output("extinction", artistic_ior, "extinction"); + conductor.set_input("roughness", roughness); + + NodeItem res = create_node("mix", NodeItem::Type::BSDF); + res.set_input("fg", dielectric); + res.set_input("bg", conductor); + res.set_input("mix", val(0.5f)); + + return res ; } #endif NODE_SHADER_MATERIALX_END -- 2.30.2