[Bf-blender-cvs] [1edaee99266] microfacet_hair: Cleanup: renaming a few functions and variables
Weizhen Huang
noreply at git.blender.org
Wed Dec 14 15:13:31 CET 2022
Commit: 1edaee99266d9c0a3db34a12cc5c90bfbbc04900
Author: Weizhen Huang
Date: Wed Dec 14 15:13:15 2022 +0100
Branches: microfacet_hair
https://developer.blender.org/rB1edaee99266d9c0a3db34a12cc5c90bfbbc04900
Cleanup: renaming a few functions and variables
===================================================================
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 cf87fa73e2d..8cf39366111 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_microfacet.h
@@ -66,8 +66,8 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd,
bsdf->roughness = clamp(bsdf->roughness, 0.001f, 1.0f);
/* Compute local frame, aligned to curve tangent and ray direction. */
- float3 X = safe_normalize(sd->dPdu);
- float3 Y = safe_normalize(cross(X, sd->I));
+ float3 Y = safe_normalize(sd->dPdu);
+ float3 X = safe_normalize(cross(Y, sd->I));
/* h -1..0..1 means the rays goes from grazing the hair, to hitting it at
* the center, to grazing the other edge. This is the sine of the angle
@@ -75,13 +75,13 @@ ccl_device int bsdf_microfacet_hair_setup(ccl_private ShaderData *sd,
/* TODO: we convert this value to a cosine later and discard the sign, so
* we could probably save some operations. */
- float h = (sd->type & PRIMITIVE_CURVE_RIBBON) ? -sd->v : -dot(Y, sd->Ng);
+ float h = (sd->type & PRIMITIVE_CURVE_RIBBON) ? -sd->v : -dot(X, sd->Ng);
kernel_assert(fabsf(h) < 1.0f + 1e-4f);
- kernel_assert(isfinite_safe(Y));
+ kernel_assert(isfinite_safe(X));
kernel_assert(isfinite_safe(h));
- bsdf->extra->geom = make_float4(Y.x, Y.y, Y.z, h);
+ bsdf->extra->geom = make_float4(X.x, X.y, X.z, h);
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_NEEDS_LCG | SD_BSDF_HAS_TRANSMISSION;
}
@@ -216,15 +216,18 @@ ccl_device_inline float3 sample_wh(KernelGlobals kg,
}
/* Check micronormal/mesonormal direct visiblity from v */
-ccl_device_inline bool smith_g1_(const float3 v, const float3 m, const float3 h)
+ccl_device_inline bool microfacet_visible(const float3 v, const float3 m, const float3 h)
{
return (dot(v, h) > 0.f && dot(v, m) > 0.f);
}
/* Check micronormal/mesonormal direct visiblity from wi and wo */
-ccl_device_inline bool G_(const float3 wi, const float3 wo, const float3 m, const float3 h)
+ccl_device_inline bool microfacet_visible(const float3 wi,
+ const float3 wo,
+ const float3 m,
+ const float3 h)
{
- return smith_g1_(wi, m, h) && smith_g1_(wo, m, h);
+ return microfacet_visible(wi, m, h) && microfacet_visible(wo, m, h);
}
/* Check micronormal/mesonormal statistical visiblity from v: Smith's separable shadowing/masking
@@ -238,23 +241,8 @@ ccl_device_inline float smith_g1(
if (dot(v, h) <= 0.f || cos_vm <= 0.f)
return 0.f;
- const float roughness2 = sqr(roughness);
-
- float result;
- if (beckmann) {
- float tmp = fabsf(1.f / (sqr(cos_vm)) - 1.f);
- float a_sqr = 1.f / (roughness2 * tmp);
- float a = sqrtf(a_sqr);
-
- /* Use a fast and accurate (<0.35% rel. error) rational approximation to the shadowing-masking
- * function */
- result = (a >= 1.6f) ? 1.f :
- (3.535f * a + 2.181f * a_sqr) / (1.f + 2.276f * a + 2.577f * a_sqr);
- }
- else {
- result = 2.f / (1.f + sqrtf(roughness2 / sqr(cos_vm) + 1.f - roughness2));
- }
- return result;
+ return beckmann ? bsdf_beckmann_G1(roughness, cos_vm) :
+ 2.f / (1.f + sqrtf(1.0f + sqr(roughness) * (1.0f / sqr(cos_vm) - 1.0f)));
}
/* Smith's separable shadowing-masking approximation */
@@ -326,10 +314,10 @@ ccl_device float fresnel(float cos_theta_i, float eta, ccl_private float &cos_th
return r;
}
-ccl_device_inline float3 refract(const float3 incident,
- const float3 normal,
- const float cos_theta_t,
- const float inv_eta)
+ccl_device_inline float3 refract_angle(const float3 incident,
+ const float3 normal,
+ const float cos_theta_t,
+ const float inv_eta)
{
return inv_eta * incident - (inv_eta * dot(normal, incident) + cos_theta_t) * normal;
}
@@ -429,7 +417,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_r_circular(ccl_private const ShaderC
const float3 wm = sph_dir(tilt, phi_m);
const float J = fmaxf(cos(phi_i - phi_m), 0.f);
- if (G_(wi, wo, make_float3(wm.x, 0.f, wm.z), wh)) {
+ if (microfacet_visible(wi, wo, make_float3(wm.x, 0.f, wm.z), wh)) {
const float weight = (i == 0 || i == intervals - 1) ? 0.5f : (i % 2 + 1);
integral += weight * D(beckmann, roughness, wm, wh) *
G(beckmann, roughness, wi, wo, wm, wh) * J;
@@ -502,13 +490,13 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt_circular(KernelGlobals kg,
const float T1 = 1.f - fresnel(dot_wi_wh1, eta, cos_theta_t1);
/* refraction at the first interface */
- const float3 wt = -refract(wi, wh1, cos_theta_t1, inv_eta);
+ const float3 wt = -refract_angle(wi, wh1, cos_theta_t1, inv_eta);
const float phi_t = dir_phi(wt);
const float phi_mt = 2.f * phi_t - phi_mi;
const float3 wmt = sph_dir(-tilt, phi_mt);
const float G1 = G(beckmann, roughness, wi, -wt, wmi, wh1);
- if (G1 == 0.f || !G_(wi, -wt, make_float3(wmi.x, 0.f, wmi.z), wh1))
+ if (G1 == 0.f || !microfacet_visible(wi, -wt, make_float3(wmi.x, 0.f, wmi.z), wh1))
continue;
/* Simpson's rule weight */
@@ -561,7 +549,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt_circular(KernelGlobals kg,
float3 wtr = -reflect(wt, wh2);
float G2 = G(beckmann, roughness, -wt, -wtr, wmt, wh2);
- if (G2 == 0.f || G_(-wt, -wtr, make_float3(wmt.x, 0.f, wmt.z), wh2) == 0.f)
+ if (G2 == 0.f || microfacet_visible(-wt, -wtr, make_float3(wmt.x, 0.f, wmt.z), wh2) == 0.f)
continue;
/* total internal reflection */
@@ -575,7 +563,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_tt_trt_circular(KernelGlobals kg,
float3 wh3 = wtr + inv_eta * wo;
float G3 = G(beckmann, roughness, wtr, -wo, wmtr, wh3);
if (dot(wmtr, wh3) < 0.f || G3 == 0.f ||
- !G_(wtr, -wo, make_float3(wmtr.x, 0.f, wmtr.z), wh3))
+ !microfacet_visible(wtr, -wo, make_float3(wmtr.x, 0.f, wmtr.z), wh3))
continue;
float rcp_norm_wh3 = 1.f / len(wh3);
@@ -704,7 +692,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
const float3 wr = -reflect(wi, wh1);
/* ensure that this is a valid sample */
- if (dot(wr, wh1) <= 0.f || dot(wr, wmi) <= 0.f || !G_(wi, wr, wmi_, wh1)) {
+ if (dot(wr, wh1) <= 0.f || dot(wr, wmi) <= 0.f || !microfacet_visible(wi, wr, wmi_, wh1)) {
*pdf = 0.f;
return LABEL_NONE;
}
@@ -717,7 +705,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
float3 R = make_float3(bsdf->extra->R * R1);
/* sample TT lobe */
- const float3 wt = -refract(wi, wh1, cos_theta_t1, inv_eta);
+ const float3 wt = -refract_angle(wi, wh1, cos_theta_t1, inv_eta);
const float phi_t = dir_phi(wt);
float phi_mi = atan2f(sin_phi_mi, cos_phi_mi);
@@ -734,7 +722,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
float3 wmtr, wmtr_;
if (dot(wt, wh2) < 0.f && dot(wmt, wt) < 0.f &&
- G_(-wt, -wtr, make_float3(wmt.x, 0.f, wmt.z), wh2)) {
+ microfacet_visible(-wt, -wtr, make_float3(wmt.x, 0.f, wmt.z), wh2)) {
const float3 mu_a = bsdf->sigma;
const float cos_gamma_t = -cosf(phi_t - phi_mi);
@@ -746,7 +734,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
const float3 T1 = make_float3(1.f - R1);
const float3 T2 = make_float3(1.f - R2);
- wtt = -refract(-wt, wh2, cos_theta_t2, *eta);
+ wtt = -refract_angle(-wt, wh2, cos_theta_t2, *eta);
if (dot(wtt, wmt) < 0.f && cos_theta_t2 != 0.f) /* total internal reflection */
TT = bsdf->extra->TT * T1 * A_t * T2;
@@ -762,10 +750,11 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
float cos_theta_t3;
const float R3 = fresnel(dot(wtr, wh3), inv_eta, cos_theta_t3);
- wtrt = -refract(wtr, wh3, cos_theta_t3, *eta);
+ wtrt = -refract_angle(wtr, wh3, cos_theta_t3, *eta);
if (cos_theta_t3 != 0.f && dot(wtr, wh3) > 0.f && dot(wmtr, wtr) > 0.f &&
- dot(wtrt, wmtr) < 0.f && G_(wtr, -wtrt, make_float3(wmtr.x, 0.f, wmtr.z), wh3)) {
+ dot(wtrt, wmtr) < 0.f &&
+ microfacet_visible(wtr, -wtrt, make_float3(wmtr.x, 0.f, wmtr.z), wh3)) {
const float3 T3 = make_float3(1.f - R3);
const float cos_gamma_t2 = -cos(phi_tr - phi_mt);
@@ -796,7 +785,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
wo = wr;
*eval = rgb_to_spectrum(R / r * total_energy);
- if (G_(wi, wr, wmi_, wh1))
+ if (microfacet_visible(wi, wr, wmi_, wh1))
visibility = smith_g1(beckmann, roughness, wr, wmi, wh1);
label |= LABEL_REFLECT;
@@ -805,7 +794,7 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
wo = wtt;
*eval = rgb_to_spectrum(TT / tt * total_energy);
- if (G_(wi, -wt, wmi_, wh1) && G_(-wt, -wtt, wmt_, wh2))
+ if (microfacet_visible(wi, -wt, wmi_, wh1) && microfacet_visible(-wt, -wtt, wmt_, wh2))
visibility = smith_g1(beckmann, roughness, -wt, wmi, wh1) *
smith_g1(beckmann, roughness, -wtt, wmt, wh2);
@@ -815,7 +804,8 @@ ccl_device int bsdf_microfacet_hair_sample_circular(const KernelGlobals kg,
wo = wtrt;
*eval = rgb_to_spectrum(TRT / trt * total_energy);
- if (G_(wi, -wt, wmi_, wh1) && G_(-wt, -wtr, wmt_, wh2) && G_(wtr, -wtrt, wmtr_, wh3))
+ if (microfacet_visible(wi, -wt, wmi_, wh1) && microfacet_visible(-wt, -wtr, wmt_, wh2) &&
+ microfacet_visible(wtr, -wtrt, wmtr_, wh3))
visibility = smith_g1(beckmann, roughness, -wt, wmi, wh1) *
smith_g1(beckmann, roughness, -wtr, wmt, wh2) *
smith_g1(beckmann, roughness, -wtrt, wmtr, wh3);
@@ -923,7 +913,7 @@ ccl_device float3 bsdf_microfacet_hair_eval_r_elliptic(ccl_private const ShaderC
const float3 wm = sphg_dir(
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list