103
__device_inline float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dimension)
105
__device_inline float path_rng_1D(KernelGlobals *kg, RNG *rng, int sample, int num_samples, int dimension)
108
if(kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_CMJ) {
109
/* correlated multi-jittered */
110
int p = *rng + dimension;
111
return cmj_sample_1D(sample, num_samples, p);
105
115
#ifdef __SOBOL_FULL_SCREEN__
106
116
uint result = sobol_dimension(kg, *rng, dimension);
107
117
float r = (float)result * (1.0f/(float)0xFFFFFFFF);
117
127
if(dimension & 1)
118
shift = (*rng >> 16)/((float)0xFFFF);
128
shift = (*rng >> 16) * (1.0f/(float)0xFFFF);
120
shift = (*rng & 0xFFFF)/((float)0xFFFF);
130
shift = (*rng & 0xFFFF) * (1.0f/(float)0xFFFF);
122
132
return r + shift - floorf(r + shift);
126
__device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, float *fx, float *fy)
136
__device_inline void path_rng_2D(KernelGlobals *kg, RNG *rng, int sample, int num_samples, int dimension, float *fx, float *fy)
139
if(kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_CMJ) {
140
/* correlated multi-jittered */
141
int p = *rng + dimension;
142
cmj_sample_2D(sample, num_samples, p, fx, fy);
147
*fx = path_rng_1D(kg, rng, sample, num_samples, dimension);
148
*fy = path_rng_1D(kg, rng, sample, num_samples, dimension + 1);
151
__device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, int num_samples, RNG *rng, int x, int y, float *fx, float *fy)
128
153
#ifdef __SOBOL_FULL_SCREEN__
156
*fx = path_rng(kg, rng, sample, PRNG_FILTER_U);
157
*fy = path_rng(kg, rng, sample, PRNG_FILTER_V);
181
path_rng_2D(kg, rng, sample, num_samples, PRNG_FILTER_U, fx, fy);
169
193
/* Linear Congruential Generator */
171
__device float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dimension)
195
__device float path_rng(KernelGlobals *kg, RNG& rng, int sample, int dimension)
199
__device_inline float path_rng_1D(KernelGlobals *kg, RNG& rng, int sample, int num_samples, int dimension)
173
201
/* implicit mod 2^32 */
174
*rng = (1103515245*(*rng) + 12345);
175
return (float)*rng * (1.0f/(float)0xFFFFFFFF);
178
__device void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, RNG *rng, int x, int y, float *fx, float *fy)
202
rng = (1103515245*(rng) + 12345);
203
return (float)rng * (1.0f/(float)0xFFFFFFFF);
206
__device_inline void path_rng_2D(KernelGlobals *kg, RNG& rng, int sample, int num_samples, int dimension, float *fx, float *fy)
208
*fx = path_rng_1D(kg, rng, sample, num_samples, dimension);
209
*fy = path_rng_1D(kg, rng, sample, num_samples, dimension + 1);
212
__device void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, int num_samples, RNG *rng, int x, int y, float *fx, float *fy)
181
215
*rng = *rng_state;
190
*fx = path_rng(kg, rng, sample, PRNG_FILTER_U);
191
*fy = path_rng(kg, rng, sample, PRNG_FILTER_V);
224
path_rng_2D(kg, rng, sample, num_samples, PRNG_FILTER_U, fx, fy);