diff options
author | Thomas Dinges <blender@dingto.org> | 2015-03-12 14:54:06 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2015-03-12 15:50:12 +0300 |
commit | 064fa4baaedc8ec45b7e725c79a8fdea14dd4a14 (patch) | |
tree | 68c47ac38fce19051ceebe587658e36d225f787a /intern/cycles/kernel/kernel_volume.h | |
parent | cdb47b9dfc2d30345748d6736702e06f7e5d0369 (diff) |
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
Diffstat (limited to 'intern/cycles/kernel/kernel_volume.h')
-rw-r--r-- | intern/cycles/kernel/kernel_volume.h | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index 8e67ad5464c..0300e1d4c7f 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) |