[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