Commit: 83ae0a0e068d1bac498722aea3ee7dbfad3b151f
Author: Lukas Stockner
Date:   Mon Jul 25 16:00:36 2016 +0200
Branches: master
https://developer.blender.org/rB83ae0a0e068d1bac498722aea3ee7dbfad3b151f

Cycles: Calculate differentials in the Multiscattering GGX closures

The Multiscattering GGX closures didn't set the omega_i differentials, which 
could cause undefined behaviour.

===================================================================

M       intern/cycles/kernel/closure/bsdf_microfacet_multi.h

===================================================================

diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h 
b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
index 51b12fe..deb3d24 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
@@ -406,6 +406,10 @@ ccl_device int 
bsdf_microfacet_multi_ggx_sample(KernelGlobals *kg, const ShaderC
        *eval *= *pdf;
 
        *omega_in = X*localO.x + Y*localO.y + Z*localO.z;
+#ifdef __RAY_DIFFERENTIALS__
+       *domega_in_dx = (2 * dot(Z, dIdx)) * Z - dIdx;
+       *domega_in_dy = (2 * dot(Z, dIdy)) * Z - dIdy;
+#endif
        return LABEL_REFLECT|LABEL_GLOSSY;
 }
 
@@ -463,10 +467,23 @@ ccl_device int 
bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
        *eval *= *pdf;
 
        *omega_in = X*localO.x + Y*localO.y + Z*localO.z;
-       if(localO.z*localI.z > 0.0f)
+       if(localO.z*localI.z > 0.0f) {
+#ifdef __RAY_DIFFERENTIALS__
+               *domega_in_dx = (2 * dot(Z, dIdx)) * Z - dIdx;
+               *domega_in_dy = (2 * dot(Z, dIdy)) * Z - dIdy;
+#endif
                return LABEL_REFLECT|LABEL_GLOSSY;
-       else
+       }
+       else {
+#ifdef __RAY_DIFFERENTIALS__
+               float cosI = dot(Z, I);
+               float dnp = max(sqrtf(1.0f - (sc->data2 * sc->data2 * (1.0f - 
cosI*cosI))), 1e-7f);
+               *domega_in_dx = -(sc->data2 * dIdx) + ((sc->data2 - sc->data2 * 
sc->data2 * cosI / dnp) * dot(dIdx, Z)) * Z;
+               *domega_in_dy = -(sc->data2 * dIdy) + ((sc->data2 - sc->data2 * 
sc->data2 * cosI / dnp) * dot(dIdy, Z)) * Z;
+#endif
+
                return LABEL_TRANSMIT|LABEL_GLOSSY;
+       }
 }
 
 CCL_NAMESPACE_END

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to