Shaders: rename Specular to Specular IOR Level in Principled BSDF
To clarify that this is no longer the primary control, but rather and adjustment on IOR. Ref #99447 Ref #112552
This commit is contained in:
parent
239edb27ad
commit
1d265eed5d
|
@ -14,7 +14,7 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
|||
float SubsurfaceIOR = 1.4,
|
||||
float SubsurfaceAnisotropy = 0.0,
|
||||
float Metallic = 0.0,
|
||||
float Specular = 0.5,
|
||||
float SpecularIORLevel = 0.5,
|
||||
color SpecularTint = color(1.0),
|
||||
float Roughness = 0.5,
|
||||
float Anisotropic = 0.0,
|
||||
|
@ -56,8 +56,8 @@ shader node_principled_bsdf(string distribution = "multi_ggx",
|
|||
if (Metallic < 1.0 && Transmission < 1.0) {
|
||||
float eta = IOR;
|
||||
float f0 = F0_from_ior(eta);
|
||||
if (Specular != 0.5) {
|
||||
f0 *= 2.0 * max(Specular, 0.0);
|
||||
if (SpecularIORLevel != 0.5) {
|
||||
f0 *= 2.0 * max(SpecularIORLevel, 0.0);
|
||||
eta = ior_from_F0(f0);
|
||||
if (IOR < 1.0) {
|
||||
eta = 1.0 / eta;
|
||||
|
|
|
@ -74,7 +74,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
|
||||
switch (type) {
|
||||
case CLOSURE_BSDF_PRINCIPLED_ID: {
|
||||
uint specular_offset, roughness_offset, specular_tint_offset, anisotropic_offset,
|
||||
uint specular_ior_level_offset, roughness_offset, specular_tint_offset, anisotropic_offset,
|
||||
sheen_offset, sheen_tint_offset, sheen_roughness_offset, coat_offset,
|
||||
coat_roughness_offset, coat_ior_offset, eta_offset, transmission_offset,
|
||||
anisotropic_rotation_offset, coat_tint_offset, coat_normal_offset, dummy, alpha_offset,
|
||||
|
@ -83,7 +83,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
|
||||
float3 T = stack_load_float3(stack, data_node.y);
|
||||
svm_unpack_node_uchar4(data_node.z,
|
||||
&specular_offset,
|
||||
&specular_ior_level_offset,
|
||||
&roughness_offset,
|
||||
&specular_tint_offset,
|
||||
&anisotropic_offset);
|
||||
|
@ -327,8 +327,8 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
/* Apply IOR adjustment */
|
||||
float eta = ior;
|
||||
float f0 = F0_from_ior(eta);
|
||||
if (specular != 0.5f) {
|
||||
f0 *= 2.0f * specular;
|
||||
if (specular_ior_level != 0.5f) {
|
||||
f0 *= 2.0f * specular_ior_level;
|
||||
eta = ior_from_F0(f0);
|
||||
if (ior < 1.0f) {
|
||||
eta = 1.0f / eta;
|
||||
|
|
|
@ -2704,7 +2704,7 @@ NODE_DEFINE(PrincipledBsdfNode)
|
|||
SOCKET_IN_VECTOR(subsurface_radius, "Subsurface Radius", make_float3(0.1f, 0.1f, 0.1f));
|
||||
SOCKET_IN_FLOAT(subsurface_ior, "Subsurface IOR", 1.4f);
|
||||
SOCKET_IN_FLOAT(subsurface_anisotropy, "Subsurface Anisotropy", 0.0f);
|
||||
SOCKET_IN_FLOAT(specular, "Specular", 0.0f);
|
||||
SOCKET_IN_FLOAT(specular_ior_level, "Specular IOR Level", 0.0f);
|
||||
SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f);
|
||||
SOCKET_IN_COLOR(specular_tint, "Specular Tint", one_float3());
|
||||
SOCKET_IN_FLOAT(anisotropic, "Anisotropic", 0.0f);
|
||||
|
@ -2802,7 +2802,7 @@ void PrincipledBsdfNode::compile(SVMCompiler &compiler)
|
|||
int normal_offset = compiler.stack_assign_if_linked(input("Normal"));
|
||||
int coat_normal_offset = compiler.stack_assign_if_linked(input("Coat Normal"));
|
||||
int tangent_offset = compiler.stack_assign_if_linked(input("Tangent"));
|
||||
int specular_offset = compiler.stack_assign(input("Specular"));
|
||||
int specular_ior_level_offset = compiler.stack_assign(input("Specular IOR Level"));
|
||||
int roughness_offset = compiler.stack_assign(input("Roughness"));
|
||||
int specular_tint_offset = compiler.stack_assign(input("Specular Tint"));
|
||||
int anisotropic_offset = compiler.stack_assign(input("Anisotropic"));
|
||||
|
@ -2836,7 +2836,7 @@ void PrincipledBsdfNode::compile(SVMCompiler &compiler)
|
|||
normal_offset,
|
||||
tangent_offset,
|
||||
compiler.encode_uchar4(
|
||||
specular_offset, roughness_offset, specular_tint_offset, anisotropic_offset),
|
||||
specular_ior_level_offset, roughness_offset, specular_tint_offset, anisotropic_offset),
|
||||
compiler.encode_uchar4(sheen_offset, sheen_tint_offset, sheen_roughness_offset));
|
||||
|
||||
compiler.add_node(
|
||||
|
|
|
@ -525,7 +525,7 @@ class PrincipledBsdfNode : public BsdfBaseNode {
|
|||
NODE_SOCKET_API(float, subsurface_anisotropy)
|
||||
NODE_SOCKET_API(float, metallic)
|
||||
NODE_SOCKET_API(float, subsurface)
|
||||
NODE_SOCKET_API(float, specular)
|
||||
NODE_SOCKET_API(float, specular_ior_level)
|
||||
NODE_SOCKET_API(float, roughness)
|
||||
NODE_SOCKET_API(float3, specular_tint)
|
||||
NODE_SOCKET_API(float, anisotropic)
|
||||
|
|
|
@ -281,14 +281,14 @@ class PrincipledBSDFWrapper(ShaderWrapper):
|
|||
def specular_get(self):
|
||||
if not self.use_nodes or self.node_principled_bsdf is None:
|
||||
return self.material.specular_intensity
|
||||
return self.node_principled_bsdf.inputs["Specular"].default_value
|
||||
return self.node_principled_bsdf.inputs["Specular IOR Level"].default_value
|
||||
|
||||
@_set_check
|
||||
def specular_set(self, value):
|
||||
value = values_clamp(value, 0.0, 1.0)
|
||||
self.material.specular_intensity = value
|
||||
if self.use_nodes and self.node_principled_bsdf is not None:
|
||||
self.node_principled_bsdf.inputs["Specular"].default_value = value
|
||||
self.node_principled_bsdf.inputs["Specular IOR Level"].default_value = value
|
||||
|
||||
specular = property(specular_get, specular_set)
|
||||
|
||||
|
@ -313,7 +313,7 @@ class PrincipledBSDFWrapper(ShaderWrapper):
|
|||
return None
|
||||
return ShaderImageTextureWrapper(
|
||||
self, self.node_principled_bsdf,
|
||||
self.node_principled_bsdf.inputs["Specular"],
|
||||
self.node_principled_bsdf.inputs["Specular IOR Level"],
|
||||
grid_row_diff=0,
|
||||
colorspace_name='Non-Color',
|
||||
)
|
||||
|
|
|
@ -692,10 +692,11 @@ static void version_principled_bsdf_emission(bNodeTree *ntree)
|
|||
}
|
||||
}
|
||||
|
||||
/* Rename Principled BSDF emission to emission color. */
|
||||
static void version_principled_bsdf_emission_color(bNodeTree *ntree)
|
||||
/* Rename various Principled BSDF sockets. */
|
||||
static void version_principled_bsdf_rename_sockets(bNodeTree *ntree)
|
||||
{
|
||||
version_node_input_socket_name(ntree, SH_NODE_BSDF_PRINCIPLED, "Emission", "Emission Color");
|
||||
version_node_input_socket_name(ntree, SH_NODE_BSDF_PRINCIPLED, "Specular", "Specular IOR Level");
|
||||
}
|
||||
|
||||
/* Replace old Principled Hair BSDF as a variant in the new Principled Hair BSDF. */
|
||||
|
@ -1429,8 +1430,8 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
|
|||
if (ntree->type == NTREE_SHADER) {
|
||||
/* Convert specular tint on the Principled BSDF. */
|
||||
version_principled_bsdf_specular_tint(ntree);
|
||||
/* Rename emission to emission color. */
|
||||
version_principled_bsdf_emission_color(ntree);
|
||||
/* Rename some sockets. */
|
||||
version_principled_bsdf_rename_sockets(ntree);
|
||||
}
|
||||
}
|
||||
FOREACH_NODETREE_END;
|
||||
|
|
|
@ -1138,7 +1138,7 @@ bNodeTree *EEVEE_shader_default_surface_nodetree(Material *ma)
|
|||
e_data.surface.roughness_socket = static_cast<bNodeSocketValueFloat *>(
|
||||
nodeFindSocket(bsdf, SOCK_IN, "Roughness")->default_value);
|
||||
e_data.surface.specular_socket = static_cast<bNodeSocketValueFloat *>(
|
||||
nodeFindSocket(bsdf, SOCK_IN, "Specular")->default_value);
|
||||
nodeFindSocket(bsdf, SOCK_IN, "Specular IOR Level")->default_value);
|
||||
e_data.surface.ntree = ntree;
|
||||
}
|
||||
/* Update */
|
||||
|
|
|
@ -41,7 +41,7 @@ DefaultSurfaceNodeTree::DefaultSurfaceNodeTree()
|
|||
roughness_socket_ =
|
||||
(bNodeSocketValueFloat *)nodeFindSocket(bsdf, SOCK_IN, "Roughness")->default_value;
|
||||
specular_socket_ =
|
||||
(bNodeSocketValueFloat *)nodeFindSocket(bsdf, SOCK_IN, "Specular")->default_value;
|
||||
(bNodeSocketValueFloat *)nodeFindSocket(bsdf, SOCK_IN, "Specular IOR Level")->default_value;
|
||||
ntree_ = ntree;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ void node_bsdf_principled(vec4 base_color,
|
|||
float subsurface_scale,
|
||||
float subsurface_ior,
|
||||
float subsurface_anisotropy,
|
||||
float specular,
|
||||
float specular_ior_level,
|
||||
vec4 specular_tint,
|
||||
float anisotropic,
|
||||
float anisotropic_rotation,
|
||||
|
@ -65,7 +65,7 @@ void node_bsdf_principled(vec4 base_color,
|
|||
ior = max(ior, 1e-5);
|
||||
transmission = clamp(transmission, 0.0, 1.0);
|
||||
subsurface = clamp(subsurface, 0.0, 1.0);
|
||||
specular = max(specular, 0.0);
|
||||
specular_ior_level = max(specular_ior_level, 0.0);
|
||||
specular_tint = max(specular_tint, vec4(0.0));
|
||||
/* Not used by EEVEE */
|
||||
/* anisotropic = clamp(anisotropic, 0.0, 1.0) */
|
||||
|
@ -181,8 +181,8 @@ void node_bsdf_principled(vec4 base_color,
|
|||
if (true) {
|
||||
float eta = ior;
|
||||
float f0 = F0_from_ior(eta);
|
||||
if (specular != 0.5) {
|
||||
f0 *= 2.0 * specular;
|
||||
if (specular_ior_level != 0.5) {
|
||||
f0 *= 2.0 * specular_ior_level;
|
||||
eta = ior_from_F0(f0);
|
||||
if (ior < 1.0) {
|
||||
eta = 1.0 / eta;
|
||||
|
|
|
@ -388,13 +388,13 @@ void MaterialNode::set_specular(COLLADAFW::ColorOrTexture &cot)
|
|||
has_specularity = false;
|
||||
}
|
||||
else {
|
||||
bNode *node = add_node(SH_NODE_RGB, -300, locy, "Specular");
|
||||
bNode *node = add_node(SH_NODE_RGB, -300, locy, "Specular IOR Level");
|
||||
set_color(node, col);
|
||||
/* TODO: Connect node */
|
||||
}
|
||||
}
|
||||
else if (cot.isTexture()) {
|
||||
add_texture_node(cot, -300, locy, "Specular");
|
||||
add_texture_node(cot, -300, locy, "Specular IOR Level");
|
||||
/* TODO: Connect node */
|
||||
}
|
||||
else {
|
||||
|
@ -407,7 +407,7 @@ void MaterialNode::set_specular(COLLADAFW::ColorOrTexture &cot)
|
|||
* TODO: This is a solution only for a corner case. We must find a better
|
||||
* way to handle specularity in general. Also note that currently we
|
||||
* do not export specularity values, see EffectExporter::operator() */
|
||||
bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Specular");
|
||||
bNodeSocket *socket = nodeFindSocket(shader_node, SOCK_IN, "Specular IOR Level");
|
||||
((bNodeSocketValueFloat *)socket->default_value)->value = 0.0f;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -469,7 +469,7 @@ void USDMaterialReader::set_principled_node_inputs(bNode *principled,
|
|||
}
|
||||
|
||||
if (pxr::UsdShadeInput specular_input = usd_shader.GetInput(usdtokens::specularColor)) {
|
||||
set_node_input(specular_input, principled, "Specular", ntree, column, &context);
|
||||
set_node_input(specular_input, principled, "Specular Tint", ntree, column, &context);
|
||||
}
|
||||
|
||||
if (pxr::UsdShadeInput metallic_input = usd_shader.GetInput(usdtokens::metallic)) {
|
||||
|
|
|
@ -296,7 +296,7 @@ static InputSpecMap &preview_surface_input_map()
|
|||
{"Color", {usdtokens::diffuse_color, pxr::SdfValueTypeNames->Float3, true}},
|
||||
{"Roughness", {usdtokens::roughness, pxr::SdfValueTypeNames->Float, true}},
|
||||
{"Metallic", {usdtokens::metallic, pxr::SdfValueTypeNames->Float, true}},
|
||||
{"Specular", {usdtokens::specular, pxr::SdfValueTypeNames->Float, true}},
|
||||
{"Specular IOR Level", {usdtokens::specular, pxr::SdfValueTypeNames->Float, true}},
|
||||
{"Alpha", {usdtokens::opacity, pxr::SdfValueTypeNames->Float, true}},
|
||||
{"IOR", {usdtokens::ior, pxr::SdfValueTypeNames->Float, true}},
|
||||
/* Note that for the Normal input set_default_value is false. */
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace blender::io::obj {
|
|||
const char *tex_map_type_to_socket_id[] = {
|
||||
"Base Color",
|
||||
"Metallic",
|
||||
"Specular",
|
||||
"Specular IOR Level",
|
||||
"Roughness", /* Map specular exponent to roughness. */
|
||||
"Roughness",
|
||||
"Sheen",
|
||||
|
@ -204,7 +204,7 @@ static void store_bsdf_properties(const bNode *bsdf_node,
|
|||
|
||||
float specular = material->spec;
|
||||
if (bsdf_node) {
|
||||
copy_property_from_node(SOCK_FLOAT, bsdf_node, "Specular", {&specular, 1});
|
||||
copy_property_from_node(SOCK_FLOAT, bsdf_node, "Specular IOR Level", {&specular, 1});
|
||||
}
|
||||
|
||||
float metallic = material->metallic;
|
||||
|
|
|
@ -307,7 +307,7 @@ static void set_bsdf_socket_values(bNode *bsdf, Material *mat, const MTLMaterial
|
|||
if (mtl_mat.tex_map_of_type(MTLTexMapType::Emission).is_valid()) {
|
||||
set_property_of_socket(SOCK_FLOAT, "Emission Strength", {1.0f}, bsdf);
|
||||
}
|
||||
set_property_of_socket(SOCK_FLOAT, "Specular", {specular}, bsdf);
|
||||
set_property_of_socket(SOCK_FLOAT, "Specular IOR Level", {specular}, bsdf);
|
||||
set_property_of_socket(SOCK_FLOAT, "Roughness", {roughness}, bsdf);
|
||||
mat->roughness = roughness;
|
||||
set_property_of_socket(SOCK_FLOAT, "Metallic", {metallic}, bsdf);
|
||||
|
|
|
@ -104,7 +104,7 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.draw_buttons([](uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) {
|
||||
uiItemR(layout, ptr, "distribution", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
|
||||
});
|
||||
spec.add_input<decl::Float>("Specular")
|
||||
spec.add_input<decl::Float>("Specular IOR Level")
|
||||
.default_value(0.5f)
|
||||
.min(0.0f)
|
||||
.max(1.0f)
|
||||
|
|
Loading…
Reference in New Issue