[Bf-blender-cvs] [630b80e] cycles_disney_brdf: Fresnel in the microfacet multiscatter implementation improved

Pascal Schoen noreply at git.blender.org
Tue Sep 27 11:22:25 CEST 2016


Commit: 630b80e08b6acf83834bc95264af4ccdbbc5f82c
Author: Pascal Schoen
Date:   Fri Sep 2 10:52:13 2016 +0200
Branches: cycles_disney_brdf
https://developer.blender.org/rB630b80e08b6acf83834bc95264af4ccdbbc5f82c

Fresnel in the microfacet multiscatter implementation improved

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

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

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

diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
index 0412046..ecccc0c 100644
--- a/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
+++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
@@ -88,7 +88,7 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
 	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) {
+	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))); //
 		throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
@@ -167,7 +167,7 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
 			else
 				phase = mf_eval_phase_glass(wr, lambda_r, -wo, !wo_outside, alpha, 1.0f/eta);
 
-			if (use_fresnel && initial_outside)
+			if (use_fresnel/* && initial_outside*/)
 				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);
@@ -191,16 +191,16 @@ ccl_device_inline float3 MF_FUNCTION_FULL_NAME(mf_eval)(
 				hr = -hr;
 			}
 
-			if (use_fresnel && initial_outside && outside && next_outside) {
+			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)); //
 				t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
 				if (order > 0)
 					throughput2 *= t_color;
 			}
-			else {
-				throughput2 *= color;
-			}
 #elif defined(MF_MULTI_DIFFUSE)
 			wr = mf_sample_phase_diffuse(wm,
 			                             lcg_step_float_addrspace(lcg_state),
@@ -274,7 +274,7 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
 	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) {
+	if (use_fresnel/* && initial_outside*/) {
 		float FH = (fresnel_dielectric_cos(dot(wi, normalize(wi + wr)), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi, normalize(wi + wr))); //
 		throughput2 = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 	}
@@ -295,7 +295,7 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
 		if(!mf_sample_height(wr, &hr, &C1_r, &G1_r, &lambda_r, lcg_step_float_addrspace(lcg_state))) {
 			/* The random walk has left the surface. */
 #ifdef MF_MULTI_GLASS
-			if ((only_refractions && outside && initial_outside) || (only_reflections && !outside)) {
+			if ((only_refractions && outside/* && initial_outside*/) || (only_reflections && !outside)) {
 				*wo = make_float3(0.0f, 0.0f, 1.0f);
 				return make_float3(0.0f, 0.0f, 0.0f);
 			}
@@ -327,7 +327,10 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
 		}
 
 		if (use_fresnel) {
-			if (initial_outside && outside && next_outside) {
+			if (!next_outside) {
+				throughput2 *= color;
+			}
+			else if (/*initial_outside && outside && next_outside*/true) {
 				float FH = (fresnel_dielectric_cos(dot(wi_prev, wm), eta) - F0) * F0_norm; //schlick_fresnel(dot(wi_prev, wm)); //
 				t_color = cspec0 * (1.0f - FH) + make_float3(1.0f, 1.0f, 1.0f) * FH;
 
@@ -336,9 +339,6 @@ ccl_device float3 MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi, float3 *wo, const
 				else
 					throughput2 *= t_color;
 			}
-			else {
-				throughput2 *= color;
-			}
 		}
 #elif defined(MF_MULTI_DIFFUSE)
 		wr = mf_sample_phase_diffuse(wm,




More information about the Bf-blender-cvs mailing list