[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53824] trunk/blender/intern/cycles/kernel : Fix #33838: light render passes for non-progressive integrator were not correct.

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jan 15 20:17:53 CET 2013


Revision: 53824
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53824
Author:   blendix
Date:     2013-01-15 19:17:51 +0000 (Tue, 15 Jan 2013)
Log Message:
-----------
Fix #33838: light render passes for non-progressive integrator were not correct.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_accumulate.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_types.h

Modified: trunk/blender/intern/cycles/kernel/kernel_accumulate.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_accumulate.h	2013-01-15 19:02:17 UTC (rev 53823)
+++ trunk/blender/intern/cycles/kernel/kernel_accumulate.h	2013-01-15 19:17:51 UTC (rev 53824)
@@ -133,6 +133,10 @@
 		L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
 		L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
 
+		L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+		L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
+		L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
+
 		L->emission = make_float3(0.0f, 0.0f, 0.0f);
 		L->background = make_float3(0.0f, 0.0f, 0.0f);
 		L->ao = make_float3(0.0f, 0.0f, 0.0f);
@@ -156,11 +160,11 @@
 			/* first on directly visible surface */
 			float3 value = *throughput*inverse_pdf;
 
-			L->indirect_diffuse = bsdf_eval->diffuse*value;
-			L->indirect_glossy = bsdf_eval->glossy*value;
-			L->indirect_transmission = bsdf_eval->transmission*value;
+			L->path_diffuse = bsdf_eval->diffuse*value;
+			L->path_glossy = bsdf_eval->glossy*value;
+			L->path_transmission = bsdf_eval->transmission*value;
 
-			*throughput = L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission;
+			*throughput = L->path_diffuse + L->path_glossy + L->path_transmission;
 			
 			L->direct_throughput = *throughput;
 		}
@@ -266,23 +270,42 @@
 #endif
 }
 
-__device_inline float3 path_radiance_sum(KernelGlobals *kg, PathRadiance *L)
+__device_inline void path_radiance_sum_indirect(PathRadiance *L)
 {
-#ifdef __PASSES__
+	/* this division is a bit ugly, but means we only have to keep track of
+	 * only a single throughput further along the path, here we recover just
+	 * the indirect parth that is not influenced by any particular BSDF type */
 	if(L->use_light_pass) {
-		/* this division is a bit ugly, but means we only have to keep track of
-		 * only a single throughput further along the path, here we recover just
-		 * the indirect parth that is not influenced by any particular BSDF type */
 		L->direct_emission = safe_divide_color(L->direct_emission, L->direct_throughput);
-		L->direct_diffuse += L->indirect_diffuse*L->direct_emission;
-		L->direct_glossy += L->indirect_glossy*L->direct_emission;
-		L->direct_transmission += L->indirect_transmission*L->direct_emission;
+		L->direct_diffuse += L->path_diffuse*L->direct_emission;
+		L->direct_glossy += L->path_glossy*L->direct_emission;
+		L->direct_transmission += L->path_transmission*L->direct_emission;
 
 		L->indirect = safe_divide_color(L->indirect, L->direct_throughput);
-		L->indirect_diffuse *= L->indirect;
-		L->indirect_glossy *= L->indirect;
-		L->indirect_transmission *= L->indirect;
+		L->indirect_diffuse += L->path_diffuse*L->indirect;
+		L->indirect_glossy += L->path_glossy*L->indirect;
+		L->indirect_transmission += L->path_transmission*L->indirect;
+	}
+}
 
+__device_inline void path_radiance_reset_indirect(PathRadiance *L)
+{
+	if(L->use_light_pass) {
+		L->path_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+		L->path_glossy = make_float3(0.0f, 0.0f, 0.0f);
+		L->path_transmission = make_float3(0.0f, 0.0f, 0.0f);
+
+		L->direct_emission = make_float3(0.0f, 0.0f, 0.0f);
+		L->indirect = make_float3(0.0f, 0.0f, 0.0f);
+	}
+}
+
+__device_inline float3 path_radiance_sum(KernelGlobals *kg, PathRadiance *L)
+{
+#ifdef __PASSES__
+	if(L->use_light_pass) {
+		path_radiance_sum_indirect(L);
+
 		float3 L_sum = L->emission
 			+ L->direct_diffuse + L->direct_glossy + L->direct_transmission
 			+ L->indirect_diffuse + L->indirect_glossy + L->indirect_transmission;

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2013-01-15 19:02:17 UTC (rev 53823)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2013-01-15 19:17:51 UTC (rev 53824)
@@ -949,6 +949,11 @@
 				kernel_path_indirect(kg, rng, sample*num_samples + j, bsdf_ray, buffer,
 					tp*num_samples_inv, num_samples,
 					min_ray_pdf, bsdf_pdf, ps, rng_offset+PRNG_BOUNCE_NUM, &L);
+
+				/* for render passes, sum and reset indirect light pass variables
+				 * for the next samples */
+				path_radiance_sum_indirect(&L);
+				path_radiance_reset_indirect(&L);
 			}
 		}
 

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2013-01-15 19:02:17 UTC (rev 53823)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2013-01-15 19:17:51 UTC (rev 53824)
@@ -255,6 +255,10 @@
 	float3 indirect_glossy;
 	float3 indirect_transmission;
 
+	float3 path_diffuse;
+	float3 path_glossy;
+	float3 path_transmission;
+
 	float4 shadow;
 } PathRadiance;
 




More information about the Bf-blender-cvs mailing list