[Bf-blender-cvs] [2ab98cca19c] soc-2018-hair-shader-fixes: Add mode controls

L. E. Segovia noreply at git.blender.org
Wed Jul 25 16:26:50 CEST 2018


Commit: 2ab98cca19cb3acd3da61b5f71a61a1139f1713e
Author: L. E. Segovia
Date:   Wed Jul 25 14:25:41 2018 +0000
Branches: soc-2018-hair-shader-fixes
https://developer.blender.org/rB2ab98cca19cb3acd3da61b5f71a61a1139f1713e

Add mode controls

This is useful only for separating each light mode (R, TT, TRT, TRRT+)
and see how the shader behaves in each.

===================================================================

M	intern/cycles/kernel/closure/bsdf_hair_principled.h
M	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/render/graph.cpp
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/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h
index 6907b5e7f08..83c4a0eb69a 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_principled.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h
@@ -32,6 +32,11 @@ typedef ccl_addr_space struct PrincipledHairExtra {
 	float eta;
 	/* Geometry data. */
 	float4 geom;
+
+	float r;
+	float tt;
+	float trt;
+	float trrt;
 } PrincipledHairExtra;
 
 typedef ccl_addr_space struct PrincipledHairBSDF {
@@ -344,25 +349,25 @@ ccl_device float3 bsdf_principled_hair_eval(KernelGlobals *kg,
 	/* Primary specular (R). */
 	Mp = longitudinal_scattering(angles[0], angles[1], sin_theta_o, cos_theta_o, bsdf->m0_roughness);
 	Np = azimuthal_scattering(phi, 0, bsdf->s, gamma_o, gamma_t);
-	F  = Ap[0] * Mp * Np;
+	F  = bsdf->extra->r * Ap[0] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Transmission (TT). */
 	Mp = longitudinal_scattering(angles[2], angles[3], sin_theta_o, cos_theta_o, 0.25f*bsdf->v);
 	Np = azimuthal_scattering(phi, 1, bsdf->s, gamma_o, gamma_t);
-	F += Ap[1] * Mp * Np;
+	F += bsdf->extra->tt * Ap[1] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Secondary specular (TRT). */
 	Mp = longitudinal_scattering(angles[4], angles[5], sin_theta_o, cos_theta_o, 4.0f*bsdf->v);
 	Np = azimuthal_scattering(phi, 2, bsdf->s, gamma_o, gamma_t);
-	F += Ap[2] * Mp * Np;
+	F += bsdf->extra->trt * Ap[2] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Residual component (TRRT+). */
 	Mp = longitudinal_scattering(sin_theta_i, cos_theta_i, sin_theta_o, cos_theta_o, 4.0f*bsdf->v);
 	Np = M_1_2PI_F;
-	F += Ap[3] * Mp * Np;
+	F += bsdf->extra->trrt * Ap[3] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	*pdf = F.w;
@@ -460,25 +465,25 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg,
 	/* Primary specular (R). */
 	Mp = longitudinal_scattering(angles[0], angles[1], sin_theta_o, cos_theta_o, bsdf->m0_roughness);
 	Np = azimuthal_scattering(phi, 0, bsdf->s, gamma_o, gamma_t);
-	F  = Ap[0] * Mp * Np;
+	F = bsdf->extra->r * Ap[0] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Transmission (TT). */
 	Mp = longitudinal_scattering(angles[2], angles[3], sin_theta_o, cos_theta_o, 0.25f*bsdf->v);
 	Np = azimuthal_scattering(phi, 1, bsdf->s, gamma_o, gamma_t);
-	F += Ap[1] * Mp * Np;
+	F += bsdf->extra->tt * Ap[1] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Secondary specular (TRT). */
 	Mp = longitudinal_scattering(angles[4], angles[5], sin_theta_o, cos_theta_o, 4.0f*bsdf->v);
 	Np = azimuthal_scattering(phi, 2, bsdf->s, gamma_o, gamma_t);
-	F += Ap[2] * Mp * Np;
+	F += bsdf->extra->trt * Ap[2] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	/* Residual component (TRRT+). */
 	Mp = longitudinal_scattering(sin_theta_i, cos_theta_i, sin_theta_o, cos_theta_o, 4.0f*bsdf->v);
 	Np = M_1_2PI_F;
-	F += Ap[3] * Mp * Np;
+	F += bsdf->extra->trrt * Ap[3] * Mp * Np;
 	kernel_assert(isfinite3_safe(float4_to_float3(F)));
 
 	*eval = float4_to_float3(F);
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 6b2910df67a..85c7e93f246 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -741,6 +741,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 			uint4 data_node2 = read_node(kg, offset);
 			uint4 data_node3 = read_node(kg, offset);
 			uint4 data_node4 = read_node(kg, offset);
+			uint4 data_node5 = read_node(kg, offset);
 
 			float3 weight = sd->svm_closure_weight * mix_weight;
 
@@ -764,6 +765,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 				random = stack_load_float_default(stack, random_ofs, data_node3.y);
 			}
 
+			uint primary_specular_ofs, transmission_ofs, secondary_specular_ofs, residual_ofs;
+			decode_node_uchar4(data_node4.x, &primary_specular_ofs, &transmission_ofs, &secondary_specular_ofs, &residual_ofs);
 
 			PrincipledHairBSDF *bsdf = (PrincipledHairBSDF*)bsdf_alloc(sd, sizeof(PrincipledHairBSDF), weight);
 			if(bsdf) {
@@ -782,6 +785,11 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 				float coat = stack_load_float_default(stack, coat_ofs, data_node2.y);
 				float m0_roughness = 1.0f - clamp(coat, 0.0f, 1.0f);
 
+				float r = stack_load_float_default(stack, primary_specular_ofs, data_node4.z);
+				float tt = stack_load_float_default(stack, transmission_ofs, data_node4.w);
+				float trt = stack_load_float_default(stack, secondary_specular_ofs, data_node5.y);
+				float trrt = stack_load_float_default(stack, residual_ofs, data_node5.z);
+
 				bsdf->N = N;
 				bsdf->roughness = roughness;
 				bsdf->radial_roughness = radial_roughness;
@@ -790,6 +798,11 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 				bsdf->extra->alpha = alpha;
 				bsdf->extra->eta = ior;
 
+				bsdf->extra->r = r;
+				bsdf->extra->tt = tt;
+				bsdf->extra->trt = trt;
+				bsdf->extra->trrt = trrt;
+
 				switch(parametrization) {
 					case NODE_PRINCIPLED_HAIR_DIRECT_ABSORPTION: {
 						float3 absorption_coefficient = stack_load_float3(stack, absorption_coefficient_ofs);
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 3a9e2981418..2b01662a3f8 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -1092,7 +1092,7 @@ int ShaderGraph::get_num_closures()
 			num_closures += VOLUME_STACK_SIZE;
 		}
 		else if(closure_type == CLOSURE_BSDF_HAIR_PRINCIPLED_ID) {
-			num_closures += 4;
+			num_closures += 5;
 		}
 		else {
 			++num_closures;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 96e7459a48c..6358a463210 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -3122,6 +3122,11 @@ NODE_DEFINE(PrincipledHairBsdfNode)
 	SOCKET_IN_FLOAT(random_color, "Random Color", 0.0f);
 	SOCKET_IN_FLOAT(random, "Random", 0.0f);
 
+	SOCKET_IN_FLOAT(primary_specular, "Primary Specular", 1.0f);
+	SOCKET_IN_FLOAT(transmission, "Transmission", 1.0f);
+	SOCKET_IN_FLOAT(secondary_specular, "Secondary Specular", 1.0f);
+	SOCKET_IN_FLOAT(residual, "Residual", 1.0f);
+
 	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);
 
@@ -3167,6 +3172,11 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
 	ShaderInput *random_in = input("Random");
 	int attr_random = random_in->link ? SVM_STACK_INVALID : compiler.attribute(ATTR_STD_CURVE_RANDOM);
 
+	ShaderInput *primary_specular_in = input("Primary Specular");
+	ShaderInput *transmission_in = input("Transmission");
+	ShaderInput *secondary_specular_in = input("Secondary Specular");
+	ShaderInput *residual_in = input("Residual");
+
 	/* Encode all parameters into data nodes. */
 	compiler.add_node(NODE_CLOSURE_BSDF,
 		/* Socket IDs can be packed 4 at a time into a single data packet */
@@ -3207,14 +3217,24 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
 		__float_as_uint(random_color),
 		__float_as_uint(random_roughness));
 
+	compiler.add_node(
+		compiler.encode_uchar4(
+			compiler.stack_assign_if_linked(primary_specular_in),
+			compiler.stack_assign_if_linked(transmission_in),
+			compiler.stack_assign_if_linked(secondary_specular_in),
+			compiler.stack_assign_if_linked(residual_in)),
+		attr_random,
+		__float_as_uint(primary_specular),
+		__float_as_uint(transmission));
+
 	compiler.add_node(
 		compiler.encode_uchar4(
 			SVM_STACK_INVALID,
 			SVM_STACK_INVALID,
 			SVM_STACK_INVALID,
 			SVM_STACK_INVALID),
-		attr_random,
-		SVM_STACK_INVALID,
+		__float_as_uint(secondary_specular),
+		__float_as_uint(residual),
 		SVM_STACK_INVALID);
 }
 
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 28bbe2de05a..5b277ed0bb1 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -639,6 +639,11 @@ public:
 	/* Absorption coefficient (unfiltered). */
 	float3 absorption_coefficient;
 
+	float primary_specular;
+	float transmission;
+	float secondary_specular;
+	float residual;
+	
 	float3 normal;
 	float surface_mix_weight;
 	/* If linked, here will be the given random number. */
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 aeeb262a5a6..b64e5a2ca8d 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
@@ -44,6 +44,10 @@ static bNodeSocketTemplate sh_node_bsdf_hair_principled_in[] = {
 	{	SOCK_FLOAT, 	1, N_("Random Color"),				0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
 	{	SOCK_FLOAT, 	1, N_("Random Roughness"),			0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
 	{	SOCK_FLOAT,		1, N_("Random"),					0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+	{	SOCK_FLOAT,		1, N_("Primary Specular"),			1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+	{	SOCK_FLOAT,		1, N_("Transmission"),				1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+	{	SOCK_FLOAT,		1, N_("Secondary Specular"),		1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+	{	SOCK_FLOAT,		1, N_("Residual"),					1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
 	{	-1, 0, ""	},
 };



More information about the Bf-blender-cvs mailing list