[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