35 SOCKET_INT(max_diffuse_bounce,
"Max Diffuse Bounce", 7);
36 SOCKET_INT(max_glossy_bounce,
"Max Glossy Bounce", 7);
37 SOCKET_INT(max_transmission_bounce,
"Max Transmission Bounce", 7);
38 SOCKET_INT(max_volume_bounce,
"Max Volume Bounce", 7);
40 SOCKET_INT(transparent_min_bounce,
"Transparent Min Bounce", 0);
41 SOCKET_INT(transparent_max_bounce,
"Transparent Max Bounce", 7);
43#ifdef WITH_CYCLES_DEBUG
44 static NodeEnum direct_light_sampling_type_enum;
45 direct_light_sampling_type_enum.
insert(
"multiple_importance_sampling",
50 "Direct Light Sampling Type",
51 direct_light_sampling_type_enum,
58 SOCKET_FLOAT(ao_additive_factor,
"AO Additive Factor", 0.0f);
60 SOCKET_INT(volume_max_steps,
"Volume Max Steps", 1024);
61 SOCKET_FLOAT(volume_step_rate,
"Volume Step Rate", 1.0f);
63 static NodeEnum guiding_distribution_enum;
68 static NodeEnum guiding_directional_sampling_type_enum;
69 guiding_directional_sampling_type_enum.
insert(
"MIS",
72 guiding_directional_sampling_type_enum.
insert(
"ROUGHNESS",
76 SOCKET_BOOLEAN(deterministic_guiding,
"Deterministic Guiding",
true);
78 SOCKET_FLOAT(surface_guiding_probability,
"Surface Guiding Probability", 0.5f);
80 SOCKET_FLOAT(volume_guiding_probability,
"Volume Guiding Probability", 0.5f);
81 SOCKET_INT(guiding_training_samples,
"Training Samples", 128);
82 SOCKET_BOOLEAN(use_guiding_direct_light,
"Guide Direct Light",
true);
85 "Guiding Distribution Type",
86 guiding_distribution_enum,
89 "Guiding Directional Sampling Type",
90 guiding_directional_sampling_type_enum,
92 SOCKET_FLOAT(guiding_roughness_threshold,
"Guiding Roughness Threshold", 0.05f);
106 SOCKET_FLOAT(sample_clamp_direct,
"Sample Clamp Direct", 0.0f);
107 SOCKET_FLOAT(sample_clamp_indirect,
"Sample Clamp Indirect", 10.0f);
112 SOCKET_INT(sample_subset_offset,
"Sample Subset Offset", 0);
113 SOCKET_INT(sample_subset_length,
"Sample Subset Length", MAX_SAMPLES);
115 SOCKET_BOOLEAN(use_adaptive_sampling,
"Use Adaptive Sampling",
true);
116 SOCKET_FLOAT(adaptive_threshold,
"Adaptive Threshold", 0.01f);
117 SOCKET_INT(adaptive_min_samples,
"Adaptive Min Samples", 0);
119 SOCKET_BOOLEAN(use_light_tree,
"Use light tree to optimize many light sampling",
true);
120 SOCKET_FLOAT(light_sampling_threshold,
"Light Sampling Threshold", 0.0f);
122 static NodeEnum sampling_pattern_enum;
130 sampling_pattern_enum,
132 SOCKET_FLOAT(scrambling_distance,
"Scrambling Distance", 1.0f);
139 static NodeEnum denoiser_prefilter_enum;
144 static NodeEnum denoiser_quality_enum;
154 SOCKET_INT(denoise_start_sample,
"Start Sample to Denoise", 0);
155 SOCKET_BOOLEAN(use_denoise_pass_albedo,
"Use Albedo Pass for Denoiser",
true);
156 SOCKET_BOOLEAN(use_denoise_pass_normal,
"Use Normal Pass for Denoiser",
true);
158 "Denoiser Prefilter",
159 denoiser_prefilter_enum,
179 scene->
update_stats->integrator.times.add_entry({
"device_update", time});
183 KernelIntegrator *kintegrator = &dscene->
data.integrator;
188 kintegrator->min_bounce = min_bounce + 1;
189 kintegrator->max_bounce = max_bounce + 1;
191 kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
192 kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
193 kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
194 kintegrator->max_volume_bounce = max_volume_bounce + 1;
196 kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
197 kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
199 kintegrator->ao_bounces = (ao_factor != 0.0f) ? ao_bounces : 0;
200 kintegrator->ao_bounces_distance = ao_distance;
201 kintegrator->ao_bounces_factor = ao_factor;
202 kintegrator->ao_additive_factor = ao_additive_factor;
204#ifdef WITH_CYCLES_DEBUG
205 kintegrator->direct_light_sampling_type = direct_light_sampling_type;
214 kintegrator->transparent_shadows =
false;
220 kintegrator->transparent_shadows =
true;
225 kintegrator->volume_max_steps = volume_max_steps;
226 kintegrator->volume_step_rate = volume_step_rate;
228 kintegrator->caustics_reflective = caustics_reflective;
229 kintegrator->caustics_refractive = caustics_refractive;
230 kintegrator->filter_glossy = (filter_glossy == 0.0f) ?
FLT_MAX : 1.0f / filter_glossy;
232 kintegrator->filter_closures = 0;
233 if (!use_direct_light) {
236 if (!use_indirect_light) {
237 kintegrator->min_bounce = 1;
238 kintegrator->max_bounce = 1;
246 if (!use_transmission) {
259 kintegrator->use_guiding = guiding_params.
use;
260 kintegrator->train_guiding = kintegrator->use_guiding;
263 kintegrator->surface_guiding_probability = surface_guiding_probability;
264 kintegrator->volume_guiding_probability = volume_guiding_probability;
265 kintegrator->use_guiding_direct_light = use_guiding_direct_light;
266 kintegrator->use_guiding_mis_weights = use_guiding_mis_weights;
267 kintegrator->guiding_distribution_type = guiding_params.
type;
268 kintegrator->guiding_directional_sampling_type = guiding_params.
sampling_type;
271 kintegrator->sample_clamp_direct = (sample_clamp_direct == 0.0f) ?
FLT_MAX :
272 sample_clamp_direct * 3.0f;
273 kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f) ?
275 sample_clamp_indirect * 3.0f;
279 kintegrator->sampling_pattern = sampling_pattern;
280 kintegrator->scrambling_distance = scrambling_distance;
283 kintegrator->blue_noise_sequence_length = clamped_aa_samples;
291 kintegrator->blue_noise_sequence_length -= 1;
302 kintegrator->seed =
seed;
308 if (light_sampling_threshold > 0.0f && !kintegrator->use_light_tree) {
309 kintegrator->light_inv_rr_threshold = scene->
film->get_exposure() / light_sampling_threshold;
312 kintegrator->light_inv_rr_threshold = 0.0f;
316 const int sequence_size =
clamp(
322 kintegrator->tabulated_sobol_sequence_size = sequence_size;
330 float4 *sequence = directions + j * sequence_size;
331 pool.
push([sequence, sequence_size, j] {
static unsigned long seed