Blender V4.3
integrator_adaptive_sampling_test.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "testing/testing.h"
6
8#include "util/vector.h"
9
11
12TEST(AdaptiveSampling, schedule_samples)
13{
14 AdaptiveSampling adaptive_sampling;
15 adaptive_sampling.use = true;
16 adaptive_sampling.min_samples = 0;
17 adaptive_sampling.adaptive_step = 4;
18
19 for (int sample = 2; sample < 32; ++sample) {
20 for (int num_samples = 8; num_samples < 32; ++num_samples) {
21 const int num_samples_aligned = adaptive_sampling.align_samples(sample, num_samples);
22 /* NOTE: `sample + num_samples_aligned` is the number of samples after rendering, so need
23 * to convert this to the 0-based index of the last sample. */
24 EXPECT_TRUE(adaptive_sampling.need_filter(sample + num_samples_aligned - 1));
25 }
26 }
27}
28
29TEST(AdaptiveSampling, align_samples)
30{
31 AdaptiveSampling adaptive_sampling;
32 adaptive_sampling.use = true;
33 adaptive_sampling.min_samples = 11 /* Rounded result of `sqrt(128)`. */;
34 adaptive_sampling.adaptive_step = 4;
35
36 /* Filtering will happen at the following samples:
37 * 15, 19, 23, 27, 31, 35, 39, 43 */
38
39 /* Requested sample and number of samples will result in number of samples lower than
40 * `min_samples`. */
41 EXPECT_EQ(adaptive_sampling.align_samples(0, 4), 4);
42 EXPECT_EQ(adaptive_sampling.align_samples(0, 7), 7);
43
44 /* Request number of samples higher than the minimum samples before filter, but prior to the
45 * first sample at which filtering will happen. */
46 EXPECT_EQ(adaptive_sampling.align_samples(0, 15), 15);
47
48 /* When rendering many samples from the very beginning, limit number of samples by the first
49 * sample at which filtering is to happen. */
50 EXPECT_EQ(adaptive_sampling.align_samples(0, 16), 16);
51 EXPECT_EQ(adaptive_sampling.align_samples(0, 17), 16);
52 EXPECT_EQ(adaptive_sampling.align_samples(0, 20), 16);
53 EXPECT_EQ(adaptive_sampling.align_samples(0, 60), 16);
54
55 /* Similar to above, but start sample is not 0. */
56 EXPECT_EQ(adaptive_sampling.align_samples(9, 8), 7);
57 EXPECT_EQ(adaptive_sampling.align_samples(9, 20), 7);
58 EXPECT_EQ(adaptive_sampling.align_samples(9, 60), 7);
59
60 /* Start sample is past the minimum required samples, but prior to the first filter sample. */
61 EXPECT_EQ(adaptive_sampling.align_samples(12, 6), 4);
62 EXPECT_EQ(adaptive_sampling.align_samples(12, 20), 4);
63 EXPECT_EQ(adaptive_sampling.align_samples(12, 60), 4);
64
65 /* Start sample is the sample which is to be filtered. */
66 EXPECT_EQ(adaptive_sampling.align_samples(15, 4), 1);
67 EXPECT_EQ(adaptive_sampling.align_samples(15, 6), 1);
68 EXPECT_EQ(adaptive_sampling.align_samples(15, 10), 1);
69 EXPECT_EQ(adaptive_sampling.align_samples(58, 2), 2);
70
71 /* Start sample is past the sample which is to be filtered. */
72 EXPECT_EQ(adaptive_sampling.align_samples(16, 3), 3);
73 EXPECT_EQ(adaptive_sampling.align_samples(16, 4), 4);
74 EXPECT_EQ(adaptive_sampling.align_samples(16, 5), 4);
75 EXPECT_EQ(adaptive_sampling.align_samples(16, 10), 4);
76
77 /* Should never exceed requested number of samples. */
78 EXPECT_EQ(adaptive_sampling.align_samples(15, 2), 1);
79 EXPECT_EQ(adaptive_sampling.align_samples(16, 2), 2);
80 EXPECT_EQ(adaptive_sampling.align_samples(17, 2), 2);
81 EXPECT_EQ(adaptive_sampling.align_samples(18, 2), 2);
82}
83
85{
86 AdaptiveSampling adaptive_sampling;
87 adaptive_sampling.use = true;
88 adaptive_sampling.min_samples = 11 /* Rounded result of `sqrt(128)`. */;
89 adaptive_sampling.adaptive_step = 4;
90
91 const vector<int> expected_samples_to_filter = {
92 {15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59}};
93
94 vector<int> actual_samples_to_filter;
95 for (int sample = 0; sample < 60; ++sample) {
96 if (adaptive_sampling.need_filter(sample)) {
97 actual_samples_to_filter.push_back(sample);
98 }
99 }
100
101 EXPECT_EQ(actual_samples_to_filter, expected_samples_to_filter);
102}
103
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
bool need_filter(int sample) const
int align_samples(int start_sample, int num_samples) const
#define CCL_NAMESPACE_END
CCL_NAMESPACE_BEGIN TEST(AdaptiveSampling, schedule_samples)