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)