diff options
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/data_arrays.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/init_from_bake.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/init_from_camera.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/mnee.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/path_state.h | 15 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_surface.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/shade_volume.h | 14 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/subsurface_disk.h | 4 | ||||
-rw-r--r-- | intern/cycles/kernel/integrator/subsurface_random_walk.h | 14 | ||||
-rw-r--r-- | intern/cycles/kernel/sample/pattern.h | 67 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/ao.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/bevel.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/types.h | 64 |
13 files changed, 69 insertions, 130 deletions
diff --git a/intern/cycles/kernel/data_arrays.h b/intern/cycles/kernel/data_arrays.h index 7205f728088..f2877e6c37f 100644 --- a/intern/cycles/kernel/data_arrays.h +++ b/intern/cycles/kernel/data_arrays.h @@ -70,7 +70,7 @@ KERNEL_DATA_ARRAY(KernelShader, shaders) /* lookup tables */ KERNEL_DATA_ARRAY(float, lookup_table) -/* sobol */ +/* PMJ sample pattern */ KERNEL_DATA_ARRAY(float, sample_pattern_lut) /* image textures */ diff --git a/intern/cycles/kernel/integrator/init_from_bake.h b/intern/cycles/kernel/integrator/init_from_bake.h index c77fc2540c1..c00d677d420 100644 --- a/intern/cycles/kernel/integrator/init_from_bake.h +++ b/intern/cycles/kernel/integrator/init_from_bake.h @@ -126,7 +126,7 @@ ccl_device bool integrator_init_from_bake(KernelGlobals kg, filter_x = filter_y = 0.5f; } else { - path_rng_2D(kg, rng_hash, sample, PRNG_FILTER_U, &filter_x, &filter_y); + path_rng_2D(kg, rng_hash, sample, PRNG_FILTER, &filter_x, &filter_y); } /* Initialize path state for path integration. */ diff --git a/intern/cycles/kernel/integrator/init_from_camera.h b/intern/cycles/kernel/integrator/init_from_camera.h index e89ab3991c7..a2fbf551241 100644 --- a/intern/cycles/kernel/integrator/init_from_camera.h +++ b/intern/cycles/kernel/integrator/init_from_camera.h @@ -30,13 +30,13 @@ ccl_device_inline void integrate_camera_sample(KernelGlobals kg, filter_v = 0.5f; } else { - path_rng_2D(kg, rng_hash, sample, PRNG_FILTER_U, &filter_u, &filter_v); + path_rng_2D(kg, rng_hash, sample, PRNG_FILTER, &filter_u, &filter_v); } /* Depth of field sampling. */ float lens_u = 0.0f, lens_v = 0.0f; if (kernel_data.cam.aperturesize > 0.0f) { - path_rng_2D(kg, rng_hash, sample, PRNG_LENS_U, &lens_u, &lens_v); + path_rng_2D(kg, rng_hash, sample, PRNG_LENS, &lens_u, &lens_v); } /* Motion blur time sampling. */ diff --git a/intern/cycles/kernel/integrator/mnee.h b/intern/cycles/kernel/integrator/mnee.h index c95f1557f04..ec850bb05ea 100644 --- a/intern/cycles/kernel/integrator/mnee.h +++ b/intern/cycles/kernel/integrator/mnee.h @@ -1034,7 +1034,7 @@ ccl_device_forceinline int kernel_path_mnee_sample(KernelGlobals kg, if (microfacet_bsdf->alpha_x > 0.f && microfacet_bsdf->alpha_y > 0.f) { /* Sample transmissive microfacet bsdf. */ float bsdf_u, bsdf_v; - path_state_rng_2D(kg, rng_state, PRNG_BSDF_U, &bsdf_u, &bsdf_v); + path_state_rng_2D(kg, rng_state, PRNG_SURFACE_BSDF, &bsdf_u, &bsdf_v); h = mnee_sample_bsdf_dh( bsdf->type, microfacet_bsdf->alpha_x, microfacet_bsdf->alpha_y, bsdf_u, bsdf_v); } diff --git a/intern/cycles/kernel/integrator/path_state.h b/intern/cycles/kernel/integrator/path_state.h index a41e922b593..0ef89b6f52f 100644 --- a/intern/cycles/kernel/integrator/path_state.h +++ b/intern/cycles/kernel/integrator/path_state.h @@ -48,7 +48,7 @@ ccl_device_inline void path_state_init_integrator(KernelGlobals kg, INTEGRATOR_STATE_WRITE(state, path, volume_bounce) = 0; INTEGRATOR_STATE_WRITE(state, path, volume_bounds_bounce) = 0; INTEGRATOR_STATE_WRITE(state, path, rng_hash) = rng_hash; - INTEGRATOR_STATE_WRITE(state, path, rng_offset) = PRNG_BASE_NUM; + INTEGRATOR_STATE_WRITE(state, path, rng_offset) = PRNG_BOUNCE_NUM; INTEGRATOR_STATE_WRITE(state, path, flag) = PATH_RAY_CAMERA | PATH_RAY_MIS_SKIP | PATH_RAY_TRANSPARENT_BACKGROUND; INTEGRATOR_STATE_WRITE(state, path, mis_ray_pdf) = 0.0f; @@ -314,19 +314,6 @@ ccl_device_inline void path_state_rng_2D(KernelGlobals kg, kg, rng_state->rng_hash, rng_state->sample, rng_state->rng_offset + dimension, fx, fy); } -ccl_device_inline float path_state_rng_1D_hash(KernelGlobals kg, - ccl_private const RNGState *rng_state, - uint hash) -{ - /* Use a hash instead of dimension, this is not great but avoids adding - * more dimensions to each bounce which reduces quality of dimensions we - * are already using. */ - return path_rng_1D(kg, - hash_wang_seeded_uint(rng_state->rng_hash, hash), - rng_state->sample, - rng_state->rng_offset); -} - ccl_device_inline float path_branched_rng_1D(KernelGlobals kg, ccl_private const RNGState *rng_state, int branch, diff --git a/intern/cycles/kernel/integrator/shade_surface.h b/intern/cycles/kernel/integrator/shade_surface.h index f42e2979b3b..3225a27701c 100644 --- a/intern/cycles/kernel/integrator/shade_surface.h +++ b/intern/cycles/kernel/integrator/shade_surface.h @@ -156,7 +156,7 @@ ccl_device_forceinline void integrate_surface_direct_light(KernelGlobals kg, const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); const uint bounce = INTEGRATOR_STATE(state, path, bounce); float light_u, light_v; - path_state_rng_2D(kg, rng_state, PRNG_LIGHT_U, &light_u, &light_v); + path_state_rng_2D(kg, rng_state, PRNG_LIGHT, &light_u, &light_v); if (!light_distribution_sample_from_position( kg, light_u, light_v, sd->time, sd->P, bounce, path_flag, &ls)) { @@ -348,7 +348,7 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce( } float bsdf_u, bsdf_v; - path_state_rng_2D(kg, rng_state, PRNG_BSDF_U, &bsdf_u, &bsdf_v); + path_state_rng_2D(kg, rng_state, PRNG_SURFACE_BSDF, &bsdf_u, &bsdf_v); ccl_private const ShaderClosure *sc = shader_bsdf_bssrdf_pick(sd, &bsdf_u); #ifdef __SUBSURFACE__ @@ -457,7 +457,7 @@ ccl_device_forceinline void integrate_surface_ao(KernelGlobals kg, } float bsdf_u, bsdf_v; - path_state_rng_2D(kg, rng_state, PRNG_BSDF_U, &bsdf_u, &bsdf_v); + path_state_rng_2D(kg, rng_state, PRNG_SURFACE_BSDF, &bsdf_u, &bsdf_v); float3 ao_N; const Spectrum ao_weight = shader_bsdf_ao( diff --git a/intern/cycles/kernel/integrator/shade_volume.h b/intern/cycles/kernel/integrator/shade_volume.h index 599454c5cb2..f4512b3bc79 100644 --- a/intern/cycles/kernel/integrator/shade_volume.h +++ b/intern/cycles/kernel/integrator/shade_volume.h @@ -144,11 +144,11 @@ ccl_device_forceinline void volume_step_init(KernelGlobals kg, /* Perform shading at this offset within a step, to integrate over * over the entire step segment. */ - *step_shade_offset = path_state_rng_1D_hash(kg, rng_state, 0x1e31d8a4); + *step_shade_offset = path_state_rng_1D(kg, rng_state, PRNG_VOLUME_SHADE_OFFSET); /* Shift starting point of all segment by this random amount to avoid * banding artifacts from the volume bounding shape. */ - *steps_offset = path_state_rng_1D_hash(kg, rng_state, 0x3d22c7b3); + *steps_offset = path_state_rng_1D(kg, rng_state, PRNG_VOLUME_OFFSET); } } @@ -549,8 +549,8 @@ ccl_device_forceinline void volume_integrate_heterogeneous( vstate.tmin = ray->tmin; vstate.tmax = ray->tmin; vstate.absorption_only = true; - vstate.rscatter = path_state_rng_1D(kg, rng_state, PRNG_SCATTER_DISTANCE); - vstate.rphase = path_state_rng_1D(kg, rng_state, PRNG_PHASE_CHANNEL); + vstate.rscatter = path_state_rng_1D(kg, rng_state, PRNG_VOLUME_SCATTER_DISTANCE); + vstate.rphase = path_state_rng_1D(kg, rng_state, PRNG_VOLUME_PHASE_CHANNEL); /* Multiple importance sampling: pick between equiangular and distance sampling strategy. */ vstate.direct_sample_method = direct_sample_method; @@ -695,7 +695,7 @@ ccl_device_forceinline bool integrate_volume_sample_light( const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); const uint bounce = INTEGRATOR_STATE(state, path, bounce); float light_u, light_v; - path_state_rng_2D(kg, rng_state, PRNG_LIGHT_U, &light_u, &light_v); + path_state_rng_2D(kg, rng_state, PRNG_LIGHT, &light_u, &light_v); if (!light_distribution_sample_from_volume_segment( kg, light_u, light_v, sd->time, sd->P, bounce, path_flag, ls)) { @@ -736,7 +736,7 @@ ccl_device_forceinline void integrate_volume_direct_light( const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); const uint bounce = INTEGRATOR_STATE(state, path, bounce); float light_u, light_v; - path_state_rng_2D(kg, rng_state, PRNG_LIGHT_U, &light_u, &light_v); + path_state_rng_2D(kg, rng_state, PRNG_LIGHT, &light_u, &light_v); if (!light_distribution_sample_from_position( kg, light_u, light_v, sd->time, P, bounce, path_flag, ls)) { @@ -865,7 +865,7 @@ ccl_device_forceinline bool integrate_volume_phase_scatter( PROFILING_INIT(kg, PROFILING_SHADE_VOLUME_INDIRECT_LIGHT); float phase_u, phase_v; - path_state_rng_2D(kg, rng_state, PRNG_BSDF_U, &phase_u, &phase_v); + path_state_rng_2D(kg, rng_state, PRNG_VOLUME_PHASE, &phase_u, &phase_v); /* Phase closure, sample direction. */ float phase_pdf; diff --git a/intern/cycles/kernel/integrator/subsurface_disk.h b/intern/cycles/kernel/integrator/subsurface_disk.h index 77763f702d8..bc4189f6b56 100644 --- a/intern/cycles/kernel/integrator/subsurface_disk.h +++ b/intern/cycles/kernel/integrator/subsurface_disk.h @@ -26,7 +26,7 @@ ccl_device_inline bool subsurface_disk(KernelGlobals kg, { float disk_u, disk_v; - path_state_rng_2D(kg, &rng_state, PRNG_BSDF_U, &disk_u, &disk_v); + path_state_rng_2D(kg, &rng_state, PRNG_SUBSURFACE_DISK, &disk_u, &disk_v); /* Read shading point info from integrator state. */ const float3 P = INTEGRATOR_STATE(state, ray, P); @@ -163,7 +163,7 @@ ccl_device_inline bool subsurface_disk(KernelGlobals kg, } /* Use importance resampling, sampling one of the hits proportional to weight. */ - const float r = lcg_step_float(&lcg_state) * sum_weights; + const float r = path_state_rng_1D(kg, &rng_state, PRNG_SUBSURFACE_DISK_RESAMPLE) * sum_weights; float partial_sum = 0.0f; for (int hit = 0; hit < num_eval_hits; hit++) { diff --git a/intern/cycles/kernel/integrator/subsurface_random_walk.h b/intern/cycles/kernel/integrator/subsurface_random_walk.h index e0c69c96fc6..38a860800bb 100644 --- a/intern/cycles/kernel/integrator/subsurface_random_walk.h +++ b/intern/cycles/kernel/integrator/subsurface_random_walk.h @@ -166,7 +166,7 @@ ccl_device_inline bool subsurface_random_walk(KernelGlobals kg, ccl_private LocalIntersection &ss_isect) { float bssrdf_u, bssrdf_v; - path_state_rng_2D(kg, &rng_state, PRNG_BSDF_U, &bssrdf_u, &bssrdf_v); + path_state_rng_2D(kg, &rng_state, PRNG_SUBSURFACE_BSDF, &bssrdf_u, &bssrdf_v); const float3 P = INTEGRATOR_STATE(state, ray, P); const float3 N = INTEGRATOR_STATE(state, ray, D); @@ -272,11 +272,11 @@ ccl_device_inline bool subsurface_random_walk(KernelGlobals kg, #endif /* Sample color channel, use MIS with balance heuristic. */ - float rphase = path_state_rng_1D(kg, &rng_state, PRNG_PHASE_CHANNEL); + float rphase = path_state_rng_1D(kg, &rng_state, PRNG_SUBSURFACE_PHASE_CHANNEL); Spectrum channel_pdf; int channel = volume_sample_channel(alpha, throughput, rphase, &channel_pdf); float sample_sigma_t = volume_channel_get(sigma_t, channel); - float randt = path_state_rng_1D(kg, &rng_state, PRNG_SCATTER_DISTANCE); + float randt = path_state_rng_1D(kg, &rng_state, PRNG_SUBSURFACE_SCATTER_DISTANCE); /* We need the result of the ray-cast to compute the full guided PDF, so just remember the * relevant terms to avoid recomputing them later. */ @@ -289,7 +289,8 @@ ccl_device_inline bool subsurface_random_walk(KernelGlobals kg, /* For the initial ray, we already know the direction, so just do classic distance sampling. */ if (bounce > 0) { /* Decide whether we should use guided or classic sampling. */ - bool guided = (path_state_rng_1D(kg, &rng_state, PRNG_LIGHT_TERMINATE) < guided_fraction); + bool guided = (path_state_rng_1D(kg, &rng_state, PRNG_SUBSURFACE_GUIDE_STRATEGY) < + guided_fraction); /* Determine if we want to sample away from the incoming interface. * This only happens if we found a nearby opposite interface, and the probability for it @@ -303,12 +304,13 @@ ccl_device_inline bool subsurface_random_walk(KernelGlobals kg, float x = clamp(dot(ray.P - P, -N), 0.0f, opposite_distance); backward_fraction = 1.0f / (1.0f + expf((opposite_distance - 2.0f * x) / diffusion_length)); - guide_backward = path_state_rng_1D(kg, &rng_state, PRNG_TERMINATE) < backward_fraction; + guide_backward = path_state_rng_1D(kg, &rng_state, PRNG_SUBSURFACE_GUIDE_DIRECTION) < + backward_fraction; } /* Sample scattering direction. */ float scatter_u, scatter_v; - path_state_rng_2D(kg, &rng_state, PRNG_BSDF_U, &scatter_u, &scatter_v); + path_state_rng_2D(kg, &rng_state, PRNG_SUBSURFACE_BSDF, &scatter_u, &scatter_v); float cos_theta; float hg_pdf; if (guided) { diff --git a/intern/cycles/kernel/sample/pattern.h b/intern/cycles/kernel/sample/pattern.h index e8c3acb5cf7..cc5d0e960ec 100644 --- a/intern/cycles/kernel/sample/pattern.h +++ b/intern/cycles/kernel/sample/pattern.h @@ -13,33 +13,6 @@ CCL_NAMESPACE_BEGIN * this single threaded on a CPU for repeatable results. */ //#define __DEBUG_CORRELATION__ -/* High Dimensional Sobol. - * - * Multidimensional sobol with generator matrices. Dimension 0 and 1 are equal - * to classic Van der Corput and Sobol sequences. */ - -#ifdef __SOBOL__ - -/* Skip initial numbers that for some dimensions have clear patterns that - * don't cover the entire sample space. Ideally we would have a better - * progressive pattern that doesn't suffer from this problem, because even - * with this offset some dimensions are quite poor. - */ -# define SOBOL_SKIP 64 - -ccl_device uint sobol_dimension(KernelGlobals kg, int index, int dimension) -{ - uint result = 0; - uint i = index + SOBOL_SKIP; - for (int j = 0, x; (x = find_first_set(i)); i >>= x) { - j += x; - result ^= __float_as_uint(kernel_data_fetch(sample_pattern_lut, 32 * dimension + j - 1)); - } - return result; -} - -#endif /* __SOBOL__ */ - ccl_device_forceinline float path_rng_1D(KernelGlobals kg, uint rng_hash, int sample, @@ -52,30 +25,9 @@ ccl_device_forceinline float path_rng_1D(KernelGlobals kg, if (kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_SOBOL_BURLEY) { return sobol_burley_sample_1D(sample, dimension, rng_hash); } - -#ifdef __SOBOL__ - if (kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_PMJ) -#endif - { + else { return pmj_sample_1D(kg, sample, rng_hash, dimension); } - -#ifdef __SOBOL__ - /* Sobol sequence value using direction vectors. */ - uint result = sobol_dimension(kg, sample, dimension); - float r = (float)result * (1.0f / (float)0xFFFFFFFF); - - /* Cranly-Patterson rotation using rng seed */ - float shift; - - /* Hash rng with dimension to solve correlation issues. - * See T38710, T50116. - */ - uint tmp_rng = hash_wang_seeded_uint(dimension, rng_hash); - shift = tmp_rng * (kernel_data.integrator.scrambling_distance / (float)0xFFFFFFFF); - - return r + shift - floorf(r + shift); -#endif } ccl_device_forceinline void path_rng_2D(KernelGlobals kg, @@ -93,23 +45,10 @@ ccl_device_forceinline void path_rng_2D(KernelGlobals kg, if (kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_SOBOL_BURLEY) { sobol_burley_sample_2D(sample, dimension, rng_hash, fx, fy); - return; } - -#ifdef __SOBOL__ - if (kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_PMJ) -#endif - { + else { pmj_sample_2D(kg, sample, rng_hash, dimension, fx, fy); - - return; } - -#ifdef __SOBOL__ - /* Sobol. */ - *fx = path_rng_1D(kg, rng_hash, sample, dimension); - *fy = path_rng_1D(kg, rng_hash, sample, dimension + 1); -#endif } /** @@ -164,7 +103,7 @@ ccl_device_inline bool sample_is_even(int pattern, int sample) return popcount(uint(sample) & 0xaaaaaaaa) & 1; } else { - /* TODO(Stefan): Are there reliable ways of dividing CMJ and Sobol into two classes? */ + /* TODO(Stefan): Are there reliable ways of dividing Sobol-Burley into two classes? */ return sample & 0x1; } } diff --git a/intern/cycles/kernel/svm/ao.h b/intern/cycles/kernel/svm/ao.h index c57c68d6230..a3808eff6dd 100644 --- a/intern/cycles/kernel/svm/ao.h +++ b/intern/cycles/kernel/svm/ao.h @@ -50,7 +50,7 @@ ccl_device float svm_ao( int unoccluded = 0; for (int sample = 0; sample < num_samples; sample++) { float disk_u, disk_v; - path_branched_rng_2D(kg, &rng_state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v); + path_branched_rng_2D(kg, &rng_state, sample, num_samples, PRNG_SURFACE_AO, &disk_u, &disk_v); float2 d = concentric_sample_disk(disk_u, disk_v); float3 D = make_float3(d.x, d.y, safe_sqrtf(1.0f - dot(d, d))); diff --git a/intern/cycles/kernel/svm/bevel.h b/intern/cycles/kernel/svm/bevel.h index 4617a056a52..f9d3f6c850f 100644 --- a/intern/cycles/kernel/svm/bevel.h +++ b/intern/cycles/kernel/svm/bevel.h @@ -129,7 +129,8 @@ ccl_device float3 svm_bevel( for (int sample = 0; sample < num_samples; sample++) { float disk_u, disk_v; - path_branched_rng_2D(kg, &rng_state, sample, num_samples, PRNG_BEVEL_U, &disk_u, &disk_v); + path_branched_rng_2D( + kg, &rng_state, sample, num_samples, PRNG_SURFACE_BEVEL, &disk_u, &disk_v); /* Pick random axis in local frame and point on disk. */ float3 disk_N, disk_T, disk_B; diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 655c9c5503b..16c37beeb5a 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -54,7 +54,6 @@ CCL_NAMESPACE_BEGIN #endif /* Kernel features */ -#define __SOBOL__ #define __DPDU__ #define __BACKGROUND__ #define __CAUSTICS_TRICKS__ @@ -147,38 +146,49 @@ CCL_NAMESPACE_BEGIN # define __BVH_LOCAL__ #endif -/* Path Tracing - * note we need to keep the u/v pairs at even values */ +/* Sampling Patterns */ +/* Unique numbers for sampling patterns in each bounce. */ enum PathTraceDimension { - PRNG_FILTER_U = 0, - PRNG_FILTER_V = 1, - PRNG_LENS_U = 2, - PRNG_LENS_V = 3, - PRNG_TIME = 4, - PRNG_UNUSED_0 = 5, - PRNG_UNUSED_1 = 6, /* for some reason (6, 7) is a bad sobol pattern */ - PRNG_UNUSED_2 = 7, /* with a low number of samples (< 64) */ - PRNG_BASE_NUM = 10, - - PRNG_BSDF_U = 0, - PRNG_BSDF_V = 1, - PRNG_LIGHT_U = 2, - PRNG_LIGHT_V = 3, - PRNG_LIGHT_TERMINATE = 4, - PRNG_TERMINATE = 5, - PRNG_PHASE_CHANNEL = 6, - PRNG_SCATTER_DISTANCE = 7, - PRNG_BOUNCE_NUM = 8, - - PRNG_BEVEL_U = 6, /* reuse volume dimension, correlation won't harm */ - PRNG_BEVEL_V = 7, + /* Init bounce */ + PRNG_FILTER = 0, + PRNG_LENS = 1, + PRNG_TIME = 2, + + /* Shade bounce */ + PRNG_TERMINATE = 0, + PRNG_LIGHT = 1, + PRNG_LIGHT_TERMINATE = 2, + /* Surface */ + PRNG_SURFACE_BSDF = 3, + PRNG_SURFACE_AO = 4, + PRNG_SURFACE_BEVEL = 5, + /* Volume */ + PRNG_VOLUME_PHASE = 3, + PRNG_VOLUME_PHASE_CHANNEL = 4, + PRNG_VOLUME_SCATTER_DISTANCE = 5, + PRNG_VOLUME_OFFSET = 6, + PRNG_VOLUME_SHADE_OFFSET = 7, + + /* Subsurface random walk bounces */ + PRNG_SUBSURFACE_BSDF = 0, + PRNG_SUBSURFACE_PHASE_CHANNEL = 1, + PRNG_SUBSURFACE_SCATTER_DISTANCE = 2, + PRNG_SUBSURFACE_GUIDE_STRATEGY = 3, + PRNG_SUBSURFACE_GUIDE_DIRECTION = 4, + + /* Subsurface disk bounce */ + PRNG_SUBSURFACE_DISK = 0, + PRNG_SUBSURFACE_DISK_RESAMPLE = 1, + + /* High enough number so we don't need to change it when adding new dimenions, + * low enough so there is no uint16_t overflow with many bounces. */ + PRNG_BOUNCE_NUM = 16, }; enum SamplingPattern { - SAMPLING_PATTERN_SOBOL = 0, + SAMPLING_PATTERN_SOBOL_BURLEY = 0, SAMPLING_PATTERN_PMJ = 1, - SAMPLING_PATTERN_SOBOL_BURLEY = 2, SAMPLING_NUM_PATTERNS, }; |