[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