[Bf-blender-cvs] [4dfcf45] cycles_disney_brdf: Merge branch 'master' into cycles_disney_brdf
Pascal Schoen
noreply at git.blender.org
Thu Oct 20 11:12:00 CEST 2016
Commit: 4dfcf455f7769752044e051b399fb6a5dfcd0e22
Author: Pascal Schoen
Date: Thu Oct 20 10:41:50 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB4dfcf455f7769752044e051b399fb6a5dfcd0e22
Merge branch 'master' into cycles_disney_brdf
===================================================================
===================================================================
diff --cc intern/cycles/kernel/closure/bsdf_microfacet_multi.h
index d271162,cea59ad..79e4463
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h
@@@ -404,7 -393,7 +404,7 @@@ ccl_device float3 bsdf_microfacet_multi
*pdf = mf_ggx_aniso_pdf(localI, localO, make_float2(bsdf->alpha_x, bsdf->alpha_y));
else
*pdf = mf_ggx_pdf(localI, localO, bsdf->alpha_x);
- return mf_eval_glossy(localI, localO, true, bsdf->extra->color, bsdf->extra->cspec0, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL, bsdf->ior, bsdf->extra->use_fresnel);
- return mf_eval_glossy(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL);
++ return mf_eval_glossy(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL, bsdf->ior, bsdf->extra->use_fresnel, bsdf->extra->cspec0);
}
ccl_device int bsdf_microfacet_multi_ggx_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)
@@@ -430,7 -419,7 +430,7 @@@
float3 localI = make_float3(dot(I, X), dot(I, Y), dot(I, Z));
float3 localO;
- *eval = mf_sample_glossy(localI, &localO, bsdf->extra->color, bsdf->extra->cspec0, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL, bsdf->ior, bsdf->extra->use_fresnel);
- *eval = mf_sample_glossy(localI, &localO, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL);
++ *eval = mf_sample_glossy(localI, &localO, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, NULL, NULL, bsdf->ior, bsdf->extra->use_fresnel, bsdf->extra->cspec0);
if(is_aniso)
*pdf = mf_ggx_aniso_pdf(localI, localO, make_float2(bsdf->alpha_x, bsdf->alpha_y));
else
@@@ -447,7 -436,7 +447,7 @@@
/* Multiscattering GGX Glass closure */
- ccl_device int bsdf_microfacet_multi_ggx_glass_setup(MicrofacetBsdf *bsdf, bool use_fresnel = false, bool initial_outside = true)
-ccl_device int bsdf_microfacet_multi_ggx_glass_setup(MicrofacetBsdf *bsdf)
++ccl_device int bsdf_microfacet_multi_ggx_glass_setup(MicrofacetBsdf *bsdf, bool use_fresnel = false)
{
bsdf->alpha_x = clamp(bsdf->alpha_x, 1e-4f, 1.0f);
bsdf->alpha_y = bsdf->alpha_x;
@@@ -455,11 -444,6 +455,10 @@@
bsdf->extra->color.x = saturate(bsdf->extra->color.x);
bsdf->extra->color.y = saturate(bsdf->extra->color.y);
bsdf->extra->color.z = saturate(bsdf->extra->color.z);
+ bsdf->extra->use_fresnel = use_fresnel;
+ bsdf->extra->cspec0.x = saturate(bsdf->extra->cspec0.x);
+ bsdf->extra->cspec0.y = saturate(bsdf->extra->cspec0.y);
+ bsdf->extra->cspec0.z = saturate(bsdf->extra->cspec0.z);
- bsdf->extra->initial_outside = initial_outside;
bsdf->type = CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_ID;
@@@ -499,7 -483,7 +498,7 @@@ ccl_device float3 bsdf_microfacet_multi
float3 localO = make_float3(dot(omega_in, X), dot(omega_in, Y), dot(omega_in, Z));
*pdf = mf_glass_pdf(localI, localO, bsdf->alpha_x, bsdf->ior);
- return mf_eval_glass(localI, localO, true, bsdf->extra->color, bsdf->extra->cspec0, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, bsdf->extra->use_fresnel, bsdf->extra->initial_outside);
- return mf_eval_glass(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior);
++ return mf_eval_glass(localI, localO, true, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, bsdf->extra->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)
@@@ -546,7 -530,7 +545,7 @@@
float3 localI = make_float3(dot(I, X), dot(I, Y), dot(I, Z));
float3 localO;
- *eval = mf_sample_glass(localI, &localO, bsdf->extra->color, bsdf->extra->cspec0, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, bsdf->extra->use_fresnel, bsdf->extra->initial_outside);
- *eval = mf_sample_glass(localI, &localO, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior);
++ *eval = mf_sample_glass(localI, &localO, bsdf->extra->color, bsdf->alpha_x, bsdf->alpha_y, lcg_state, bsdf->ior, bsdf->extra->use_fresnel, bsdf->extra->cspec0);
*pdf = mf_glass_pdf(localI, localO, bsdf->alpha_x, bsdf->ior);
*eval *= *pdf;
diff --cc intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
index 11f3525,8054fa8..e8c1998
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
@@@ -29,19 -29,14 +29,19 @@@ ccl_device_forceinline float3 MF_FUNCTI
float3 wi,
float3 wo,
const bool wo_outside,
- const float3 color,
+ const float3 color,
- const float3 cspec0,
const float alpha_x,
const float alpha_y,
ccl_addr_space uint *lcg_state
#ifdef MF_MULTI_GLASS
, const float eta
+ , bool use_fresnel = false
- , bool initial_outside = true
++ , const float3 cspec0 = make_float3(1.0f, 1.0f, 1.0f)
#elif defined(MF_MULTI_GLOSSY)
- , float3 *n, float3 *k
+ , float3 *n, float3 *k
+ , const float eta = 1.0f
+ , bool use_fresnel = false
++ , const float3 cspec0 = make_float3(1.0f, 1.0f, 1.0f)
#endif
)
{
@@@ -82,18 -77,6 +82,18 @@@
eval *= -lambda_r / (shadowing_lambda - lambda_r);
else
eval *= -lambda_r * beta(-lambda_r, shadowing_lambda+1.0f);
+
+ float3 eval2;
+ float3 t_color = cspec0;
+ float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
+ float F0 = fresnel_dielectric_cos(1.0f, eta);
+ float F0_norm = 1.0f / (1.0f - F0);
- if (use_fresnel/* && initial_outside*/) {
- float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wo))); //
++ if (use_fresnel) {
++ float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm;
+ throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
+
+ eval2 = throughput2 * eval;
+ }
#elif defined(MF_MULTI_DIFFUSE)
/* Diffuse has no special closed form for the single scattering bounce */
eval = make_float3(0.0f, 0.0f, 0.0f);
@@@ -111,18 -94,6 +111,18 @@@
else {
eval = make_float3(val, val, val);
}
+
+ float3 eval2;
+ float3 t_color = cspec0;
+ float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
+ float F0 = fresnel_dielectric_cos(1.0f, eta);
+ float F0_norm = 1.0f / (1.0f - F0);
+ if (use_fresnel) {
- float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wo))); //
++ float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wo)), eta) - F0) * F0_norm;
+ throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
+
+ eval2 = throughput2 * val;
+ }
#endif
float3 wr = -wi;
@@@ -166,9 -125,6 +166,9 @@@
phase = mf_eval_phase_glass(wr, lambda_r, wo, wo_outside, alpha, eta);
else
phase = mf_eval_phase_glass(wr, lambda_r, -wo, !wo_outside, alpha, 1.0f/eta);
+
- if (use_fresnel/* && initial_outside*/)
++ if (use_fresnel)
+ eval2 += throughput2 * phase * mf_G1(wo_outside ? wo : -wo, mf_C1((outside == wo_outside) ? hr : -hr), shadowing_lambda);
#elif defined(MF_MULTI_DIFFUSE)
phase = mf_eval_phase_diffuse(wo, wm);
#else /* MF_MULTI_GLOSSY */
@@@ -190,32 -142,11 +190,32 @@@
wr = -wr;
hr = -hr;
}
+
+ if (use_fresnel && !next_outside) {
+ throughput2 *= color;
+ }
- else if (use_fresnel/* && initial_outside && outside && next_outside*/) {
- float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
++ else if (use_fresnel) {
++ float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm;
+ t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
+
+ if (order > 0)
+ throughput2 *= t_color;
+ }
#elif defined(MF_MULTI_DIFFUSE)
wr = mf_sample_phase_diffuse(wm,
lcg_step_float_addrspace(lcg_state),
lcg_step_float_addrspace(lcg_state));
#else /* MF_MULTI_GLOSSY */
+ if (use_fresnel) {
- float FH = (fresnel_dielectric_cos(dot(-wr, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(-wr, wm)); //
++ float FH = (fresnel_dielectric_cos(dot(-wr, wm), eta) - F0) * F0_norm;
+ t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
+
+ if (order > 0)
+ throughput2 *= t_color;
+ }
+ else {
+ throughput2 *= color;
+ }
wr = mf_sample_phase_glossy(-wr, n, k, &throughput, wm);
#endif
@@@ -246,15 -168,11 +246,16 @@@
* escaped the surface in wo. The function returns the throughput between wi and wo.
* Without reflection losses due to coloring or fresnel absorption in conductors, the sampling is optimal.
*/
- ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const float3 color, const float3 cspec0, const float alpha_x, const float alpha_y, ccl_addr_space uint *lcg_state
+ ccl_device_forceinline float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const float3 color, const float alpha_x, const float alpha_y, ccl_addr_space uint *lcg_state
#ifdef MF_MULTI_GLASS
, const float eta
+ , bool use_fresnel = false
- , bool initial_outside = true
++ , const float3 cspec0 = make_float3(1.0f, 1.0f, 1.0f)
#elif defined(MF_MULTI_GLOSSY)
, float3 *n, float3 *k
+ , const float eta = 1.0f
+ , bool use_fresnel = false
++ , const float3 cspec0 = make_float3(1.0f, 1.0f, 1.0f)
#endif
)
{
@@@ -267,25 -185,6 +268,25 @@@
float C1_r = 1.0f;
float G1_r = 0.0f;
bool outside = true;
+#ifdef MF_MULTI_GLASS
+ float3 t_color = cspec0;
+ float3 throughput2 = make_float3(1.0f, 1.0f, 1.0f);
+ float F0 = fresnel_dielectric_cos(1.0f, eta);
+ float F0_norm = 1.0f / (1.0f - F0);
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list