From e1e247a99b480f81fb76332525002fbc7f776f12 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 26 Feb 2014 18:47:50 +0100 Subject: [PATCH] Fix T38710: volume render issue with transparent surfaces. --- intern/cycles/kernel/kernel_random.h | 3 +++ intern/cycles/kernel/kernel_volume.h | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h index ef397269ec2..31cb6ff6abd 100644 --- a/intern/cycles/kernel/kernel_random.h +++ b/intern/cycles/kernel/kernel_random.h @@ -120,6 +120,9 @@ ccl_device_inline float path_rng_1D(KernelGlobals *kg, RNG *rng, int sample, int /* Cranly-Patterson rotation using rng seed */ float shift; + /* using the same *rng value to offset seems to give correlation issues, + * we could hash it with the dimension but this has a performance impact, + * we need to find a solution for this */ if(dimension & 1) shift = (*rng >> 16) * (1.0f/(float)0xFFFF); else diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index 4d058763f22..ec0c3114213 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -536,12 +536,17 @@ ccl_device VolumeIntegrateResult kernel_volume_integrate_heterogeneous(KernelGlo ccl_device_noinline VolumeIntegrateResult kernel_volume_integrate(KernelGlobals *kg, PathState *state, ShaderData *sd, Ray *ray, PathRadiance *L, float3 *throughput, RNG *rng) { + /* workaround to fix correlation bug in T38710, can find better solution + * in random number generator later, for now this is done here to not impact + * performance of rendering without volumes */ + RNG tmp_rng = cmj_hash(*rng, state->rng_offset); + shader_setup_from_volume(kg, sd, ray, state->bounce); if(volume_stack_is_heterogeneous(kg, state->volume_stack)) - return kernel_volume_integrate_heterogeneous(kg, state, ray, sd, L, throughput, rng); + return kernel_volume_integrate_heterogeneous(kg, state, ray, sd, L, throughput, &tmp_rng); else - return kernel_volume_integrate_homogeneous(kg, state, ray, sd, L, throughput, rng); + return kernel_volume_integrate_homogeneous(kg, state, ray, sd, L, throughput, &tmp_rng); } /* Volume Stack