Commit: 9d50175b6cc5860926f0974fafd9e8e7868eb805
Author: Sergey Sharybin
Date:   Sat Nov 26 17:30:02 2016 +0100
Branches: master
https://developer.blender.org/rB9d50175b6cc5860926f0974fafd9e8e7868eb805

Cycles: Fix correlation issues in certain cases

There were two cases where correlation issues were obvious:

- File from T38710 was giving issues in 2.78a again
- File from T50116 was having totally different shadow between
  sample 1 and sample 32.

Use some more simplified version of CMJ hash which seems to give
nice randomized value which solves the correlation.

This commit will break all unit test files, but it's a bug fix
so perhaps OK to commit this.

This also fixes T41143: Sobol gives nonuniform noise

Proper science paper about hash function is coming.

Reviewers: brecht

Reviewed By: brecht

Subscribers: lukasstockner97

Differential Revision: https://developer.blender.org/D2385

===================================================================

M       intern/cycles/kernel/kernel_jitter.h
M       intern/cycles/kernel/kernel_random.h
M       intern/cycles/kernel/kernel_volume.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_jitter.h 
b/intern/cycles/kernel/kernel_jitter.h
index aec7bc3..6754613 100644
--- a/intern/cycles/kernel/kernel_jitter.h
+++ b/intern/cycles/kernel/kernel_jitter.h
@@ -149,6 +149,15 @@ ccl_device_inline uint cmj_hash(uint i, uint p)
        return i;
 }
 
+ccl_device_inline uint cmj_hash_simple(uint i, uint p)
+{
+       i = (i ^ 61) ^ p;
+       i += i << 3;
+       i ^= i >> 4;
+       i *= 0x27d4eb2d;
+       return i;
+}
+
 ccl_device_inline float cmj_randfloat(uint i, uint p)
 {
        return cmj_hash(i, p) * (1.0f / 4294967808.0f);
diff --git a/intern/cycles/kernel/kernel_random.h 
b/intern/cycles/kernel/kernel_random.h
index 2b767da..e773753 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -120,13 +120,11 @@ ccl_device_forceinline float path_rng_1D(KernelGlobals 
*kg, ccl_addr_space RNG *
        /* 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
-               shift = (*rng & 0xFFFF) * (1.0f/(float)0xFFFF);
+       /* Hash rng with dimension to solve correlation issues.
+        * See T38710, T50116.
+        */
+       RNG tmp_rng = cmj_hash_simple(dimension, *rng);
+       shift = tmp_rng * (1.0f/(float)0xFFFFFFFF);
 
        return r + shift - floorf(r + shift);
 #endif
diff --git a/intern/cycles/kernel/kernel_volume.h 
b/intern/cycles/kernel/kernel_volume.h
index dd7b0d9..a07ce6b 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -582,17 +582,12 @@ ccl_device VolumeIntegrateResult 
kernel_volume_integrate_heterogeneous_distance(
 ccl_device_noinline VolumeIntegrateResult 
kernel_volume_integrate(KernelGlobals *kg,
        PathState *state, ShaderData *sd, Ray *ray, PathRadiance *L, float3 
*throughput, RNG *rng, bool heterogeneous)
 {
-       /* 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);
 
        if(heterogeneous)
-               return kernel_volume_integrate_heterogeneous_distance(kg, 
state, ray, sd, L, throughput, &tmp_rng);
+               return kernel_volume_integrate_heterogeneous_distance(kg, 
state, ray, sd, L, throughput, rng);
        else
-               return kernel_volume_integrate_homogeneous(kg, state, ray, sd, 
L, throughput, &tmp_rng, true);
+               return kernel_volume_integrate_homogeneous(kg, state, ray, sd, 
L, throughput, rng, true);
 }
 
 /* Decoupled Volume Sampling

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to