diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-11-26 14:11:41 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-11-26 14:11:41 +0300 |
commit | bf9e88bfbebaf5c6228363560970fa526e779c8b (patch) | |
tree | 0dbe6faafbbc97535de223a818a1f8588437f312 /intern | |
parent | c8a041f4895bbffc3efbede9c6003961cd59efaa (diff) |
Cycles: Fix wrong SSS with regular path tracing and clamping enabled
Radiance sum and reset was happening in different order after 26f1c51.
This is a quick fix to unlock Caminandes team, perhaps we can avoid having
separate variable to detect when radiance is to be sum.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/kernel/kernel_bake.h | 7 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_path.h | 18 |
2 files changed, 15 insertions, 10 deletions
diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index 3efd7ecca5f..192cba609b9 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -77,7 +77,6 @@ ccl_device void compute_light_pass(KernelGlobals *kg, ShaderData *sd, PathRadian while(ss_indirect.num_rays) { kernel_path_subsurface_setup_indirect(kg, &ss_indirect, - &L_sample, &state, &ray, &ray, @@ -89,6 +88,12 @@ ccl_device void compute_light_pass(KernelGlobals *kg, ShaderData *sd, PathRadian state.num_samples, &state, &L_sample); + + /* For render passes, sum and reset indirect light pass variables + * for the next samples. + */ + path_radiance_sum_indirect(&L_sample); + path_radiance_reset_indirect(&L_sample); } is_sss_sample = true; } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 885782f1a67..b3622283c2a 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -519,7 +519,6 @@ ccl_device bool kernel_path_subsurface_scatter( ccl_device void kernel_path_subsurface_setup_indirect( KernelGlobals *kg, SubsurfaceIndirectRays *ss_indirect, - PathRadiance *L, PathState *state, Ray *orig_ray, Ray *ray, @@ -548,12 +547,6 @@ ccl_device void kernel_path_subsurface_setup_indirect( #endif *ray = *indirect_ray; - - /* For render passes, sum and reset indirect light pass variables - * for the next samples. - */ - path_radiance_sum_indirect(L); - path_radiance_reset_indirect(L); } #endif @@ -584,7 +577,7 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, */ Ray ss_orig_ray; - for(;;) { + for(int ss_indirect_iter = 0; ; ss_indirect_iter++) { #endif /* path iteration */ @@ -848,13 +841,20 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, } #ifdef __SUBSURFACE__ + if(ss_indirect_iter != 0) { + /* For render passes, sum and reset indirect light pass variables + * for the next samples. + */ + path_radiance_sum_indirect(&L); + path_radiance_reset_indirect(&L); + } + /* Trace indirect subsurface rays by restarting the loop. this uses less * stack memory than invoking kernel_path_indirect. */ if(ss_indirect.num_rays) { kernel_path_subsurface_setup_indirect(kg, &ss_indirect, - &L, &state, &ss_orig_ray, &ray, |