Cycles: Calculate differentials in the Multiscattering GGX closures

The Multiscattering GGX closures didn't set the omega_i differentials, which could cause undefined behaviour.
This commit is contained in:
Lukas Stockner 2016-07-25 16:00:36 +02:00
parent 988ec3c40c
commit 83ae0a0e06

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