[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