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 <brecht@blender.org>2022-03-15 18:08:10 +0300
committerBrecht Van Lommel <brecht@blender.org>2022-03-15 18:12:13 +0300
commit630d2b649741c9d9f7bc0857054b001eede84a80 (patch)
treeaa006448f367c426d23a71a98b0f5d4a13a3c12a /intern/cycles/blender/sync.cpp
parentf9d3632cde17b13281d387c570755aa78a14b7d6 (diff)
Cycles: allow Adaptive Sampling with Scrambling Distance
While the correlation may not work well with adaptive sampling, in practice this appears to work ok in most cases Automatic scrambling distance uses the minimum samples from adaptive sampling, which provides a good default estimate to avoid artifacts. Contributed by Alaska. Differential Revision: https://developer.blender.org/D13325
Diffstat (limited to 'intern/cycles/blender/sync.cpp')
-rw-r--r--intern/cycles/blender/sync.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp
index d4949a5ff30..8af2ee7a435 100644
--- a/intern/cycles/blender/sync.cpp
+++ b/intern/cycles/blender/sync.cpp
@@ -346,31 +346,48 @@ void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background)
cscene, "sampling_pattern", SAMPLING_NUM_PATTERNS, SAMPLING_PATTERN_SOBOL);
integrator->set_sampling_pattern(sampling_pattern);
+ int samples = 1;
bool use_adaptive_sampling = false;
if (preview) {
+ samples = get_int(cscene, "preview_samples");
use_adaptive_sampling = RNA_boolean_get(&cscene, "use_preview_adaptive_sampling");
integrator->set_use_adaptive_sampling(use_adaptive_sampling);
integrator->set_adaptive_threshold(get_float(cscene, "preview_adaptive_threshold"));
integrator->set_adaptive_min_samples(get_int(cscene, "preview_adaptive_min_samples"));
}
else {
+ samples = get_int(cscene, "samples");
use_adaptive_sampling = RNA_boolean_get(&cscene, "use_adaptive_sampling");
integrator->set_use_adaptive_sampling(use_adaptive_sampling);
integrator->set_adaptive_threshold(get_float(cscene, "adaptive_threshold"));
integrator->set_adaptive_min_samples(get_int(cscene, "adaptive_min_samples"));
}
- int samples = get_int(cscene, "samples");
float scrambling_distance = get_float(cscene, "scrambling_distance");
bool auto_scrambling_distance = get_boolean(cscene, "auto_scrambling_distance");
if (auto_scrambling_distance) {
+ if (samples == 0) {
+ /* If samples is 0, then viewport rendering is set to render infinitely. In that case we
+ * override the samples value with 4096 so the Automatic Scrambling Distance algorithm
+ * picks a Scrambling Distance value with a good balance of performance and correlation
+ * artifacts when rendering to high sample counts. */
+ samples = 4096;
+ }
+
+ if (use_adaptive_sampling) {
+ /* If Adaptive Sampling is enabled, use "min_samples" in the Automatic Scrambling Distance
+ * algorithm to avoid artifacts common with Adaptive Sampling + Scrambling Distance. */
+ const AdaptiveSampling adaptive_sampling = integrator->get_adaptive_sampling();
+ samples = min(samples, adaptive_sampling.min_samples);
+ }
scrambling_distance *= 4.0f / sqrtf(samples);
}
- /* only use scrambling distance in the viewport if user wants to and disable with AS */
+ /* Only use scrambling distance in the viewport if user wants to. */
bool preview_scrambling_distance = get_boolean(cscene, "preview_scrambling_distance");
- if ((preview && !preview_scrambling_distance) || use_adaptive_sampling)
+ if (preview && !preview_scrambling_distance) {
scrambling_distance = 1.0f;
+ }
if (scrambling_distance != 1.0f) {
VLOG(3) << "Using scrambling distance: " << scrambling_distance;