[Bf-blender-cvs] [167b3bb17d7] microfacet_hair: Add paper citation and format comments

Weizhen Huang noreply at git.blender.org
Mon Jan 23 12:16:09 CET 2023


Commit: 167b3bb17d7c67aa38826601f403f20e8571866c
Author: Weizhen Huang
Date:   Mon Jan 23 12:15:22 2023 +0100
Branches: microfacet_hair
https://developer.blender.org/rB167b3bb17d7c67aa38826601f403f20e8571866c

Add paper citation and format comments

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

M	intern/cycles/kernel/closure/bsdf_hair_microfacet.h

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

diff --git a/intern/cycles/kernel/closure/bsdf_hair_microfacet.h b/intern/cycles/kernel/closure/bsdf_hair_microfacet.h
index 7fb803903cd..4494a4d24e2 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_microfacet.h
@@ -1,6 +1,10 @@
 /* SPDX-License-Identifier: Apache-2.0
  * Copyright 2018-2022 Blender Foundation */
 
+/* This code implements the paper [A Microfacet-based Hair Scattering
+ * Model](https://onlinelibrary.wiley.com/doi/full/10.1111/cgf.14588) by Weizhen Huang, Matthias B.
+ * Hullin and Johannes Hanika. */
+
 #pragma once
 
 #ifndef __KERNEL_GPU__
@@ -80,7 +84,6 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd,
           sd->dPdu, make_float3(bsdf->extra->geom.x, bsdf->extra->geom.y, bsdf->extra->geom.z)));
       const float3 major_axis = safe_normalize(cross(minor_axis, sd->dPdu));
 
-      /* Local frame is independent of the ray direction for elliptical hairs. */
       bsdf->extra->geom = make_float4(major_axis.x, major_axis.y, major_axis.z, h);
     }
     else {
@@ -88,6 +91,7 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd,
     }
   }
   else {
+    /* Align local frame with the ray direction so that `phi_i == 0`. */
     bsdf->extra->geom = make_float4(X.x, X.y, X.z, h);
   }
 
@@ -226,9 +230,9 @@ ccl_device_inline float3 sample_wh(
 
   const float3 wi_wm = make_float3(dot(wi, s), dot(wi, t), dot(wi, n));
 
-  float G1i;
+  float discard;
   const float3 wh_wm = microfacet_sample_stretched<m_type>(
-      kg, wi_wm, roughness, roughness, rand.x, rand.y, &G1i);
+      kg, wi_wm, roughness, roughness, rand.x, rand.y, &discard);
 
   const float3 wh = wh_wm.x * s + wh_wm.y * t + wh_wm.z * n;
   return wh;
@@ -365,7 +369,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_r(ccl_private const ShaderClosure *s
   /* Modified resolution based on numbers of intervals. */
   res = (gamma_m_max - gamma_m_min) / float(intervals);
 
-  /* Integrate using Simpson's rule. */
+  /* Integrate using Composite Simpson's 1/3 rule. */
   float integral = 0.0f;
   for (size_t i = 0; i <= intervals; i++) {
 
@@ -445,7 +449,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt(KernelGlobals kg,
     const float3 wmi = sphg_dir(tilt, gamma_mi, b);
     const float3 wmi_ = sphg_dir(0.0f, gamma_mi, b);
 
-    /* sample wh1 */
+    /* Sample wh1. */
     const float2 sample1 = make_float2(lcg_step_float(&rng_quadrature),
                                        lcg_step_float(&rng_quadrature));
 
@@ -473,7 +477,6 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt(KernelGlobals kg,
       continue;
     }
 
-    /* Simpson's rule weight */
     const float weight = (i == 0 || i == intervals) ? 0.5f : (i % 2 + 1);
 
     const float3 A_t = exp(mu_a / cos_theta(wt) *
@@ -626,7 +629,7 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
   const float roughness = bsdf->roughness;
   const float roughness2 = sqr(roughness);
 
-  /* generate sample */
+  /* Generate samples. */
   float sample_lobe = randu;
   const float sample_h = randv;
   const float2 sample_h1 = make_float2(lcg_step_float(&sd->lcg_state),
@@ -655,7 +658,7 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
     return LABEL_NONE;
   }
 
-  /* sample R lobe */
+  /* Sample R lobe. */
   const float3 wh1 = sample_wh<m_type>(kg, roughness, wi, wmi, sample_h1);
   const float3 wr = -reflect(wi, wh1);
 
@@ -669,7 +672,7 @@ ccl_device int bsdf_microfacet_hair_sample(const KernelGlobals kg,
   const float R1 = fresnel(dot(wi, wh1), *eta, &cos_theta_t1);
   const float3 R = make_float3(bsdf->extra->R * R1);
 
-  /* sample TT lobe */
+  /* Sample TT lobe. */
   const float3 wt = -refract_angle(wi, wh1, cos_theta_t1, inv_eta);
   const float phi_t = dir_phi(wt);
 
@@ -820,7 +823,7 @@ ccl_device Spectrum bsdf_microfacet_hair_eval(KernelGlobals kg,
     return zero_spectrum();
   }
 
-  /* evaluate */
+  /* Evaluate. */
   float3 R;
   if (bsdf->distribution_type == NODE_MICROFACET_HAIR_BECKMANN) {
     R = bsdf_microfacet_hair_eval_r<MicrofacetType::BECKMANN>(sc, local_I, local_O) +
@@ -868,8 +871,7 @@ ccl_device void bsdf_microfacet_hair_blur(ccl_private ShaderClosure *sc, float r
   bsdf->roughness = fmaxf(roughness, bsdf->roughness);
 }
 
-/* Hair Albedo */
-
+/* Hair Albedo. */
 ccl_device float3 bsdf_microfacet_hair_albedo(ccl_private const ShaderClosure *sc)
 {
   ccl_private MicrofacetHairBSDF *bsdf = (ccl_private MicrofacetHairBSDF *)sc;



More information about the Bf-blender-cvs mailing list