[Bf-blender-cvs] [e59a4130910] principled-v2: Fix broken thin film refraction for base IOR=1
Lukas Stockner
noreply at git.blender.org
Sun Oct 30 16:35:31 CET 2022
Commit: e59a413091010c80963959095dc6b774a3c513fc
Author: Lukas Stockner
Date: Sun Oct 30 15:39:31 2022 +0100
Branches: principled-v2
https://developer.blender.org/rBe59a413091010c80963959095dc6b774a3c513fc
Fix broken thin film refraction for base IOR=1
===================================================================
M intern/cycles/kernel/closure/bsdf_microfacet_glass.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_glass.h b/intern/cycles/kernel/closure/bsdf_microfacet_glass.h
index c6ab2e385e0..160a9a8b76c 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_glass.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_glass.h
@@ -132,6 +132,12 @@ ccl_device Spectrum bsdf_microfacet_ggx_glass_eval_transmit(ccl_private const Mi
return zero_spectrum();
}
+ /* For IOR very close to 1.0, the transmission component becomes singular. */
+ if (fabsf(bsdf->ior - 1.0f) < 1e-5f) {
+ *pdf = 0.0f;
+ return zero_spectrum();
+ }
+
float eta = bsdf->ior;
float3 ht = -(eta * omega_in + I);
float3 m = normalize(ht);
@@ -299,20 +305,30 @@ ccl_device int bsdf_microfacet_ggx_glass_sample(ccl_private const ShaderClosure
return LABEL_NONE;
}
- label = LABEL_TRANSMIT | LABEL_GLOSSY;
+ label = LABEL_TRANSMIT;
*omega_in = T;
*pdf = 1.0f - reflect_pdf;
*eval = one_spectrum() - F;
+ /* For IOR very close to 1.0, the transmission component becomes singular. */
+ label |= (fabsf(bsdf->ior - 1.0f) < 1e-5f) ? LABEL_SINGULAR : LABEL_GLOSSY;
+
/* Compute microfacet common term. */
float cosMI = dot(m, *omega_in);
float Ht2 = sqr(bsdf->ior * cosMI + cosMO);
common = D * fabsf(cosMI * cosMO) * sqr(bsdf->ior) / (cosNO * Ht2);
}
- float lambdaI = microfacet_ggx_lambda(cosNI, alpha2);
- *eval *= common / (1 + lambdaO + lambdaI);
- *pdf *= common / (1 + lambdaO);
+ if (label & LABEL_GLOSSY) {
+ float lambdaI = microfacet_ggx_lambda(cosNI, alpha2);
+ *eval *= common / (1 + lambdaO + lambdaI);
+ *pdf *= common / (1 + lambdaO);
+ }
+ else {
+ /* Specular case, just return some high number for MIS */
+ *eval *= 1e6f;
+ *pdf *= 1e6f;
+ }
if (bsdf->type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID) {
*eval *= do_reflect ? reflection_color(bsdf, *omega_in, m) : bsdf->extra->color;
More information about the Bf-blender-cvs
mailing list