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();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to