[Bf-blender-cvs] [8547643039a] soc-2018-hair-shader: Give the Absorption coefficient its own socket
L. E. Segovia
noreply at git.blender.org
Sat Jun 2 20:57:04 CEST 2018
Commit: 8547643039a22cc998479b016660d54079851ea8
Author: L. E. Segovia
Date: Sat Jun 2 18:55:57 2018 +0000
Branches: soc-2018-hair-shader
https://developer.blender.org/rB8547643039a22cc998479b016660d54079851ea8
Give the Absorption coefficient its own socket
Ref T54796
===================================================================
M intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
M intern/cycles/kernel/svm/svm_closure.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
M source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.c
===================================================================
diff --git a/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
index a390e50cbee..6831c6e3d2a 100644
--- a/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
+++ b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
@@ -24,6 +24,7 @@ shader node_principled_hair_bsdf(
color Color = 0.8,
float Melanin = 0.0,
float MelaninRedness = 0.0,
+ color AbsorptionCoefficient = 0.0,
normal Normal = Ng,
string parametrization = "Absorption coefficient",
float Offset = 0,
@@ -37,10 +38,10 @@ shader node_principled_hair_bsdf(
color Sigma;
if (parametrization == "Absorption coefficient") {
- Sigma = Color;
+ Sigma = AbsorptionCoefficient;
}
else if (parametrization == "physical") {
- Sigma = -log3(max(Color, 1e-5));
+ Sigma = -log3(max(AbsorptionCoefficient, 1e-5));
}
else if (parametrization == "Melanin concentration") {
Sigma = Melanin*color(0.419, 0.697, 1.37) + MelaninRedness*color(0.187, 0.4, 1.05);
@@ -51,7 +52,7 @@ shader node_principled_hair_bsdf(
Sigma *= Sigma;
}
- //printf("Info: color %f, incoming eumelanin %f, incoming pheomelanin %f, incoming normal %f, parametrization %s, resulting sigma %f, Longitudinal %f, Azimuthal %f, Scale deviation %f, IOR %f\n", Color, Melanin, MelaninRedness, Normal, parametrization, Sigma, RoughnessU, RoughnessV, Offset, IOR);
+ //printf("Info: color %f, incoming eumelanin %f, incoming pheomelanin %f, incoming sigma %f, incoming normal %f, parametrization %s, resulting sigma %f, Longitudinal %f, Azimuthal %f, Scale deviation %f, IOR %f\n", Color, Melanin, MelaninRedness, AbsorptionCoefficient, Normal, parametrization, Sigma, RoughnessU, RoughnessV, Offset, IOR);
BSDF = principled_hair(Normal, Sigma, RoughnessU, RoughnessV, PrimaryReflectionRoughness, Offset, IOR);
}
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 8bbae6e361e..7da0b3bee26 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -733,8 +733,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
float alpha = (stack_valid(offset_ofs))? stack_load_float(stack, offset_ofs): __uint_as_float(data_node.z);
float ior = (stack_valid(ior_ofs))? stack_load_float(stack, ior_ofs): __uint_as_float(data_node.w);
- uint primary_reflection_roughness_ofs, eumelanin_ofs, pheomelanin_ofs;
- decode_node_uchar4(data_node2.x, &primary_reflection_roughness_ofs, &eumelanin_ofs, &pheomelanin_ofs, NULL);
+ uint primary_reflection_roughness_ofs, eumelanin_ofs, pheomelanin_ofs, absorption_coefficient_ofs;
+ decode_node_uchar4(data_node2.x, &primary_reflection_roughness_ofs, &eumelanin_ofs, &pheomelanin_ofs, &absorption_coefficient_ofs);
float m0_roughness = (stack_valid(primary_reflection_roughness_ofs))? stack_load_float(stack, primary_reflection_roughness_ofs): __uint_as_float(data_node2.y);
float eumelanin = (stack_valid(eumelanin_ofs)) ? stack_load_float(stack, eumelanin_ofs) : __uint_as_float(data_node2.z);
@@ -756,12 +756,13 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
bsdf->extra = extra;
float3 color = stack_load_float3(stack, color_ofs);
+ float3 absorption_coefficient = stack_load_float3(stack, absorption_coefficient_ofs);
switch(parametrization) {
case NODE_PRINCIPLED_HAIR_DIRECT_ABSORPTION:
- bsdf->sigma = color;
+ bsdf->sigma = absorption_coefficient;
break;
case NODE_PRINCIPLED_HAIR_PHYSICAL:
- bsdf->sigma = -log3(max(color, make_float3(1e-5f, 1e-5f, 1e-5f)));
+ bsdf->sigma = -log3(max(absorption_coefficient, make_float3(1e-5f, 1e-5f, 1e-5f)));
break;
case NODE_PRINCIPLED_HAIR_PIGMENT_CONCENTRATION:
bsdf->sigma = eumelanin*make_float3(0.419f, 0.697f, 1.37f) + pheomelanin*make_float3(0.187f, 0.4f, 1.05f);
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index f1c440550fd..2dff177e7d4 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -3045,6 +3045,7 @@ NODE_DEFINE(PrincipledHairBsdfNode)
SOCKET_IN_COLOR(color, "Color", make_float3(0.8f, 0.8f, 0.8f));
SOCKET_IN_FLOAT(eumelanin, "Melanin", 0.0f);
SOCKET_IN_FLOAT(pheomelanin, "Melanin Redness", 0.0f);
+ SOCKET_IN_VECTOR(absorption_coefficient, "Absorption Coefficient", make_float3(0.0f, 0.0f, 0.0f), SocketType::VECTOR);
SOCKET_IN_NORMAL(normal, "Normal", make_float3(0.0f, 0.0f, 0.0f), SocketType::LINK_NORMAL);
SOCKET_IN_FLOAT(surface_mix_weight, "SurfaceMixWeight", 0.0f, SocketType::SVM_INTERNAL);
@@ -3085,6 +3086,7 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
ShaderInput *pheomelanin_in = input("Melanin Redness");
int color_ofs = compiler.stack_assign(input("Color"));
+ int absorption_coefficient_ofs = compiler.stack_assign(input("Absorption Coefficient"));
compiler.add_node(NODE_CLOSURE_BSDF,
compiler.encode_uchar4(closure,
@@ -3103,15 +3105,15 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
__float_as_int(offset),
__float_as_int(ior));
- compiler.add_node(
- compiler.encode_uchar4(
- compiler.stack_assign_if_linked(primary_reflection_roughness_in),
- compiler.stack_assign_if_linked(eumelanin_in),
- compiler.stack_assign_if_linked(pheomelanin_in),
- SVM_STACK_INVALID),
- __float_as_int(primary_reflection_roughness),
- __float_as_int(eumelanin),
- __float_as_int(pheomelanin));
+ compiler.add_node(
+ compiler.encode_uchar4(
+ compiler.stack_assign_if_linked(primary_reflection_roughness_in),
+ compiler.stack_assign_if_linked(eumelanin_in),
+ compiler.stack_assign_if_linked(pheomelanin_in),
+ absorption_coefficient_ofs),
+ __float_as_int(primary_reflection_roughness),
+ __float_as_int(eumelanin),
+ __float_as_int(pheomelanin));
}
void PrincipledHairBsdfNode::compile(OSLCompiler& compiler)
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 05ced5037ca..c83682a9b99 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -614,6 +614,7 @@ public:
float3 color;
float eumelanin;
float pheomelanin;
+ float3 absorption_coefficient;
float3 normal;
float surface_mix_weight;
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.c
index 211586c3da5..5814f732ede 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.c
@@ -30,14 +30,15 @@
/* **************** OUTPUT ******************** */
static bNodeSocketTemplate sh_node_bsdf_hair_principled_in[] = {
- { SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 1, N_("Melanin"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
- { SOCK_FLOAT, 1, N_("Melanin Redness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
- { SOCK_FLOAT, 1, N_("Offset"), 0.0f, 0.0f, 0.0f, 0.0f, -M_PI_2, M_PI_2, PROP_ANGLE},
- { SOCK_FLOAT, 1, N_("RoughnessU"), 0.2f, 0.2f, 0.2f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_FLOAT, 1, N_("RoughnessV"), 0.2f, 0.2f, 0.2f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_FLOAT, 1, N_("Primary Reflection Roughness"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_FLOAT, 1, N_("IOR"), 1.55f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, N_("Melanin"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, N_("Melanin Redness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, N_("Absorption Coefficient"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, N_("Offset"), 0.0f, 0.0f, 0.0f, 0.0f, -M_PI_2, M_PI_2, PROP_ANGLE},
+ { SOCK_FLOAT, 1, N_("RoughnessU"), 0.2f, 0.2f, 0.2f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, N_("RoughnessV"), 0.2f, 0.2f, 0.2f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, N_("Primary Reflection Roughness"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, N_("IOR"), 1.55f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
{ -1, 0, "" },
};
@@ -58,7 +59,7 @@ static void node_shader_update_hair_principled(bNodeTree *UNUSED(ntree), bNode *
for (sock = node->inputs.first; sock; sock = sock->next) {
if (STREQ(sock->name, "Color")) {
- if (parametrization != SHD_PRINCIPLED_HAIR_PIGMENT_CONCENTRATION){
+ if (parametrization == SHD_PRINCIPLED_HAIR_REFLECTANCE){
sock->flag &= ~SOCK_UNAVAIL;
}
else {
@@ -81,6 +82,14 @@ static void node_shader_update_hair_principled(bNodeTree *UNUSED(ntree), bNode *
sock->flag |= SOCK_UNAVAIL;
}
}
+ else if (STREQ(sock->name, "Absorption Coefficient")) {
+ if (parametrization == SHD_PRINCIPLED_HAIR_PHYSICAL || parametrization == SHD_PRINCIPLED_HAIR_DIRECT_ABSORPTION){
+ sock->flag &= ~SOCK_UNAVAIL;
+ }
+ else {
+ sock->flag |= SOCK_UNAVAIL;
+ }
+ }
}
}
More information about the Bf-blender-cvs
mailing list