Commit: f88b91fe6196b5069813e3d87373875a2ec4f169 Author: Weizhen Huang Date: Wed Jan 11 18:23:04 2023 +0100 Branches: microfacet_hair https://developer.blender.org/rBf88b91fe6196b5069813e3d87373875a2ec4f169
Split `model_type` into `cross_section_type` and `distribution_type` Also disable analytical GGX R because it seems confusing =================================================================== M intern/cycles/blender/shader.cpp M intern/cycles/kernel/closure/bsdf_hair_microfacet.h M intern/cycles/kernel/osl/shaders/node_microfacet_hair_bsdf.osl M intern/cycles/kernel/svm/closure.h M intern/cycles/kernel/svm/types.h M intern/cycles/scene/shader_nodes.cpp M intern/cycles/scene/shader_nodes.h M release/datafiles/locale M release/scripts/addons M release/scripts/addons_contrib M source/blender/makesdna/DNA_node_types.h M source/blender/makesrna/intern/rna_nodetree.c M source/blender/nodes/shader/nodes/node_shader_bsdf_hair_microfacet.cc M source/tools =================================================================== diff --git a/intern/cycles/blender/shader.cpp b/intern/cycles/blender/shader.cpp index 43bc5538628..099a48af84d 100644 --- a/intern/cycles/blender/shader.cpp +++ b/intern/cycles/blender/shader.cpp @@ -668,11 +668,16 @@ static ShaderNode *add_node(Scene *scene, "parametrization", NODE_MICROFACET_HAIR_NUM, NODE_MICROFACET_HAIR_REFLECTANCE)); - microfacet_hair->set_model_type( - (NodeMicrofacetHairModelType)get_enum(b_microfacet_hair_node.ptr, - "model_type", - NODE_MICROFACET_HAIR_MODEL_TYPE_NUM, - NODE_MICROFACET_HAIR_CIRCULAR_GGX)); + microfacet_hair->set_cross_section_type( + (NodeMicrofacetHairCrossSectionType)get_enum(b_microfacet_hair_node.ptr, + "cross_section_type", + NODE_MICROFACET_HAIR_CROSS_SECTION_TYPE_NUM, + NODE_MICROFACET_HAIR_CIRCULAR)); + microfacet_hair->set_distribution_type( + (NodeMicrofacetHairDistributionType)get_enum(b_microfacet_hair_node.ptr, + "distribution_type", + NODE_MICROFACET_HAIR_DISTRIBUTION_TYPE_NUM, + NODE_MICROFACET_HAIR_GGX)); node = microfacet_hair; } else if (b_node.is_a(&RNA_ShaderNodeBsdfPrincipled)) { diff --git a/intern/cycles/kernel/closure/bsdf_hair_microfacet.h b/intern/cycles/kernel/closure/bsdf_hair_microfacet.h index 3216511a26d..90a9fec8295 100644 --- a/intern/cycles/kernel/closure/bsdf_hair_microfacet.h +++ b/intern/cycles/kernel/closure/bsdf_hair_microfacet.h @@ -37,8 +37,11 @@ typedef struct MicrofacetHairBSDF { /* Blur. */ float blur; - /* Circular/Ellipitic and GGX/Beckmann. */ - int model_type; + /* GGX/Beckmann. */ + int distribution_type; + + /* Circular/Elliptical */ + int cross_section_type; /* Extra closure. */ ccl_private MicrofacetHairExtra *extra; @@ -72,8 +75,7 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd, kernel_assert(isfinite_safe(X)); kernel_assert(isfinite_safe(h)); - if (bsdf->model_type == NODE_MICROFACET_HAIR_ELLIPTIC_GGX || - bsdf->model_type == NODE_MICROFACET_HAIR_ELLIPTIC_BECKMANN) { + if (bsdf->cross_section_type == NODE_MICROFACET_HAIR_ELLIPTIC) { /* Local frame is independent of the ray direction for elliptical hairs. */ bsdf->extra->geom.w = h; } @@ -329,8 +331,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_r_circular(ccl_private const ShaderC const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; const float eta = bsdf->eta; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_CIRCULAR_BECKMANN); - const bool analytical_ggx = (bsdf->model_type == NODE_MICROFACET_HAIR_CIRCULAR_GGX_ANALYTIC); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); float3 R = zero_float3(); if (bsdf->extra->R <= 0.0f) @@ -359,68 +360,26 @@ ccl_device float3 bsdf_microfacet_hair_eval_r_circular(ccl_private const ShaderC float integral = 0.0f; - /* analytical for ggx (no masking term) */ - if (analytical_ggx) { - const float phi_h = dir_phi(wh); - const float d_max = phi_h - phi_m_max; - const float d_min = phi_h - phi_m_min; - - const float roughness_squared = roughness * roughness; - - float sm, cm; - fast_sincosf(tilt, &sm, &cm); - - const float C = sqrtf(1.0f - roughness_squared); - const float A = cm * cos_theta(wh) * C; - const float B = sm * sin_theta(wh) * C; - const float A2 = sqr(A); - const float B2 = sqr(B); - const float tmp1 = 1.0f / sqrtf(sqr(B - 1.0f) - A2); - const float tmp2 = 1.0f / sqrtf(sqr(B + 1.0f) - A2); - - float smax, cmax, smin, cmin; - fast_sincosf(d_max, &smax, &cmax); - fast_sincosf(d_min, &smin, &cmin); - - const float tmax = smax / (1.0f + cmax); - const float tmin = smin / (1.0f + cmin); - - const float temp1 = 2.0f * (A2 - B2 + 3.0f * B - 2) * sqr(tmp1) * tmp1 * - (atanf((A - B + 1.0f) * tmp1 * tmax) - - atanf((A - B + 1.0f) * tmp1 * tmin)); - const float temp2 = 2.0f * (A2 - B2 - 3.0f * B - 2) * sqr(tmp2) * tmp2 * - (atanf((B - A + 1.0f) * tmp2 * tmax) - - atanf((B - A + 1.0f) * tmp2 * tmin)); - const float temp3 = A * sqr(tmp1) * - (smax / (A * cmax + B - 1.0f) - smin / (A * cmin + B - 1.0f)); - const float temp4 = A * sqr(tmp2) * - (smax / (A * cmax + B + 1.0f) - smin / (A * cmin + B + 1.0f)); - - integral = roughness_squared * M_1_PI_F * 0.5f * (temp1 + temp2 + temp3 + temp4); - } - else { /* Falls back to numerical integration. */ - /* Maximal sample resolution. */ - float res = roughness * 0.7f; - /* Number of intervals should be even. */ - const size_t intervals = 2 * (size_t)ceilf((phi_m_max - phi_m_min) / res * 0.5f); + /* Maximal sample resolution. */ + float res = roughness * 0.7f; + /* Number of intervals should be even. */ + const size_t intervals = 2 * (size_t)ceilf((phi_m_max - phi_m_min) / res * 0.5f); - /* Modified resolution based on numbers of intervals. */ - res = (phi_m_max - phi_m_min) / float(intervals); + /* Modified resolution based on numbers of intervals. */ + res = (phi_m_max - phi_m_min) / float(intervals); - /* Integrate using Simpson's rule. */ - for (size_t i = 0; i <= intervals; i++) { + /* Integrate using Simpson's rule. */ + for (size_t i = 0; i <= intervals; i++) { - const float phi_m = phi_m_min + i * res; - const float3 wm = sph_dir(tilt, phi_m); + const float phi_m = phi_m_min + i * res; + const float3 wm = sph_dir(tilt, phi_m); - if (microfacet_visible(wi, wo, make_float3(wm.x, 0.0f, wm.z), wh)) { - const float weight = (i == 0 || i == intervals) ? 0.5f : (i % 2 + 1); - integral += weight * D(beckmann, roughness, wm, wh) * - G(beckmann, roughness, wi, wo, wm, wh); - } + if (microfacet_visible(wi, wo, make_float3(wm.x, 0.0f, wm.z), wh)) { + const float weight = (i == 0 || i == intervals) ? 0.5f : (i % 2 + 1); + integral += weight * D(beckmann, roughness, wm, wh) * G(beckmann, roughness, wi, wo, wm, wh); } - integral *= (2.0f / 3.0f * res); } + integral *= (2.0f / 3.0f * res); const float F = fresnel_dielectric_cos(dot(wi, wh), eta); @@ -438,7 +397,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt_circular(KernelGlobals kg, const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; const float eta = bsdf->eta; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_CIRCULAR_BECKMANN); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); if (bsdf->extra->TT <= 0.0f && bsdf->extra->TRT <= 0.0f) return zero_float3(); @@ -652,7 +611,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg, const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_CIRCULAR_BECKMANN); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); /* generate sample */ float sample_lobe = randu; @@ -833,7 +792,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_r_elliptic(ccl_private const ShaderC const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; const float eta = bsdf->eta; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_ELLIPTIC_BECKMANN); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); float3 R = zero_float3(); if (bsdf->extra->R <= 0.0f) { @@ -933,7 +892,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt_elliptic(KernelGlobals kg, const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; const float eta = bsdf->eta; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_ELLIPTIC_BECKMANN); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); if (bsdf->extra->TT <= 0.0f && bsdf->extra->TRT <= 0.0f) { return zero_float3(); @@ -1203,7 +1162,7 @@ ccl_device int bsdf_microfacet_hair_sample_elliptic(const KernelGlobals kg, const float tilt = -bsdf->alpha; const float roughness = bsdf->roughness; - const bool beckmann = (bsdf->model_type == NODE_MICROFACET_HAIR_ELLIPTIC_BECKMANN); + const bool beckmann = (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN); /* generate sample */ float sample_lobe = randu; @@ -1387,17 +1346,12 @@ ccl_device Spectrum bsdf_microfacet_hair_eval(KernelGlobals kg, { ccl_private MicrofacetHairBSDF *bsdf = (ccl_private MicrofacetHairBSDF *)sc; - switch (bsdf->model_type) { - case NODE_MICROFACET_HAIR_CIRCULAR_GGX: - case NODE_MICROFACET_HAIR_CIRCULAR_GGX_ANALYTIC: - case NODE_MICROFACET_HAIR_CIRCULAR_BECKMANN: - return bsdf_microfacet_hair_eval_circular(kg, sd, sc, omega_in, pdf); - case NODE_MICROFACET_HAIR_ELLIPTIC_GGX: - case NODE_MICROFACET_HAIR_ELLIPTIC_BECKMANN: - return bsdf_microfacet_hair_eval_elliptic(kg, sd, sc, omega_in, pdf); - default: - return bsdf_microfacet_hair_eval_circular(kg, sd, sc, omega_in, pdf); + if (bsdf->cross_section_type == NODE_MICROFACET_HAIR_CIRCULAR || + bsdf->extra->aspect_ratio == 1.0f) { + return bsdf_microfacet_hair_eval_circular(kg, sd, sc, omega_in, pdf); } + + return bsdf_microfacet_hair_eval_elliptic(kg, sd, sc, omega_in, pdf); } ccl_device int bsdf_microfacet_hair_sample(KernelGlobals kg, @@ -1413,20 +1367,14 @@ ccl_device int bsdf_microfacet_hair_sample(KernelGlobals kg, { ccl_private MicrofacetHairBSDF *bsdf = (ccl_private MicrofacetHairBSDF *)sc; - swi @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs