[Bf-blender-cvs] [b7d540f245a] soc-2018-hair-shader: Add color and roughness randomization

L. E. Segovia noreply at git.blender.org
Wed Jun 6 15:28:42 CEST 2018


Commit: b7d540f245aa4adf48ea0481f686a46cbc812ec1
Author: L. E. Segovia
Date:   Wed Jun 6 13:21:48 2018 +0000
Branches: soc-2018-hair-shader
https://developer.blender.org/rBb7d540f245aa4adf48ea0481f686a46cbc812ec1

Add color and roughness randomization

Set 0.0 to not randomize anything. The value represent how much (less) of the feature you want to add to your hair, in percentage.

Ref T54796

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

M	intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
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/shaders/node_principled_hair_bsdf.osl b/intern/cycles/kernel/shaders/node_principled_hair_bsdf.osl
index 23f6d21f23c..e10c4b9bd9a 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 = 1.3,
+	float ColorRandomization = 0.0,
 	color Tint = 1.0,
 	color AbsorptionCoefficient = color(0.245531, 0.52, 1.365),
 	normal Normal = Ng,
@@ -31,6 +32,7 @@ shader node_principled_hair_bsdf(
 	float Offset = radians(2),
 	float RoughnessU = 0.3,
 	float RoughnessV = 0.3,
+	float RoughnessRandomization = 0.0,
 	float PrimaryReflectionRoughness = 1.0,
 	float IOR = 1.55,
 	float Random = 0.0,
@@ -39,6 +41,12 @@ shader node_principled_hair_bsdf(
 {
 	color Sigma;
 
+	float factor_random_color = linearstep(1.0-ColorRandomization, 1.0, Random);
+	float factor_random_roughness = linearstep(1.0-RoughnessRandomization, 1.0, Random);
+
+	float AdjustedRoughnessU = RoughnessU*factor_random_roughness;
+	float AdjustedRoughnessV = RoughnessV*factor_random_roughness;
+
 	if (parametrization == "Absorption coefficient") {
 		Sigma = AbsorptionCoefficient;
 	}
@@ -46,7 +54,7 @@ shader node_principled_hair_bsdf(
 		Sigma = -log3(max(AbsorptionCoefficient, 1e-5));
 	}
 	else if (parametrization == "Melanin concentration") {
-		color Melanin_Sigma = Melanin*color(0.419, 0.697, 1.37) + MelaninRedness*color(0.187, 0.4, 1.05);
+		color Melanin_Sigma = Melanin * factor_random_color * color(0.419, 0.697, 1.37) + MelaninRedness * factor_random_color * color(0.187, 0.4, 1.05);
 		float roughness_fac = (((((0.245*RoughnessU) + 5.574)*RoughnessU - 10.73)*RoughnessU + 2.532)*RoughnessU - 0.215)*RoughnessU + 5.969;
 		color Tint_Sigma = log3(Tint)/roughness_fac;
 		Tint_Sigma *= Tint_Sigma;
@@ -63,7 +71,7 @@ shader node_principled_hair_bsdf(
 		Sigma = 0.0*color(0.419, 0.697, 1.37) + 1.3*color(0.187, 0.4, 1.05);
 	}
 
-	//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, random value %f\n", Color, Melanin, MelaninRedness, AbsorptionCoefficient, Normal, parametrization, Sigma, RoughnessU, RoughnessV, Offset, IOR, Random);
+	//printf("Info: color %f, incoming eumelanin %f, incoming pheomelanin %f, incoming sigma %f, incoming color range %f, incoming normal %f, parametrization %s, resulting sigma %f, Longitudinal %f, Azimuthal %f, roughness range %f, Scale deviation %f, IOR %f, random value %f\n", Color, Melanin, MelaninRedness, AbsorptionCoefficient, Normal, parametrization, Sigma, ColorRandomization, RoughnessU, RoughnessV, RoughnessRandomization, Offset, IOR, Random);
 
-	BSDF = principled_hair(Normal, Sigma, RoughnessU, RoughnessV, PrimaryReflectionRoughness, Offset, IOR, Random);
+	BSDF = principled_hair(Normal, Sigma, AdjustedRoughnessU, AdjustedRoughnessV, PrimaryReflectionRoughness, Offset, IOR, Random);
 }
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index 9ed39bf5485..3501fa7ba32 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -741,9 +741,15 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 			float eumelanin = (stack_valid(eumelanin_ofs)) ? stack_load_float(stack, eumelanin_ofs) : __uint_as_float(data_node2.z);
 			float pheomelanin = (stack_valid(pheomelanin_ofs)) ? stack_load_float(stack, pheomelanin_ofs) : __uint_as_float(data_node2.w);
 			
-			uint tint_ofs, random_ofs;
-			decode_node_uchar4(data_node3.x, &tint_ofs, &random_ofs, NULL, NULL);
-			float random = (stack_valid(random_ofs)) ? stack_load_float(stack, random_ofs) : data_node3.y;
+			uint tint_ofs, random_ofs, color_randomization_ofs, roughness_randomization_ofs;
+			decode_node_uchar4(data_node3.x, &tint_ofs, &random_ofs, &color_randomization_ofs, &roughness_randomization_ofs);
+			float random = (stack_valid(random_ofs)) ? stack_load_float(stack, random_ofs) : __uint_as_float(data_node3.y);
+			float color_randomization = (stack_valid(color_randomization_ofs)) ? stack_load_float(stack, color_randomization_ofs) : __uint_as_float(data_node3.z);
+			color_randomization = clamp(color_randomization, 0.0f, 1.0f);
+			float roughness_randomization = (stack_valid(roughness_randomization_ofs)) ? stack_load_float(stack, roughness_randomization_ofs) : __uint_as_float(data_node3.w);
+
+			float factor_random_color = lerp(1.0f-color_randomization, 1.0f, random);
+			float factor_random_roughness = lerp(1.0f-roughness_randomization, 1.0f, random);
 
 			PrincipledHairBSDF *bsdf = (PrincipledHairBSDF*)bsdf_alloc(sd, sizeof(PrincipledHairBSDF), weight);
 			if(bsdf) {
@@ -753,8 +759,8 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 					break;
 
 				bsdf->N = N;
-				bsdf->v = param1;
-				bsdf->s = param2;
+				bsdf->v = param1*factor_random_roughness;
+				bsdf->s = param2*factor_random_roughness;
 				bsdf->m0_roughness = m0_roughness;
 				bsdf->alpha = alpha;
 				bsdf->eta = ior;
@@ -772,7 +778,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
 						bsdf->sigma = -log3(max(absorption_coefficient, make_float3(1e-5f, 1e-5f, 1e-5f)));
 						break;
 					case NODE_PRINCIPLED_HAIR_PIGMENT_CONCENTRATION: {
-						float3 melanin_sigma = eumelanin*make_float3(0.419f, 0.697f, 1.37f) + pheomelanin*make_float3(0.187f, 0.4f, 1.05f);
+						float3 melanin_sigma = eumelanin*factor_random_color*make_float3(0.419f, 0.697f, 1.37f) + pheomelanin*factor_random_color*make_float3(0.187f, 0.4f, 1.05f);
 						float roughness_fac = (((((0.245f*param2) + 5.574f)*param2 - 10.73f)*param2 + 2.532f)*param2 - 0.215f)*param2 + 5.969f;
 						float3 tint_sigma = log3(tint)/roughness_fac;
 						tint_sigma *= tint_sigma;
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index fdc7c259dbb..77d5f75c594 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -1073,7 +1073,7 @@ int ShaderGraph::get_num_closures()
 			num_closures += VOLUME_STACK_SIZE;
 		}
 		else if(closure_type == CLOSURE_BSDF_HAIR_PRINCIPLED_ID) {
-			num_closures += 3;
+			num_closures += 4;
 		}
 		else {
 			++num_closures;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 76bac130d1b..8e0cd122b3d 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -3046,6 +3046,7 @@ NODE_DEFINE(PrincipledHairBsdfNode)
 	SOCKET_IN_FLOAT(eumelanin, "Melanin", 0.0f);
 	SOCKET_IN_FLOAT(pheomelanin, "Melanin Redness", 1.3f);
 	SOCKET_IN_COLOR(tint, "Tint", make_float3(1.f, 1.f, 1.f));
+	SOCKET_IN_FLOAT(color_randomization, "Color Randomization", 0.0f);
 	SOCKET_IN_VECTOR(absorption_coefficient, "Absorption Coefficient", make_float3(0.245531f, 0.52f, 1.365f), 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);
@@ -3060,6 +3061,7 @@ NODE_DEFINE(PrincipledHairBsdfNode)
 	SOCKET_IN_FLOAT(offset, "Offset", 2.f*M_PI/180.f);
 	SOCKET_IN_FLOAT(roughness_u, "RoughnessU", 0.3f);
 	SOCKET_IN_FLOAT(roughness_v, "RoughnessV", 0.3f);
+	SOCKET_IN_FLOAT(roughness_randomization, "Roughness Randomization", 0.0f);
 	SOCKET_IN_FLOAT(primary_reflection_roughness, "Primary Reflection Roughness", 1.0f);
 	SOCKET_IN_FLOAT(ior, "IOR", 1.55f);
 
@@ -3082,11 +3084,13 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
 
 	ShaderInput *roughness_u_in = input("RoughnessU");
 	ShaderInput *roughness_v_in = input("RoughnessV");
+	ShaderInput *roughness_randomization_in = input("Roughness Randomization");
 	ShaderInput *offset_in = input("Offset");
 	ShaderInput *primary_reflection_roughness_in = input("Primary Reflection Roughness");
 	ShaderInput *ior_in = input("IOR");
 	ShaderInput *eumelanin_in =  input("Melanin");
 	ShaderInput *pheomelanin_in = input("Melanin Redness");
+	ShaderInput *color_randomization_in = input("Color Randomization");
 
 	int color_ofs = compiler.stack_assign(input("Color"));
 	int tint_ofs = compiler.stack_assign(input("Tint"));
@@ -3125,11 +3129,11 @@ void PrincipledHairBsdfNode::compile(SVMCompiler& compiler)
 		compiler.encode_uchar4(
 			tint_ofs,
 			compiler.stack_assign_if_linked(random_in),
-			SVM_STACK_INVALID,
-			SVM_STACK_INVALID),
+			compiler.stack_assign_if_linked(color_randomization_in),
+			compiler.stack_assign_if_linked(roughness_randomization_in)),
 		__float_as_int(random),
-		SVM_STACK_INVALID,
-		SVM_STACK_INVALID);
+		__float_as_int(color_randomization),
+		__float_as_int(roughness_randomization));
 }
 
 void PrincipledHairBsdfNode::compile(OSLCompiler& compiler)
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index e7d844e0444..de431ac8f4a 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -608,6 +608,7 @@ public:
 
 	float roughness_u;
 	float roughness_v;
+	float roughness_randomization;
 	float primary_reflection_roughness;
 	float ior;
 	float offset;
@@ -615,6 +616,7 @@ public:
 	float eumelanin;
 	float pheomelanin;
 	float3 tint;
+	float color_randomization;
 	float3 absorption_coefficient;
 
 	float3 normal;
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 d878ef78fb4..ef5a06fd1ed 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
@@ -34,12 +34,14 @@ static bNodeSocketTemplate sh_node_bsdf_hair_principled_in[] = {
 	{	SOCK_FLOAT,		1, N_("Melanin"),						0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
 	{	SOCK_FLOAT,		1, N_("Melanin Redness"),				1.3f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
 	{	SOCK_RGBA,		1, N_("Tint"),							1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+	{	SOCK_FLOAT, 	1, N_("Color Randomization"), 			0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list