MaterialX: split standard_surface into basic nodes #26

Merged
Bogdan Nagirniak merged 11 commits from matx-principlebsdf-split into matx-export-material 2023-09-21 10:58:14 +02:00
Showing only changes of commit 2b876e3402 - Show all commits

View File

@ -382,13 +382,10 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem n_main_tangent = empty(); NodeItem n_main_tangent = empty();
if (tangent) { if (tangent) {
NodeItem n_tangent_rotate = create_node("rotate3d", NodeItem n_tangent_rotate = create_node(
NodeItem::Type::Vector3, "rotate3d",
{ NodeItem::Type::Vector3,
{"in", tangent}, {{"in", tangent}, {"amount", rotation * val(360.0f)}, {"axis", normal}});
{"amount", rotation * val(360.0f)},
{"axis", normal},
});
NodeItem n_tangent_rotate_normalize = create_node( NodeItem n_tangent_rotate_normalize = create_node(
"normalize", NodeItem::Type::Vector3, {{"in", n_tangent_rotate}}); "normalize", NodeItem::Type::Vector3, {{"in", n_tangent_rotate}});
@ -397,38 +394,28 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem::CompareOp::Greater, val(0.0f), n_tangent_rotate_normalize, tangent); NodeItem::CompareOp::Greater, val(0.0f), n_tangent_rotate_normalize, tangent);
} }
NodeItem n_coat_roughness_vector = create_node("roughness_anisotropy", NodeItem n_coat_roughness_vector = create_node(
NodeItem::Type::Vector2, "roughness_anisotropy",
{ NodeItem::Type::Vector2,
{"roughness", roughness}, {{"roughness", roughness}, {"anisotropy", anisotropy}});
{"anisotropy", anisotropy},
});
NodeItem n_coat_bsdf = create_node("dielectric_bsdf", NodeItem n_coat_bsdf = create_node("dielectric_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"weight", coat},
{"weight", coat}, {"tint", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))},
{"tint", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))}, {"ior", ior},
{"ior", ior}, {"scatter_mode", val(std::string("R"))},
{"scatter_mode", val(std::string("R"))}, {"roughness", n_coat_roughness_vector},
{"roughness", n_coat_roughness_vector}, {"normal", normal}});
{"normal", normal},
});
if (tangent) { if (tangent) {
NodeItem n_coat_tangent_rotate = create_node("rotate3d", NodeItem n_coat_tangent_rotate = create_node(
NodeItem::Type::Vector3, "rotate3d",
{ NodeItem::Type::Vector3,
{"in", tangent}, {{"in", tangent}, {"amount", rotation * val(360.0f)}, {"axis", normal}});
{"amount", rotation * val(360.0f)},
{"axis", normal},
});
NodeItem n_coat_tangent_rotate_normalize = create_node("normalize", NodeItem n_coat_tangent_rotate_normalize = create_node(
NodeItem::Type::Vector3, "normalize", NodeItem::Type::Vector3, {{"in", n_coat_tangent_rotate}});
{
{"in", n_coat_tangent_rotate},
});
NodeItem n_coat_tangent = anisotropy.if_else( NodeItem n_coat_tangent = anisotropy.if_else(
NodeItem::CompareOp::Greater, val(0.0f), n_coat_tangent_rotate_normalize, tangent); NodeItem::CompareOp::Greater, val(0.0f), n_coat_tangent_rotate_normalize, tangent);
@ -436,19 +423,13 @@ NODE_SHADER_MATERIALX_BEGIN
n_coat_bsdf.set_input("tangent", n_coat_tangent); n_coat_bsdf.set_input("tangent", n_coat_tangent);
} }
NodeItem n_thin_film_bsdf = create_node("thin_film_bsdf", NodeItem n_thin_film_bsdf = create_node(
NodeItem::Type::BSDF, "thin_film_bsdf", NodeItem::Type::BSDF, {{"thickness", val(0.0f)}, {"ior", val(1.5f)}});
{
{"thickness", val(0.0f)},
{"ior", val(1.5f)},
});
NodeItem n_artistic_ior = create_node("artistic_ior", NodeItem n_artistic_ior = create_node(
NodeItem::Type::Multioutput, "artistic_ior",
{ NodeItem::Type::Multioutput,
{"reflectivity", base_color * val(1.0f)}, {{"reflectivity", base_color * val(1.0f)}, {"edge_color", base_color * specular}});
{"edge_color", base_color * specular},
});
NodeItem n_ior_out = n_artistic_ior.add_output("ior", NodeItem::Type::Color3); NodeItem n_ior_out = n_artistic_ior.add_output("ior", NodeItem::Type::Color3);
NodeItem n_extinction_out = n_artistic_ior.add_output("extinction", NodeItem::Type::Color3); NodeItem n_extinction_out = n_artistic_ior.add_output("extinction", NodeItem::Type::Color3);
@ -457,40 +438,30 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem n_coat_affected_roughness = create_node( NodeItem n_coat_affected_roughness = create_node(
"mix", "mix",
NodeItem::Type::Float, NodeItem::Type::Float,
{ {{"fg", val(1.0f)}, {"bg", roughness}, {"mix", n_coat_affect_roughness_multiply2}});
{"fg", val(1.0f)},
{"bg", roughness},
{"mix", n_coat_affect_roughness_multiply2},
});
NodeItem n_main_roughness = create_node("roughness_anisotropy", NodeItem n_main_roughness = create_node(
NodeItem::Type::Vector2, "roughness_anisotropy",
{ NodeItem::Type::Vector2,
{"roughness", n_coat_affected_roughness}, {{"roughness", n_coat_affected_roughness}, {"anisotropy", anisotropy}});
{"anisotropy", anisotropy},
});
NodeItem n_metal_bsdf = create_node("conductor_bsdf", NodeItem n_metal_bsdf = create_node("conductor_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"ior", n_ior_out},
{"ior", n_ior_out}, {"extinction", n_extinction_out},
{"extinction", n_extinction_out}, {"roughness", n_main_roughness},
{"roughness", n_main_roughness}, {"normal", normal},
{"normal", normal}, {"tangent", n_main_tangent}});
{"tangent", n_main_tangent},
});
NodeItem n_specular_bsdf = create_node("dielectric_bsdf", NodeItem n_specular_bsdf = create_node("dielectric_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"weight", specular},
{"weight", specular}, {"tint", base_color},
{"tint", base_color}, {"ior", ior},
{"ior", ior}, {"scatter_mode", val(std::string("R"))},
{"scatter_mode", val(std::string("R"))}, {"roughness", n_main_roughness},
{"roughness", n_main_roughness}, {"normal", normal},
{"normal", normal}, {"tangent", n_main_tangent}});
{"tangent", n_main_tangent},
});
NodeItem n_coat_affected_transmission_roughness = create_node( NodeItem n_coat_affected_transmission_roughness = create_node(
"mix", "mix",
@ -504,128 +475,87 @@ NODE_SHADER_MATERIALX_BEGIN
NodeItem n_transmission_roughness = create_node( NodeItem n_transmission_roughness = create_node(
"roughness_anisotropy", "roughness_anisotropy",
NodeItem::Type::Vector2, NodeItem::Type::Vector2,
{ {{"roughness", n_coat_affected_transmission_roughness}, {"anisotropy", anisotropy}});
{"roughness", n_coat_affected_transmission_roughness},
{"anisotropy", anisotropy},
});
NodeItem n_transmission_bsdf = create_node("dielectric_bsdf", NodeItem n_transmission_bsdf = create_node("dielectric_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"tint", base_color},
{"tint", base_color}, {"ior", ior},
{"ior", ior}, {"roughness", n_transmission_roughness},
{"roughness", n_transmission_roughness}, {"normal", normal},
{"normal", normal}, {"tangent", n_main_tangent}});
{"tangent", n_main_tangent},
});
NodeItem n_coat_gamma = coat.clamp(0.0f, 1.0f) * val(0.0f) + val(1.0f); NodeItem n_coat_gamma = coat.clamp(0.0f, 1.0f) * val(0.0f) + val(1.0f);
NodeItem n_coat_affected_subsurface_color = base_color.max(val(0.0f)) ^ n_coat_gamma; NodeItem n_coat_affected_subsurface_color = base_color.max(val(0.0f)) ^ n_coat_gamma;
NodeItem n_translucent_bsdf = create_node("translucent_bsdf", NodeItem n_translucent_bsdf = create_node(
NodeItem::Type::BSDF, "translucent_bsdf",
{
{"color", n_coat_affected_subsurface_color},
{"normal", normal},
});
NodeItem n_subsurface_bsdf = create_node(
"subsurface_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"color", n_coat_affected_subsurface_color}, {"normal", normal}});
{"color", n_coat_affected_subsurface_color},
{"radius", inputs.find("subsurface_radius")->second},
{"anisotropy", anisotropy},
{"normal", normal},
});
NodeItem n_selected_subsurface_bsdf = create_node("mix", NodeItem n_subsurface_bsdf = create_node("subsurface_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"color", n_coat_affected_subsurface_color},
{"fg", n_translucent_bsdf}, {"radius", inputs.find("subsurface_radius")->second},
{"bg", n_subsurface_bsdf}, {"anisotropy", anisotropy},
{"mix", val(0.0f)}, {"normal", normal}});
});
NodeItem n_selected_subsurface_bsdf = create_node(
"mix",
NodeItem::Type::BSDF,
{{"fg", n_translucent_bsdf}, {"bg", n_subsurface_bsdf}, {"mix", val(0.0f)}});
NodeItem n_sheen_bsdf = create_node("sheen_bsdf", NodeItem n_sheen_bsdf = create_node("sheen_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"weight", inputs.find("sheen")->second},
{"weight", inputs.find("sheen")->second}, {"color", base_color},
{"color", base_color}, {"roughness", roughness},
{"roughness", roughness}, {"normal", normal}});
{"normal", normal},
});
NodeItem n_diffuse_bsdf = create_node("oren_nayar_diffuse_bsdf", NodeItem n_diffuse_bsdf = create_node("oren_nayar_diffuse_bsdf",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"color", base_color.max(val(0.0f)) ^ n_coat_gamma},
{"color", base_color.max(val(0.0f)) ^ n_coat_gamma}, {"roughness", roughness},
{"roughness", roughness}, {"weight", val(1.0f)},
{"weight", val(1.0f)}, {"normal", normal}});
{"normal", normal},
});
DagerD marked this conversation as resolved Outdated

