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. @@ _______________________________________________ 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