Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-17 18:48:01 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-17 18:48:01 +0400
commit45552a45950459e4bb83bc44d41eeaa5457bfdae (patch)
tree5b4784f2187eac1bea08e013d4f7b6bf449fb946 /intern/cycles
parentcf0e457e524cfc9f496705de6cbf1e41c5118828 (diff)
Cycles: initialize LCG for sss and hair sampling without using the sobol sampler,
slightly faster but also fixes the u/v sampling dimensions not longer being at even values which is needed for best results.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/kernel/kernel_path.h12
-rw-r--r--intern/cycles/kernel/kernel_random.h4
-rw-r--r--intern/cycles/kernel/kernel_types.h3
3 files changed, 8 insertions, 11 deletions
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 5847b4831c4..30abf0c8eb6 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -258,8 +258,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
difl = kernel_data.curve_kernel_data.minimum_width * len(pixdiff) * 0.5f;
}
float extmax = kernel_data.curve_kernel_data.maximum_width;
- float rng_hair_seed = path_rng(kg, rng, sample, rng_offset + PRNG_HAIR);
- uint lcg_state = lcg_init(rng_hair_seed);
+ uint lcg_state = lcg_init(*rng + rng_offset + sample);
bool hit = scene_intersect(kg, &ray, visibility, &isect, &lcg_state, difl, extmax);
#else
@@ -377,7 +376,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
/* do bssrdf scatter step if we picked a bssrdf closure */
if(sc) {
- uint lcg_state = lcg_init(rbsdf);
+ uint lcg_state = lcg_init(*rng + rng_offset + sample);
subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, false);
}
}
@@ -601,7 +600,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray
/* do bssrdf scatter step if we picked a bssrdf closure */
if(sc) {
- uint lcg_state = lcg_init(rbsdf);
+ uint lcg_state = lcg_init(*rng + rng_offset + sample);
subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, false);
}
}
@@ -930,8 +929,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam
difl = kernel_data.curve_kernel_data.minimum_width * len(pixdiff) * 0.5f;
}
float extmax = kernel_data.curve_kernel_data.maximum_width;
- float rng_hair_seed = path_rng(kg, rng, sample, rng_offset + PRNG_HAIR);
- uint lcg_state = lcg_init(rng_hair_seed);
+ uint lcg_state = lcg_init(*rng + rng_offset + sample);
if(!scene_intersect(kg, &ray, visibility, &isect, &lcg_state, difl, extmax)) {
#else
@@ -1017,7 +1015,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam
continue;
/* set up random number generator */
- uint lcg_state = lcg_init(rbsdf);
+ uint lcg_state = lcg_init(*rng + rng_offset + sample);
int num_samples = kernel_data.integrator.subsurface_samples;
float num_samples_inv = 1.0f/num_samples;
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
index e2eb8d5db83..fc33e226051 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -207,9 +207,9 @@ __device float lcg_step(uint *rng)
return (float)*rng * (1.0f/(float)0xFFFFFFFF);
}
-__device uint lcg_init(float seed)
+__device uint lcg_init(uint seed)
{
- uint rng = __float_as_int(seed);
+ uint rng = seed;
lcg_step(&rng);
return rng;
}
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 44c0f090c22..d07bd4dc1c8 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -159,8 +159,7 @@ enum PathTraceDimension {
PRNG_LIGHT_V = 5,
PRNG_LIGHT_F = 6,
PRNG_TERMINATE = 7,
- PRNG_HAIR = 8,
- PRNG_BOUNCE_NUM = 9
+ PRNG_BOUNCE_NUM = 8
};
/* these flags values correspond to raytypes in osl.cpp, so keep them in sync!