diff options
author | Stefan Werner <stefan.werner@tangent-animation.com> | 2020-03-05 14:05:42 +0300 |
---|---|---|
committer | Stefan Werner <stefan.werner@tangent-animation.com> | 2020-03-05 14:21:38 +0300 |
commit | 51e898324de30c0985a80e5bc067358b5ccedbfc (patch) | |
tree | 5efddead1b7ca5655f1d6d2422b59e7da51fe271 /intern/cycles/kernel/kernel_types.h | |
parent | 4ccbbd308060f0330472828b317c59e054c9ee7b (diff) |
Adaptive Sampling for Cycles.
This feature takes some inspiration from
"RenderMan: An Advanced Path Tracing Architecture for Movie Rendering" and
"A Hierarchical Automatic Stopping Condition for Monte Carlo Global Illumination"
The basic principle is as follows:
While samples are being added to a pixel, the adaptive sampler writes half
of the samples to a separate buffer. This gives it two separate estimates
of the same pixel, and by comparing their difference it estimates convergence.
Once convergence drops below a given threshold, the pixel is considered done.
When a pixel has not converged yet and needs more samples than the minimum,
its immediate neighbors are also set to take more samples. This is done in order
to more reliably detect sharp features such as caustics. A 3x3 box filter that
is run periodically over the tile buffer is used for that purpose.
After a tile has finished rendering, the values of all passes are scaled as if
they were rendered with the full number of samples. This way, any code operating
on these buffers, for example the denoiser, does not need to be changed for
per-pixel sample counts.
Reviewed By: brecht, #cycles
Differential Revision: https://developer.blender.org/D4686
Diffstat (limited to 'intern/cycles/kernel/kernel_types.h')
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 88c2d0d3196..c5be93e2cda 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -63,6 +63,11 @@ CCL_NAMESPACE_BEGIN #define VOLUME_STACK_SIZE 32 +/* Adaptive sampling constants */ +#define ADAPTIVE_SAMPLE_STEP 4 +static_assert((ADAPTIVE_SAMPLE_STEP & (ADAPTIVE_SAMPLE_STEP - 1)) == 0, + "ADAPTIVE_SAMPLE_STEP must be power of two for bitwise operations to work"); + /* Split kernel constants */ #define WORK_POOL_SIZE_GPU 64 #define WORK_POOL_SIZE_CPU 1 @@ -374,6 +379,8 @@ typedef enum PassType { PASS_CRYPTOMATTE, PASS_AOV_COLOR, PASS_AOV_VALUE, + PASS_ADAPTIVE_AUX_BUFFER, + PASS_SAMPLE_COUNT, PASS_CATEGORY_MAIN_END = 31, PASS_MIST = 32, @@ -1223,6 +1230,9 @@ typedef struct KernelFilm { int cryptomatte_depth; int pass_cryptomatte; + int pass_adaptive_aux_buffer; + int pass_sample_count; + int pass_mist; float mist_start; float mist_inv_depth; @@ -1256,6 +1266,8 @@ typedef struct KernelFilm { int display_divide_pass_stride; int use_display_exposure; int use_display_pass_alpha; + + int pad3, pad4, pad5; } KernelFilm; static_assert_align(KernelFilm, 16); @@ -1337,6 +1349,8 @@ typedef struct KernelIntegrator { /* sampler */ int sampling_pattern; int aa_samples; + int adaptive_min_samples; + float adaptive_threshold; /* volume render */ int use_volumes; @@ -1348,7 +1362,7 @@ typedef struct KernelIntegrator { int max_closures; - int pad1; + int pad1, pad2, pad3; } KernelIntegrator; static_assert_align(KernelIntegrator, 16); @@ -1662,7 +1676,7 @@ typedef struct WorkTile { uint start_sample; uint num_samples; - uint offset; + int offset; uint stride; ccl_global float *buffer; |