[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54533] trunk/blender/intern/cycles: Fix #34226: cycles shadow pass got incorrectly influenced by world multiple

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Feb 13 17:46:18 CET 2013


Revision: 54533
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54533
Author:   blendix
Date:     2013-02-13 16:46:18 +0000 (Wed, 13 Feb 2013)
Log Message:
-----------
Fix #34226: cycles shadow pass got incorrectly influenced by world multiple
importance sampleing.

Modified Paths:
--------------
    trunk/blender/intern/cycles/device/device_cuda.cpp
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_passes.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/light.cpp

Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp	2013-02-13 16:00:46 UTC (rev 54532)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp	2013-02-13 16:46:18 UTC (rev 54533)
@@ -109,11 +109,11 @@
 		}
 	}
 
-#ifdef NDEBUG
+/*#ifdef NDEBUG
 #define cuda_abort()
 #else
 #define cuda_abort() abort()
-#endif
+#endif*/
 
 #define cuda_assert(stmt) \
 	{ \

Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-02-13 16:00:46 UTC (rev 54532)
+++ trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-02-13 16:46:18 UTC (rev 54533)
@@ -141,7 +141,7 @@
 	}
 
 	/* return if it's a lamp for shadow pass */
-	*is_lamp = (ls.prim == ~0);
+	*is_lamp = (ls.prim == ~0 && ls.type != LIGHT_BACKGROUND);
 
 	return true;
 }

Modified: trunk/blender/intern/cycles/kernel/kernel_passes.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_passes.h	2013-02-13 16:00:46 UTC (rev 54532)
+++ trunk/blender/intern/cycles/kernel/kernel_passes.h	2013-02-13 16:46:18 UTC (rev 54533)
@@ -125,14 +125,7 @@
 		kernel_write_pass_float3(buffer + kernel_data.film.pass_transmission_color, sample, L->color_transmission);
 	if(flag & PASS_SHADOW) {
 		float4 shadow = L->shadow;
-
-		/* bit of an ugly hack to compensate for emitting triangles influencing
-		 * amount of samples we get for this pass */
-		if(kernel_data.integrator.progressive && kernel_data.integrator.pdf_triangles != 0.0f)
-			shadow.w = 0.5f;
-		else
-			shadow.w = 1.0f;
-
+		shadow.w = kernel_data.film.pass_shadow_scale;
 		kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow);
 	}
 #endif

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2013-02-13 16:00:46 UTC (rev 54532)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2013-02-13 16:46:18 UTC (rev 54533)
@@ -610,9 +610,9 @@
 	int pass_ao;
 
 	int pass_shadow;
+	float pass_shadow_scale;
 	int pass_pad1;
 	int pass_pad2;
-	int pass_pad3;
 } KernelFilm;
 
 typedef struct KernelBackground {

Modified: trunk/blender/intern/cycles/render/light.cpp
===================================================================
--- trunk/blender/intern/cycles/render/light.cpp	2013-02-13 16:00:46 UTC (rev 54532)
+++ trunk/blender/intern/cycles/render/light.cpp	2013-02-13 16:46:18 UTC (rev 54533)
@@ -143,6 +143,7 @@
 
 	/* count */
 	size_t num_lights = scene->lights.size();
+	size_t num_background_lights = 0;
 	size_t num_triangles = 0;
 	size_t num_curve_segments = 0;
 
@@ -306,6 +307,8 @@
 
 		if(light->size > 0.0f && light->use_mis)
 			use_lamp_mis = true;
+		if(light->type == LIGHT_BACKGROUND)
+			num_background_lights++;
 	}
 
 	/* normalize cumulative distribution functions */
@@ -324,6 +327,7 @@
 
 	/* update device */
 	KernelIntegrator *kintegrator = &dscene->data.integrator;
+	KernelFilm *kfilm = &dscene->data.film;
 	kintegrator->use_direct_light = (totarea > 0.0f);
 
 	if(kintegrator->use_direct_light) {
@@ -354,6 +358,16 @@
 
 		kintegrator->use_lamp_mis = use_lamp_mis;
 
+		/* bit of an ugly hack to compensate for emitting triangles influencing
+		 * amount of samples we get for this pass */
+		if(scene->integrator->progressive && kintegrator->pdf_triangles != 0.0f)
+			kfilm->pass_shadow_scale = 0.5f;
+		else
+			kfilm->pass_shadow_scale = 1.0f;
+
+		if(num_background_lights < num_lights)
+			kfilm->pass_shadow_scale *= (float)(num_lights - num_background_lights)/(float)num_lights;
+
 		/* CDF */
 		device->tex_alloc("__light_distribution", dscene->light_distribution);
 	}
@@ -366,6 +380,7 @@
 		kintegrator->pdf_lights = 0.0f;
 		kintegrator->inv_pdf_lights = 0.0f;
 		kintegrator->use_lamp_mis = false;
+		kfilm->pass_shadow_scale = 1.0f;
 	}
 }
 




More information about the Bf-blender-cvs mailing list