From 5d5c6bb5efee9bd03004845f9b1eee9d43883525 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 20 Feb 2018 15:36:07 +0100 Subject: Cycles: add Russian roulette termination for volume multiple scattering. This mainly helps with dense volumes, rendering can be 30% faster with little noise increase in such scenes. --- intern/cycles/kernel/kernel_path_volume.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/kernel_path_volume.h b/intern/cycles/kernel/kernel_path_volume.h index b6a856baf24..6275d0d6562 100644 --- a/intern/cycles/kernel/kernel_path_volume.h +++ b/intern/cycles/kernel/kernel_path_volume.h @@ -99,6 +99,23 @@ bool kernel_path_volume_bounce( /* update path state */ path_state_next(kg, state, label); + /* Russian roulette termination of volume ray scattering. */ + float probability = path_state_continuation_probability(kg, state, *throughput); + + if(probability == 0.0f) { + return false; + } + else if(probability != 1.0f) { + /* Use dimension from the previous bounce, has not been used yet. */ + float terminate = path_state_rng_1D(kg, state, PRNG_TERMINATE - PRNG_BOUNCE_NUM); + + if(terminate >= probability) { + return false; + } + + *throughput /= probability; + } + /* setup ray */ ray->P = sd->P; ray->D = phase_omega_in; -- cgit v1.2.3