[Bf-blender-cvs] [de6ecc82ed2] master: Fix rare firefly in volume equiangular sampling when sampling short distance.

Brecht Van Lommel noreply at git.blender.org
Tue Sep 12 13:01:25 CEST 2017


Commit: de6ecc82ed2d881d7a827c453a6bb97ce4b84a0d
Author: Brecht Van Lommel
Date:   Sat Sep 9 01:37:54 2017 +0200
Branches: master
https://developer.blender.org/rBde6ecc82ed2d881d7a827c453a6bb97ce4b84a0d

Fix rare firefly in volume equiangular sampling when sampling short distance.

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

M	intern/cycles/kernel/kernel_path_branched.h
M	intern/cycles/kernel/kernel_path_volume.h
M	intern/cycles/kernel/kernel_volume.h

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

diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h
index dde40674ee6..d4cfe461ac4 100644
--- a/intern/cycles/kernel/kernel_path_branched.h
+++ b/intern/cycles/kernel/kernel_path_branched.h
@@ -376,10 +376,8 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg,
 					VolumeIntegrateResult result = kernel_volume_decoupled_scatter(kg,
 						&ps, &pray, &sd, &tp, rphase, rscatter, &volume_segment, NULL, false);
 
-					(void)result;
-					kernel_assert(result == VOLUME_PATH_SCATTERED);
-
-					if(kernel_path_volume_bounce(kg,
+					if(result == VOLUME_PATH_SCATTERED &&
+					   kernel_path_volume_bounce(kg,
 					                             &sd,
 					                             &tp,
 					                             &ps,
diff --git a/intern/cycles/kernel/kernel_path_volume.h b/intern/cycles/kernel/kernel_path_volume.h
index fb6b8d56a38..3fd34ed10e2 100644
--- a/intern/cycles/kernel/kernel_path_volume.h
+++ b/intern/cycles/kernel/kernel_path_volume.h
@@ -165,11 +165,9 @@ ccl_device void kernel_branched_path_volume_connect_light(
 				VolumeIntegrateResult result = kernel_volume_decoupled_scatter(kg,
 					state, ray, sd, &tp, rphase, rscatter, segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
 
-				(void)result;
-				kernel_assert(result == VOLUME_PATH_SCATTERED);
-
 				/* todo: split up light_sample so we don't have to call it again with new position */
-				if(lamp_light_sample(kg, i, light_u, light_v, sd->P, &ls)) {
+				if(result == VOLUME_PATH_SCATTERED &&
+				   lamp_light_sample(kg, i, light_u, light_v, sd->P, &ls)) {
 					if(kernel_data.integrator.pdf_triangles != 0.0f)
 						ls.pdf *= 2.0f;
 
@@ -213,11 +211,9 @@ ccl_device void kernel_branched_path_volume_connect_light(
 				VolumeIntegrateResult result = kernel_volume_decoupled_scatter(kg,
 					state, ray, sd, &tp, rphase, rscatter, segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
 					
-				(void)result;
-				kernel_assert(result == VOLUME_PATH_SCATTERED);
-
 				/* todo: split up light_sample so we don't have to call it again with new position */
-				if(light_sample(kg, light_u, light_v, sd->time, sd->P, state->bounce, &ls)) {
+				if(result == VOLUME_PATH_SCATTERED &&
+				   light_sample(kg, light_u, light_v, sd->time, sd->P, state->bounce, &ls)) {
 					if(kernel_data.integrator.num_all_lights)
 						ls.pdf *= 2.0f;
 
@@ -252,11 +248,9 @@ ccl_device void kernel_branched_path_volume_connect_light(
 		VolumeIntegrateResult result = kernel_volume_decoupled_scatter(kg,
 			state, ray, sd, &tp, rphase, rscatter, segment, (ls.t != FLT_MAX)? &ls.P: NULL, false);
 			
-		(void)result;
-		kernel_assert(result == VOLUME_PATH_SCATTERED);
-
 		/* todo: split up light_sample so we don't have to call it again with new position */
-		if(light_sample(kg, light_u, light_v, sd->time, sd->P, state->bounce, &ls)) {
+		if(result == VOLUME_PATH_SCATTERED &&
+		   light_sample(kg, light_u, light_v, sd->time, sd->P, state->bounce, &ls)) {
 			/* sample random light */
 			float terminate = path_state_rng_light_termination(kg, state);
 			if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp, terminate)) {
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index 42094a9c3f8..d00714e4ed7 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -997,8 +997,8 @@ ccl_device VolumeIntegrateResult kernel_volume_decoupled_scatter(
 			mis_weight = 2.0f*power_heuristic(pdf, distance_pdf);
 		}
 	}
-	if(sample_t < 1e-6f || pdf == 0.0f) {
-		return VOLUME_PATH_SCATTERED;
+	if(sample_t < 0.0f || pdf == 0.0f) {
+		return VOLUME_PATH_MISSED;
 	}
 
 	/* compute transmittance up to this step */



More information about the Bf-blender-cvs mailing list