[Bf-blender-cvs] [baf66bfa482] upstream_cycles_texture_cache: Cycles: improved ray differentials for specular/glossy closures with DNDU/V enabled
Stefan Werner
noreply at git.blender.org
Wed Jun 27 14:05:04 CEST 2018
Commit: baf66bfa482e8f0ce15a58dfc55196ee7d533192
Author: Stefan Werner
Date: Mon Jul 31 14:15:48 2017 +0200
Branches: upstream_cycles_texture_cache
https://developer.blender.org/rBbaf66bfa482e8f0ce15a58dfc55196ee7d533192
Cycles: improved ray differentials for specular/glossy closures with DNDU/V enabled
===================================================================
M intern/cycles/kernel/closure/bsdf.h
M intern/cycles/kernel/closure/bsdf_microfacet.h
M intern/cycles/kernel/closure/bsdf_microfacet_multi.h
M intern/cycles/kernel/closure/bsdf_refraction.h
M intern/cycles/kernel/closure/bsdf_util.h
M intern/cycles/kernel/kernel_types.h
===================================================================
diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h
index 2b0b853b8b9..4bfd9a94a77 100644
--- a/intern/cycles/kernel/closure/bsdf.h
+++ b/intern/cycles/kernel/closure/bsdf.h
@@ -115,7 +115,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
break;
case CLOSURE_BSDF_REFRACTION_ID:
label = bsdf_refraction_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
- eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf, sd);
break;
case CLOSURE_BSDF_TRANSPARENT_ID:
label = bsdf_transparent_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
@@ -138,7 +138,7 @@ ccl_device_forceinline int bsdf_sample(KernelGlobals *kg,
case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID:
case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
label = bsdf_microfacet_multi_ggx_glass_sample(kg, sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv,
- eval, omega_in, &domega_in->dx, &domega_in->dy, pdf, &sd->lcg_state);
+ eval, omega_in, &domega_in->dx, &domega_in->dy, pdf, &sd->lcg_state, sd);
break;
case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
case CLOSURE_BSDF_MICROFACET_BECKMANN_ANISO_ID:
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet.h b/intern/cycles/kernel/closure/bsdf_microfacet.h
index c9729fbc32e..07f8fad4ff2 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet.h
@@ -688,8 +688,8 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
float3 dwody = -dIdy;
float dDNdx = dot(dwodx, N) + dot(I, sd->dNdx);
float dDNdy = dot(dwody, N) + dot(I, sd->dNdy);
- *domega_in_dx = dwodx + 2.f * (dot(I, N) * sd->dNdx + dDNdx * N);
- *domega_in_dy = dwody + 2.f * (dot(I, N) * sd->dNdy + dDNdy * N);
+ *domega_in_dx = dwodx + 2.0f * (dot(I, N) * sd->dNdx + dDNdx * N);
+ *domega_in_dy = dwody + 2.0f * (dot(I, N) * sd->dNdy + dDNdy * N);
#else
*domega_in_dx = (2.0f * dot(m, dIdx)) * m - dIdx;
*domega_in_dy = (2.0f * dot(m, dIdy)) * m - dIdy;
@@ -715,6 +715,9 @@ ccl_device int bsdf_microfacet_ggx_sample(KernelGlobals *kg, const ShaderClosure
fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
#ifdef __RAY_DIFFERENTIALS__
+# ifdef __DNDU__
+ sd->dNdx, sd->dNdy,
+# endif
dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
#endif
&inside);
@@ -1094,6 +1097,9 @@ ccl_device int bsdf_microfacet_beckmann_sample(KernelGlobals *kg, const ShaderCl
fresnel = fresnel_dielectric(m_eta, m, I, &R, &T,
#ifdef __RAY_DIFFERENTIALS__
+# ifdef __DNDU__
+ sd->dNdx, sd->dNdy,
+# endif
dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
#endif
&inside);
diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
index 47f995568a2..00da9f3349f 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
@@ -478,8 +478,9 @@ ccl_device int bsdf_microfacet_multi_ggx_sample(KernelGlobals *kg, const ShaderC
#ifdef __RAY_DIFFERENTIALS__
*domega_in_dx = (2.0f * dot(Z, dIdx)) * Z - dIdx;
*domega_in_dy = (2.0f * dot(Z, dIdy)) * Z - dIdy;
- *domega_in_dx *= 10.0f;
- *domega_in_dy *= 10.0f;
+ const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+ *domega_in_dx *= (1.0f + softness);
+ *domega_in_dy *= (1.0f + softness);
#endif
return LABEL_REFLECT|LABEL_GLOSSY;
}
@@ -559,7 +560,7 @@ ccl_device float3 bsdf_microfacet_multi_ggx_glass_eval_reflect(const ShaderClosu
return mf_eval_glass(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, use_fresnel, bsdf->extra->cspec0);
}
-ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf, ccl_addr_space uint *lcg_state)
+ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf, ccl_addr_space uint *lcg_state, const ShaderData *sd)
{
const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
@@ -574,6 +575,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
bool inside;
float fresnel = fresnel_dielectric(bsdf->ior, Z, I, &R, &T,
#ifdef __RAY_DIFFERENTIALS__
+# ifdef __DNDU__
+ sd->dNdx, sd->dNdy,
+# endif
dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
#endif
&inside);
@@ -614,6 +618,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
#ifdef __RAY_DIFFERENTIALS__
*domega_in_dx = (2 * dot(Z, dIdx)) * Z - dIdx;
*domega_in_dy = (2 * dot(Z, dIdy)) * Z - dIdy;
+ const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+ *domega_in_dx *= (1.0f + softness);
+ *domega_in_dy *= (1.0f + softness);
#endif
return LABEL_REFLECT|LABEL_GLOSSY;
}
@@ -623,6 +630,9 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_sample(KernelGlobals *kg, const S
float dnp = max(sqrtf(1.0f - (bsdf->ior * bsdf->ior * (1.0f - cosI*cosI))), 1e-7f);
*domega_in_dx = -(bsdf->ior * dIdx) + ((bsdf->ior - bsdf->ior * bsdf->ior * cosI / dnp) * dot(dIdx, Z)) * Z;
*domega_in_dy = -(bsdf->ior * dIdy) + ((bsdf->ior - bsdf->ior * bsdf->ior * cosI / dnp) * dot(dIdy, Z)) * Z;
+ const float softness = min(bsdf->alpha_x, bsdf->alpha_y) * 10.0f;
+ *domega_in_dx *= (1.0f + softness);
+ *domega_in_dy *= (1.0f + softness);
#endif
return LABEL_TRANSMIT|LABEL_GLOSSY;
diff --git a/intern/cycles/kernel/closure/bsdf_refraction.h b/intern/cycles/kernel/closure/bsdf_refraction.h
index 050a4e76fa9..29dc96da454 100644
--- a/intern/cycles/kernel/closure/bsdf_refraction.h
+++ b/intern/cycles/kernel/closure/bsdf_refraction.h
@@ -53,7 +53,7 @@ ccl_device float3 bsdf_refraction_eval_transmit(const ShaderClosure *sc, const f
return make_float3(0.0f, 0.0f, 0.0f);
}
-ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf, ShaderData *sd)
{
const MicrofacetBsdf *bsdf = (const MicrofacetBsdf*)sc;
float m_eta = bsdf->ior;
@@ -67,6 +67,10 @@ ccl_device int bsdf_refraction_sample(const ShaderClosure *sc, float3 Ng, float3
float fresnel;
fresnel = fresnel_dielectric(m_eta, N, I, &R, &T,
#ifdef __RAY_DIFFERENTIALS__
+# ifdef __DNDU__
+ sd->dNdx,
+ sd->dNdy,
+# endif
dIdx, dIdy, &dRdx, &dRdy, &dTdx, &dTdy,
#endif
&inside);
diff --git a/intern/cycles/kernel/closure/bsdf_util.h b/intern/cycles/kernel/closure/bsdf_util.h
index 3dc15d5791c..dacc406cdab 100644
--- a/intern/cycles/kernel/closure/bsdf_util.h
+++ b/intern/cycles/kernel/closure/bsdf_util.h
@@ -40,6 +40,9 @@ ccl_device float fresnel_dielectric(
const float3 I, float3 *R, float3 *T,
#ifdef __RAY_DIFFERENTIALS__
const float3 dIdx, const float3 dIdy,
+# ifdef __DNDU__
+ const float3 dNdx, const float3 dNdy,
+# endif
float3 *dRdx, float3 *dRdy,
float3 *dTdx, float3 *dTdy,
#endif
@@ -64,14 +67,14 @@ ccl_device float fresnel_dielectric(
}
// compute reflection
- *R = (2 * cos)* Nn - I;
+ *R = (2.0f * cos)* Nn - I;
#ifdef __RAY_DIFFERENTIALS__
- *dRdx = (2 * dot(Nn, dIdx)) * Nn - dIdx;
- *dRdy = (2 * dot(Nn, dIdy)) * Nn - dIdy;
+ *dRdx = (2.0f * dot(Nn, dIdx)) * Nn - dIdx;
+ *dRdy = (2.0f * dot(Nn, dIdy)) * Nn - dIdy;
#endif
float arg = 1 -(neta * neta *(1 -(cos * cos)));
- if(arg < 0) {
+ if(arg < 0.0f) {
*T = make_float3(0.0f, 0.0f, 0.0f);
#ifdef __RAY_DIFFERENTIALS__
*dTdx = make_float3(0.0f, 0.0f, 0.0f);
@@ -84,8 +87,16 @@ ccl_device float fresnel_dielectric(
float nK = (neta * cos)- dnp;
*T = -(neta * I)+(nK * Nn);
#ifdef __RAY_DIFFERENTIALS__
- *dTdx = -(neta * dIdx) + ((neta - neta * neta * cos / dnp) * dot(dIdx, Nn)) * Nn;
- *dTdy = -(neta * dIdy) + ((neta - neta * neta * cos / dnp) * dot(dIdy, Nn)) * Nn;
+# ifndef __DNDU__
+# define dNdx make_float3(0.0f, 0.0f, 0.0f)
+# define dNdy make_float3(0.0f, 0.0f, 0.0f)
+# endif
+ float dDNdx = dot(dIdx, Nn) - dot(I, dNdx);
+ float dDNdy = dot(dIdy, Nn) - dot(I, dNdy);
+ float dmudx = (neta - neta * neta * cos / dnp) * dDNdx;
+ float dmudy = (neta - neta * neta * cos / dnp) * dDNdy;
+ *dTdx = -(neta * dIdx) + (nK * dNdx + dmudx * Nn);
+ *dTdy = -(neta * dIdy) + (nK * dNdy + dmudy * Nn);
#endif
// compute Fresnel terms
float cosTheta1 = cos; // N.R
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index b3960b38fcf..9f24a2e6bdd 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1024,8 +1024,8 @@ typedef ccl_addr_space struct ShaderData {
float3 dPdu;
float3 dPdv;
#endif
+#ifdef __DNDU__
/* differential of N w.r.t. x and y. */
-#ifdef __DPDU__
float3 dNdx;
float3 dNdy;
#endif
More information about the Bf-blender-cvs
mailing list