This node is created in MaterialOutput.
Should be:

if (to_type_ == NodeItem::Type::BSDF) {
<calculate and return only BSDF part>
....
return n_coat_layer; // probably n_coat_layer * n_opacity_luminance
}
else if (to_type_ == NodeItem::Type::EDF) {
<calculate and return only EDF part>
...
return n_emission_edf; // probably n_emission_edf * n_opacity_luminance
}
else if (to_type_ == NodeItem::Type::SurfaceShader) {
<previous implementation>
}
This node is created in MaterialOutput. Should be: ``` if (to_type_ == NodeItem::Type::BSDF) { <calculate and return only BSDF part> .... return n_coat_layer; // probably n_coat_layer * n_opacity_luminance } else if (to_type_ == NodeItem::Type::EDF) { <calculate and return only EDF part> ... return n_emission_edf; // probably n_emission_edf * n_opacity_luminance } else if (to_type_ == NodeItem::Type::SurfaceShader) { <previous implementation> } ```
NodeItem n_subsurface_mix = create_node("mix", NodeItem n_subsurface_mix = create_node("mix",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"fg", n_selected_subsurface_bsdf},
{"fg", n_selected_subsurface_bsdf}, {"bg", n_diffuse_bsdf},
{"bg", n_diffuse_bsdf}, {"mix", inputs.find("subsurface")->second}});
{"mix", inputs.find("subsurface")->second},
});
NodeItem n_sheen_layer = create_node("layer", NodeItem n_sheen_layer = create_node(
NodeItem::Type::BSDF, "layer", NodeItem::Type::BSDF, {{"top", n_sheen_bsdf}, {"base", n_subsurface_mix}});
{
{"top", n_sheen_bsdf},
{"base", n_subsurface_mix},
});
NodeItem n_transmission_mix = create_node("mix", NodeItem n_transmission_mix = create_node("mix",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"fg", n_transmission_bsdf},
{"fg", n_transmission_bsdf}, {"bg", n_sheen_layer},
{"bg", n_sheen_layer}, {"mix", inputs.find("transmission")->second}});
{"mix", inputs.find("transmission")->second},
});
NodeItem n_specular_layer = create_node("layer", NodeItem n_specular_layer = create_node(
NodeItem::Type::BSDF, "layer", NodeItem::Type::BSDF, {{"top", n_specular_bsdf}, {"base", n_transmission_mix}});
{
{"top", n_specular_bsdf},
{"base", n_transmission_mix},
});
NodeItem n_metalness_mix = create_node("mix", NodeItem n_metalness_mix = create_node("mix",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"fg", n_metal_bsdf},
{"fg", n_metal_bsdf}, {"bg", n_specular_layer},
{"bg", n_specular_layer}, {"mix", inputs.find("metalness")->second}});
{"mix", inputs.find("metalness")->second},
});
NodeItem n_thin_film_layer = create_node( NodeItem n_thin_film_layer = create_node(
"layer", NodeItem::Type::BSDF, {{"top", n_thin_film_bsdf}, {"base", n_metalness_mix}}); "layer", NodeItem::Type::BSDF, {{"top", n_thin_film_bsdf}, {"base", n_metalness_mix}});
NodeItem n_opacity_luminance = create_node( NodeItem n_opacity_luminance = create_node(
"luminance", "luminance", NodeItem::Type::Color3, {{"in", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))}});
NodeItem::Type::Color3,
{
{"in", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))},
});
NodeItem n_coat_attenuation = create_node("mix", NodeItem n_coat_attenuation = create_node(
NodeItem::Type::Color3, "mix",
{ NodeItem::Type::Color3,
{"fg", base_color}, {{"fg", base_color}, {"bg", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))}, {"mix", coat}});
{"bg", val(MaterialX::Color3(1.0f, 1.0f, 1.0f))},
{"mix", coat},
});
res = create_node("layer", res = create_node("layer",
NodeItem::Type::BSDF, NodeItem::Type::BSDF,
{ {{"top", n_coat_bsdf}, {"base", n_thin_film_layer * n_coat_attenuation}});
{"top", n_coat_bsdf},
{"base", n_thin_film_layer * n_coat_attenuation},
});
return res; return res;
} }
@ -635,9 +565,7 @@ NODE_SHADER_MATERIALX_BEGIN
res = create_node( res = create_node(
"uniform_edf", "uniform_edf",
NodeItem::Type::EDF, NodeItem::Type::EDF,
{ {{"color", inputs.find("emission_color")->second * inputs.find("emission")->second}});
{"color", inputs.find("emission_color")->second * inputs.find("emission")->second},
});
} }
else if (to_type_ == NodeItem::Type::SurfaceShader) { else if (to_type_ == NodeItem::Type::SurfaceShader) {
auto b_inputs = bsdf_inputs(); auto b_inputs = bsdf_inputs();
@ -651,39 +579,37 @@ NODE_SHADER_MATERIALX_BEGIN
res = create_node("standard_surface", res = create_node("standard_surface",
NodeItem::Type::SurfaceShader, NodeItem::Type::SurfaceShader,
{ {{"base", val(1.0f)},
{"base", val(1.0f)}, {"base_color", base_color},
{"base_color", base_color}, {"diffuse_roughness", roughness},
{"diffuse_roughness", roughness}, {"metalness", b_inputs.find("metalness")->second},
{"metalness", b_inputs.find("metalness")->second}, {"specular", b_inputs.find("specular")->second},
{"specular", b_inputs.find("specular")->second}, {"specular_color", base_color},
{"specular_color", base_color}, {"specular_roughness", roughness},
{"specular_roughness", roughness}, {"specular_IOR", ior},
{"specular_IOR", ior}, {"specular_anisotropy", anisotropic},
{"specular_anisotropy", anisotropic}, {"specular_rotation", rotation},
{"specular_rotation", rotation}, {"transmission", b_inputs.find("transmission")->second},
{"transmission", b_inputs.find("transmission")->second}, {"transmission_color", base_color},
{"transmission_color", base_color}, {"transmission_extra_roughness", roughness},
{"transmission_extra_roughness", roughness}, {"subsurface", b_inputs.find("subsurface")->second},
{"subsurface", b_inputs.find("subsurface")->second}, {"subsurface_color", base_color},
{"subsurface_color", base_color}, {"subsurface_radius", b_inputs.find("subsurface_radius")->second},
{"subsurface_radius", b_inputs.find("subsurface_radius")->second}, {"subsurface_anisotropy", anisotropic},
{"subsurface_anisotropy", anisotropic}, {"sheen", b_inputs.find("sheen")->second},
{"sheen", b_inputs.find("sheen")->second}, {"sheen_color", base_color},
{"sheen_color", base_color}, {"sheen_roughness", roughness},
{"sheen_roughness", roughness}, {"coat", b_inputs.find("coat")->second},
{"coat", b_inputs.find("coat")->second}, {"coat_color", base_color},
{"coat_color", base_color}, {"coat_roughness", b_inputs.find("coat_roughness")->second},
{"coat_roughness", b_inputs.find("coat_roughness")->second}, {"coat_IOR", ior},
{"coat_IOR", ior}, {"coat_anisotropy", anisotropic},
{"coat_anisotropy", anisotropic}, {"coat_rotation", rotation},
{"coat_rotation", rotation}, {"coat_normal", b_inputs.find("coat_normal")->second},
{"coat_normal", b_inputs.find("coat_normal")->second}, {"emission", e_inputs.find("emission")->second},
{"emission", e_inputs.find("emission")->second}, {"emission_color", e_inputs.find("emission_color")->second},
{"emission_color", e_inputs.find("emission_color")->second}, {"normal", b_inputs.find("normal")->second},
{"normal", b_inputs.find("normal")->second}, {"tangent", b_inputs.find("tangent")->second}});
{"tangent", b_inputs.find("tangent")->second},
});
} }
return res; return res;