36 SOCKET_INT(max_diffuse_bounce,
"Max Diffuse Bounce", 7);
37 SOCKET_INT(max_glossy_bounce,
"Max Glossy Bounce", 7);
38 SOCKET_INT(max_transmission_bounce,
"Max Transmission Bounce", 7);
39 SOCKET_INT(max_volume_bounce,
"Max Volume Bounce", 7);
41 SOCKET_INT(transparent_min_bounce,
"Transparent Min Bounce", 0);
42 SOCKET_INT(transparent_max_bounce,
"Transparent Max Bounce", 7);
44#ifdef WITH_CYCLES_DEBUG
45 static NodeEnum direct_light_sampling_type_enum;
46 direct_light_sampling_type_enum.
insert(
"multiple_importance_sampling",
51 "Direct Light Sampling Type",
52 direct_light_sampling_type_enum,
59 SOCKET_FLOAT(ao_additive_factor,
"AO Additive Factor", 0.0f);
61 SOCKET_INT(volume_max_steps,
"Volume Max Steps", 1024);
62 SOCKET_FLOAT(volume_step_rate,
"Volume Step Rate", 1.0f);
64 static NodeEnum guiding_distribution_enum;
69 static NodeEnum guiding_directional_sampling_type_enum;
70 guiding_directional_sampling_type_enum.
insert(
"MIS",
73 guiding_directional_sampling_type_enum.
insert(
"ROUGHNESS",
77 SOCKET_BOOLEAN(deterministic_guiding,
"Deterministic Guiding",
true);
79 SOCKET_FLOAT(surface_guiding_probability,
"Surface Guiding Probability", 0.5f);
81 SOCKET_FLOAT(volume_guiding_probability,
"Volume Guiding Probability", 0.5f);
82 SOCKET_INT(guiding_training_samples,
"Training Samples", 128);
83 SOCKET_BOOLEAN(use_guiding_direct_light,
"Guide Direct Light",
true);
86 "Guiding Distribution Type",
87 guiding_distribution_enum,
90 "Guiding Directional Sampling Type",
91 guiding_directional_sampling_type_enum,
93 SOCKET_FLOAT(guiding_roughness_threshold,
"Guiding Roughness Threshold", 0.05f);
107 SOCKET_FLOAT(sample_clamp_direct,
"Sample Clamp Direct", 0.0f);
108 SOCKET_FLOAT(sample_clamp_indirect,
"Sample Clamp Indirect", 10.0f);
114 SOCKET_BOOLEAN(use_adaptive_sampling,
"Use Adaptive Sampling",
true);
115 SOCKET_FLOAT(adaptive_threshold,
"Adaptive Threshold", 0.01f);
116 SOCKET_INT(adaptive_min_samples,
"Adaptive Min Samples", 0);
118 SOCKET_BOOLEAN(use_light_tree,
"Use light tree to optimize many light sampling",
true);
119 SOCKET_FLOAT(light_sampling_threshold,
"Light Sampling Threshold", 0.0f);
121 static NodeEnum sampling_pattern_enum;
129 sampling_pattern_enum,
131 SOCKET_FLOAT(scrambling_distance,
"Scrambling Distance", 1.0f);
137 static NodeEnum denoiser_prefilter_enum;
142 static NodeEnum denoiser_quality_enum;
152 SOCKET_INT(denoise_start_sample,
"Start Sample to Denoise", 0);
153 SOCKET_BOOLEAN(use_denoise_pass_albedo,
"Use Albedo Pass for Denoiser",
true);
154 SOCKET_BOOLEAN(use_denoise_pass_normal,
"Use Normal Pass for Denoiser",
true);
156 "Denoiser Prefilter",
157 denoiser_prefilter_enum,
176 if (scene->update_stats) {
177 scene->update_stats->integrator.times.add_entry({
"device_update", time});
181 KernelIntegrator *kintegrator = &dscene->data.integrator;
183 device_free(device, dscene);
186 kintegrator->min_bounce = min_bounce + 1;
187 kintegrator->max_bounce = max_bounce + 1;
189 kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
190 kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
191 kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
192 kintegrator->max_volume_bounce = max_volume_bounce + 1;
194 kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
195 kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
197 kintegrator->ao_bounces = (ao_factor != 0.0f) ? ao_bounces : 0;
198 kintegrator->ao_bounces_distance = ao_distance;
199 kintegrator->ao_bounces_factor = ao_factor;
200 kintegrator->ao_additive_factor = ao_additive_factor;
202#ifdef WITH_CYCLES_DEBUG
203 kintegrator->direct_light_sampling_type = direct_light_sampling_type;
212 kintegrator->transparent_shadows =
false;
213 foreach (
Shader *shader, scene->shaders) {
215 if ((shader->has_surface_transparent && shader->get_use_transparent_shadow()) ||
218 kintegrator->transparent_shadows =
true;
223 kintegrator->volume_max_steps = volume_max_steps;
224 kintegrator->volume_step_rate = volume_step_rate;
226 kintegrator->caustics_reflective = caustics_reflective;
227 kintegrator->caustics_refractive = caustics_refractive;
228 kintegrator->filter_glossy = (filter_glossy == 0.0f) ?
FLT_MAX : 1.0f / filter_glossy;
230 kintegrator->filter_closures = 0;
231 if (!use_direct_light) {
234 if (!use_indirect_light) {
235 kintegrator->min_bounce = 1;
236 kintegrator->max_bounce = 1;
244 if (!use_transmission) {
250 if (scene->bake_manager->get_baking()) {
257 kintegrator->use_guiding = guiding_params.
use;
258 kintegrator->train_guiding = kintegrator->use_guiding;
261 kintegrator->surface_guiding_probability = surface_guiding_probability;
262 kintegrator->volume_guiding_probability = volume_guiding_probability;
263 kintegrator->use_guiding_direct_light = use_guiding_direct_light;
264 kintegrator->use_guiding_mis_weights = use_guiding_mis_weights;
265 kintegrator->guiding_distribution_type = guiding_params.
type;
266 kintegrator->guiding_directional_sampling_type = guiding_params.
sampling_type;
269 kintegrator->sample_clamp_direct = (sample_clamp_direct == 0.0f) ?
FLT_MAX :
270 sample_clamp_direct * 3.0f;
271 kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f) ?
273 sample_clamp_indirect * 3.0f;
275 kintegrator->sampling_pattern = sampling_pattern;
276 kintegrator->scrambling_distance = scrambling_distance;
278 kintegrator->blue_noise_sequence_length = aa_samples;
286 kintegrator->blue_noise_sequence_length -= 1;
297 kintegrator->seed =
seed;
303 if (light_sampling_threshold > 0.0f && !kintegrator->use_light_tree) {
304 kintegrator->light_inv_rr_threshold = scene->film->get_exposure() / light_sampling_threshold;
307 kintegrator->light_inv_rr_threshold = 0.0f;
311 int sequence_size =
clamp(
315 dscene->sample_pattern_lut.size() != table_size)
317 kintegrator->tabulated_sobol_sequence_size = sequence_size;
319 if (dscene->sample_pattern_lut.size() != 0) {
320 dscene->sample_pattern_lut.free();
322 float4 *directions = (
float4 *)dscene->sample_pattern_lut.alloc(table_size);
325 float4 *sequence = directions + j * sequence_size;
330 dscene->sample_pattern_lut.copy_to_device();
333 kintegrator->has_shadow_catcher = scene->has_shadow_catcher();
335 dscene->sample_pattern_lut.clear_modified();
static unsigned long seed