Commit: 064fa4baaedc8ec45b7e725c79a8fdea14dd4a14
Author: Thomas Dinges
Date:   Thu Mar 12 12:54:06 2015 +0100
Branches: master
https://developer.blender.org/rB064fa4baaedc8ec45b7e725c79a8fdea14dd4a14

Cycles / Decoupled Ray Marching: Skip consecutive empty steps.

This merges consecutive empty steps in the decoupled record function,
which can lead to fewer iterations in the scatter functions.

Only helps slightly though (1%), but doesn't hurt to have this.

Differential Revision: https://developer.blender.org/D873

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

M       intern/cycles/kernel/kernel_volume.h

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

diff --git a/intern/cycles/kernel/kernel_volume.h 
b/intern/cycles/kernel/kernel_volume.h
index 8e67ad5..0300e1d 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -649,6 +649,7 @@ ccl_device void 
kernel_volume_decoupled_record(KernelGlobals *kg, PathState *sta
 
        segment->numsteps = 0;
        segment->closure_flag = 0;
+       bool is_last_step_empty = false;
 
        VolumeStep *step = segment->steps;
 
@@ -690,12 +691,24 @@ ccl_device void 
kernel_volume_decoupled_record(KernelGlobals *kg, PathState *sta
                        step->closure_flag = closure_flag;
 
                        segment->closure_flag |= closure_flag;
+
+                       is_last_step_empty = false;
+                       segment->numsteps++;
                }
                else {
-                       /* store empty step (todo: skip consecutive empty 
steps) */
-                       step->sigma_t = make_float3(0.0f, 0.0f, 0.0f);
-                       step->sigma_s = make_float3(0.0f, 0.0f, 0.0f);
-                       step->closure_flag = 0;
+                       if(is_last_step_empty) {
+                               /* consecutive empty step, merge */
+                               step--;
+                       }
+                       else {
+                               /* store empty step */
+                               step->sigma_t = make_float3(0.0f, 0.0f, 0.0f);
+                               step->sigma_s = make_float3(0.0f, 0.0f, 0.0f);
+                               step->closure_flag = 0;
+
+                               segment->numsteps++;
+                               is_last_step_empty = true;
+                       }
                }
 
                step->accum_transmittance = accum_transmittance;
@@ -703,8 +716,6 @@ ccl_device void 
kernel_volume_decoupled_record(KernelGlobals *kg, PathState *sta
                step->t = new_t;
                step->shade_t = t + random_jitter_offset;
 
-               segment->numsteps++;
-
                /* stop if at the end of the volume */
                t = new_t;
                if(t == ray->t)

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to