[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45428] trunk/blender/intern/cycles: Cycles: add rejection of inf/nan samples, in principle these should not happen

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Apr 5 17:17:45 CEST 2012


Revision: 45428
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45428
Author:   blendix
Date:     2012-04-05 15:17:45 +0000 (Thu, 05 Apr 2012)
Log Message:
-----------
Cycles: add rejection of inf/nan samples, in principle these should not happen
but this makes it more reliable for now.

Also add an integrator "Clamp" option, to clamp very light samples to a maximum
value. This will reduce accuracy but may help reducing noise and speed up
convergence.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/properties.py
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/kernel/kernel_accumulate.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/render/integrator.cpp
    trunk/blender/intern/cycles/render/integrator.h

Modified: trunk/blender/intern/cycles/blender/addon/properties.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/properties.py	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/blender/addon/properties.py	2012-04-05 15:17:45 UTC (rev 45428)
@@ -174,6 +174,13 @@
                 default=0,
                 )
 
+        cls.sample_clamp = FloatProperty(
+                name="Clamp",
+                description="If non-zero, the maximum value for a sample, higher values will be scaled down to avoid too much noise and slow convergence at the cost of accuracy.",
+                min=0.0, max=1e8,
+                default=0.0,
+                )
+
         cls.debug_tile_size = IntProperty(
                 name="Tile Size",
                 description="",

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2012-04-05 15:17:45 UTC (rev 45428)
@@ -67,6 +67,7 @@
         sub.prop(cscene, "samples", text="Render")
         sub.prop(cscene, "preview_samples", text="Preview")
         sub.prop(cscene, "seed")
+        sub.prop(cscene, "sample_clamp")
 
         sub = col.column(align=True)
         sub.label("Transparency:")

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2012-04-05 15:17:45 UTC (rev 45428)
@@ -157,6 +157,8 @@
 
 	integrator->layer_flag = render_layer.layer;
 
+	integrator->sample_clamp = get_float(cscene, "sample_clamp");
+
 	if(integrator->modified(previntegrator))
 		integrator->tag_update(scene);
 }

Modified: trunk/blender/intern/cycles/kernel/kernel_accumulate.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_accumulate.h	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/kernel/kernel_accumulate.h	2012-04-05 15:17:45 UTC (rev 45428)
@@ -294,5 +294,49 @@
 #endif
 }
 
+__device_inline void path_radiance_clamp(PathRadiance *L, float3 *L_sum, float clamp)
+{
+	float sum = fabsf(L_sum->x) + fabsf(L_sum->y) + fabsf(L_sum->z);
+
+	if(!isfinite(sum)) {
+		/* invalid value, reject */
+		*L_sum = make_float3(0.0f, 0.0f, 0.0f);
+
+#ifdef __PASSES__
+		if(L->use_light_pass) {
+			L->direct_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+			L->direct_glossy = make_float3(0.0f, 0.0f, 0.0f);
+			L->direct_transmission = make_float3(0.0f, 0.0f, 0.0f);
+
+			L->indirect_diffuse = make_float3(0.0f, 0.0f, 0.0f);
+			L->indirect_glossy = make_float3(0.0f, 0.0f, 0.0f);
+			L->indirect_transmission = make_float3(0.0f, 0.0f, 0.0f);
+
+			L->emission = make_float3(0.0f, 0.0f, 0.0f);
+		}
+#endif
+	}
+	else if(sum > clamp) {
+		/* value to high, scale down */
+		float scale = clamp/sum;
+
+		*L_sum *= scale;
+
+#ifdef __PASSES__
+		if(L->use_light_pass) {
+			L->direct_diffuse *= scale;
+			L->direct_glossy *= scale;
+			L->direct_transmission *= scale;
+
+			L->indirect_diffuse *= scale;
+			L->indirect_glossy *= scale;
+			L->indirect_transmission *= scale;
+
+			L->emission *= scale;
+		}
+#endif
+	}
+}
+
 CCL_NAMESPACE_END
 

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2012-04-05 15:17:45 UTC (rev 45428)
@@ -396,6 +396,10 @@
 
 	float3 L_sum = path_radiance_sum(&L);
 
+#ifdef __CLAMP_SAMPLE__
+	path_radiance_clamp(&L, &L_sum, kernel_data.integrator.sample_clamp);
+#endif
+
 	kernel_write_light_passes(kg, buffer, &L, sample);
 
 	return make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - L_transparent);

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-04-05 15:17:45 UTC (rev 45428)
@@ -60,6 +60,7 @@
 #define __RAY_DIFFERENTIALS__
 #define __CAMERA_CLIPPING__
 #define __INTERSECTION_REFINE__
+#define __CLAMP_SAMPLE__
 
 #ifdef __KERNEL_SHADING__
 #define __SVM__
@@ -521,7 +522,12 @@
 
 	/* render layer */
 	int layer_flag;
-	int pad1, pad2;
+
+	/* clamp */
+	float sample_clamp;
+
+	/* padding */
+	int pad;
 } KernelIntegrator;
 
 typedef struct KernelBVH {

Modified: trunk/blender/intern/cycles/render/integrator.cpp
===================================================================
--- trunk/blender/intern/cycles/render/integrator.cpp	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/render/integrator.cpp	2012-04-05 15:17:45 UTC (rev 45428)
@@ -43,6 +43,7 @@
 	no_caustics = false;
 	seed = 0;
 	layer_flag = ~0;
+	sample_clamp = 0.0f;
 
 	need_update = true;
 }
@@ -85,6 +86,8 @@
 
 	kintegrator->use_ambient_occlusion =
 		((dscene->data.film.pass_flag & PASS_AO) || dscene->data.background.ao_factor != 0.0f);
+	
+	kintegrator->sample_clamp = (sample_clamp == 0.0f)? FLT_MAX: sample_clamp*3.0f;
 
 	/* sobol directions table */
 	int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
@@ -117,7 +120,8 @@
 		transparent_shadows == integrator.transparent_shadows &&
 		no_caustics == integrator.no_caustics &&
 		layer_flag == integrator.layer_flag &&
-		seed == integrator.seed);
+		seed == integrator.seed &&
+		sample_clamp == integrator.sample_clamp);
 }
 
 void Integrator::tag_update(Scene *scene)

Modified: trunk/blender/intern/cycles/render/integrator.h
===================================================================
--- trunk/blender/intern/cycles/render/integrator.h	2012-04-05 15:05:49 UTC (rev 45427)
+++ trunk/blender/intern/cycles/render/integrator.h	2012-04-05 15:17:45 UTC (rev 45428)
@@ -45,6 +45,8 @@
 	int seed;
 	int layer_flag;
 
+	float sample_clamp;
+
 	bool need_update;
 
 	Integrator();




More information about the Bf-blender-cvs mailing list