[Bf-blender-cvs] [c806a8c] master: Cycles: MIS for lamps now loops over all lamps instead of picking one.

Brecht Van Lommel noreply at git.blender.org
Thu May 1 19:27:32 CEST 2014


Commit: c806a8ce96d93c739675f8444427be575b67a788
Author: Brecht Van Lommel
Date:   Thu May 1 19:18:42 2014 +0200
https://developer.blender.org/rBc806a8ce96d93c739675f8444427be575b67a788

Cycles: MIS for lamps now loops over all lamps instead of picking one.

Probably will not be noticed in most scenes. This helps reduce noise when you
have multiple lamps with MIS enabled, at the cost of some performance, but from
testing some scenes this seems better.

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

M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_light.h
M	intern/cycles/kernel/kernel_path.h

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

diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 8812bbb..44899e0 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -183,38 +183,42 @@ ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, Shader
 
 /* Indirect Lamp Emission */
 
-ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, PathState *state, Ray *ray, float randt, float3 *emission)
+ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, PathState *state, Ray *ray, float3 *emission)
 {
-	LightSample ls;
-	int lamp = lamp_light_eval_sample(kg, randt);
+	bool hit_lamp = false;
 
-	if(lamp == LAMP_NONE)
-		return false;
+	*emission = make_float3(0.0f, 0.0f, 0.0f);
 
-	if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ray->t, &ls))
-		return false;
+	for(int lamp = 0; lamp < kernel_data.integrator.num_all_lights; lamp++) {
+		LightSample ls;
+
+		if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ray->t, &ls))
+			continue;
 
 #ifdef __PASSES__
-	/* use visibility flag to skip lights */
-	if(ls.shader & SHADER_EXCLUDE_ANY) {
-		if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) ||
-		   ((ls.shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) ||
-		   ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)))
-			return false;
-	}
+		/* use visibility flag to skip lights */
+		if(ls.shader & SHADER_EXCLUDE_ANY) {
+			if(((ls.shader & SHADER_EXCLUDE_DIFFUSE) && (state->flag & PATH_RAY_DIFFUSE)) ||
+			   ((ls.shader & SHADER_EXCLUDE_GLOSSY) && (state->flag & PATH_RAY_GLOSSY)) ||
+			   ((ls.shader & SHADER_EXCLUDE_TRANSMIT) && (state->flag & PATH_RAY_TRANSMIT)))
+				continue;
+		}
 #endif
 
-	float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce);
+		float3 L = direct_emissive_eval(kg, &ls, -ray->D, ray->dD, ls.t, ray->time, state->bounce, state->transparent_bounce);
 
-	if(!(state->flag & PATH_RAY_MIS_SKIP)) {
-		/* multiple importance sampling, get regular light pdf,
-		 * and compute weight with respect to BSDF pdf */
-		float mis_weight = power_heuristic(state->ray_pdf, ls.pdf);
-		L *= mis_weight;
+		if(!(state->flag & PATH_RAY_MIS_SKIP)) {
+			/* multiple importance sampling, get regular light pdf,
+			 * and compute weight with respect to BSDF pdf */
+			float mis_weight = power_heuristic(state->ray_pdf, ls.pdf);
+			L *= mis_weight;
+		}
+
+		*emission += L;
+		hit_lamp = true;
 	}
 
-	*emission = L;
-	return true;
+	return hit_lamp;
 }
 
 /* Indirect Background */
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h
index ffda44f..ac432d3 100644
--- a/intern/cycles/kernel/kernel_light.h
+++ b/intern/cycles/kernel/kernel_light.h
@@ -421,7 +421,6 @@ ccl_device bool lamp_light_eval(KernelGlobals *kg, int lamp, float3 P, float3 D,
 	/* compute pdf */
 	if(ls->t != FLT_MAX)
 		ls->pdf *= lamp_light_pdf(kg, ls->Ng, -ls->D, ls->t);
-	ls->eval_fac *= kernel_data.integrator.inv_pdf_lights;
 
 	return true;
 }
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index f9dc9f3..1ca6bd3 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -240,10 +240,9 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, Ray ray, ccl_g
 			light_ray.dP = ray.dP;
 
 			/* intersect with lamp */
-			float light_t = path_state_rng_1D(kg, rng, &state, PRNG_LIGHT);
 			float3 emission;
 
-			if(indirect_lamp_emission(kg, &state, &light_ray, light_t, &emission))
+			if(indirect_lamp_emission(kg, &state, &light_ray, &emission))
 				path_radiance_accum_emission(L, throughput, emission, state.bounce);
 		}
 #endif
@@ -624,10 +623,9 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 			light_ray.dP = ray.dP;
 
 			/* intersect with lamp */
-			float light_t = path_state_rng_1D(kg, rng, &state, PRNG_LIGHT);
 			float3 emission;
 
-			if(indirect_lamp_emission(kg, &state, &light_ray, light_t, &emission))
+			if(indirect_lamp_emission(kg, &state, &light_ray, &emission))
 				path_radiance_accum_emission(&L, throughput, emission, state.bounce);
 		}
 #endif




More information about the Bf-blender-cvs mailing list