Fix T40964: Massive shading failures with glass node mixing, whiteouts and blackouts
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 15 Jul 2014 09:56:40 +0000 (15:56 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 15 Jul 2014 09:59:00 +0000 (15:59 +0600)
intern/cycles/kernel/closure/bsdf_microfacet.h

index df0644becee418bbabbcef7d71c4a26ad5614f43..870b56803bb10b416808317785d0b4b29c3b3d4b 100644 (file)
@@ -513,6 +513,10 @@ ccl_device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderClosure *sc, con
        float cosHO = dot(Ht, I);
        float cosHI = dot(Ht, omega_in);
 
+       /* those situations makes chi+ terms in eq. 33, 34 be zero */
+       if(dot(Ht, N) <= 0.0f || cosHO * cosNO <= 0.0f || cosHI * cosNI <= 0.0f)
+               return make_float3(0.0f, 0.0f, 0.0f);
+
        float D, G1o, G1i;
 
        /* eq. 33: first we calculate D(m) with m=Ht: */
@@ -862,7 +866,11 @@ ccl_device float3 bsdf_microfacet_beckmann_eval_transmit(const ShaderClosure *sc
        float cosHO = dot(Ht, I);
        float cosHI = dot(Ht, omega_in);
 
-       /* eq. 33: first we calculate D(m) with m=Ht: */
+       /* those situations makes chi+ terms in eq. 25, 27 be zero */
+       if(dot(Ht, N) <= 0.0f || cosHO * cosNO <= 0.0f || cosHI * cosNI <= 0.0f)
+               return make_float3(0.0f, 0.0f, 0.0f);
+
+       /* eq. 25: first we calculate D(m) with m=Ht: */
        float alpha2 = alpha_x * alpha_y;
        float cosThetaM = min(dot(N, Ht), 1.0f);
        float cosThetaM2 = cosThetaM * cosThetaM;