Blender V4.3
integrator.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 "device/device.h"
6
7#include "scene/background.h"
8#include "scene/bake.h"
9#include "scene/camera.h"
10#include "scene/film.h"
11#include "scene/integrator.h"
12#include "scene/light.h"
13#include "scene/object.h"
14#include "scene/scene.h"
15#include "scene/shader.h"
16#include "scene/stats.h"
18
19#include "kernel/types.h"
20
21#include "util/foreach.h"
22#include "util/hash.h"
23#include "util/log.h"
24#include "util/task.h"
25#include "util/time.h"
26
28
30{
31 NodeType *type = NodeType::add("integrator", create);
32
33 SOCKET_INT(min_bounce, "Min Bounce", 0);
34 SOCKET_INT(max_bounce, "Max Bounce", 7);
35
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);
40
41 SOCKET_INT(transparent_min_bounce, "Transparent Min Bounce", 0);
42 SOCKET_INT(transparent_max_bounce, "Transparent Max Bounce", 7);
43
44#ifdef WITH_CYCLES_DEBUG
45 static NodeEnum direct_light_sampling_type_enum;
46 direct_light_sampling_type_enum.insert("multiple_importance_sampling",
48 direct_light_sampling_type_enum.insert("forward_path_tracing", DIRECT_LIGHT_SAMPLING_FORWARD);
49 direct_light_sampling_type_enum.insert("next_event_estimation", DIRECT_LIGHT_SAMPLING_NEE);
50 SOCKET_ENUM(direct_light_sampling_type,
51 "Direct Light Sampling Type",
52 direct_light_sampling_type_enum,
54#endif
55
56 SOCKET_INT(ao_bounces, "AO Bounces", 0);
57 SOCKET_FLOAT(ao_factor, "AO Factor", 0.0f);
58 SOCKET_FLOAT(ao_distance, "AO Distance", FLT_MAX);
59 SOCKET_FLOAT(ao_additive_factor, "AO Additive Factor", 0.0f);
60
61 SOCKET_INT(volume_max_steps, "Volume Max Steps", 1024);
62 SOCKET_FLOAT(volume_step_rate, "Volume Step Rate", 1.0f);
63
64 static NodeEnum guiding_distribution_enum;
65 guiding_distribution_enum.insert("PARALLAX_AWARE_VMM", GUIDING_TYPE_PARALLAX_AWARE_VMM);
66 guiding_distribution_enum.insert("DIRECTIONAL_QUAD_TREE", GUIDING_TYPE_DIRECTIONAL_QUAD_TREE);
67 guiding_distribution_enum.insert("VMM", GUIDING_TYPE_VMM);
68
69 static NodeEnum guiding_directional_sampling_type_enum;
70 guiding_directional_sampling_type_enum.insert("MIS",
72 guiding_directional_sampling_type_enum.insert("RIS", GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS);
73 guiding_directional_sampling_type_enum.insert("ROUGHNESS",
75
76 SOCKET_BOOLEAN(use_guiding, "Guiding", false);
77 SOCKET_BOOLEAN(deterministic_guiding, "Deterministic Guiding", true);
78 SOCKET_BOOLEAN(use_surface_guiding, "Surface Guiding", true);
79 SOCKET_FLOAT(surface_guiding_probability, "Surface Guiding Probability", 0.5f);
80 SOCKET_BOOLEAN(use_volume_guiding, "Volume Guiding", true);
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);
84 SOCKET_BOOLEAN(use_guiding_mis_weights, "Use MIS Weights", true);
85 SOCKET_ENUM(guiding_distribution_type,
86 "Guiding Distribution Type",
87 guiding_distribution_enum,
89 SOCKET_ENUM(guiding_directional_sampling_type,
90 "Guiding Directional Sampling Type",
91 guiding_directional_sampling_type_enum,
93 SOCKET_FLOAT(guiding_roughness_threshold, "Guiding Roughness Threshold", 0.05f);
94
95 SOCKET_BOOLEAN(caustics_reflective, "Reflective Caustics", true);
96 SOCKET_BOOLEAN(caustics_refractive, "Refractive Caustics", true);
97 SOCKET_FLOAT(filter_glossy, "Filter Glossy", 0.0f);
98
99 SOCKET_BOOLEAN(use_direct_light, "Use Direct Light", true);
100 SOCKET_BOOLEAN(use_indirect_light, "Use Indirect Light", true);
101 SOCKET_BOOLEAN(use_diffuse, "Use Diffuse", true);
102 SOCKET_BOOLEAN(use_glossy, "Use Glossy", true);
103 SOCKET_BOOLEAN(use_transmission, "Use Transmission", true);
104 SOCKET_BOOLEAN(use_emission, "Use Emission", true);
105
106 SOCKET_INT(seed, "Seed", 0);
107 SOCKET_FLOAT(sample_clamp_direct, "Sample Clamp Direct", 0.0f);
108 SOCKET_FLOAT(sample_clamp_indirect, "Sample Clamp Indirect", 10.0f);
109 SOCKET_BOOLEAN(motion_blur, "Motion Blur", false);
110
111 SOCKET_INT(aa_samples, "AA Samples", 0);
112 SOCKET_INT(start_sample, "Start Sample", 0);
113
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);
117
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);
120
121 static NodeEnum sampling_pattern_enum;
122 sampling_pattern_enum.insert("sobol_burley", SAMPLING_PATTERN_SOBOL_BURLEY);
123 sampling_pattern_enum.insert("tabulated_sobol", SAMPLING_PATTERN_TABULATED_SOBOL);
124 sampling_pattern_enum.insert("blue_noise_pure", SAMPLING_PATTERN_BLUE_NOISE_PURE);
125 sampling_pattern_enum.insert("blue_noise_round", SAMPLING_PATTERN_BLUE_NOISE_ROUND);
126 sampling_pattern_enum.insert("blue_noise_first", SAMPLING_PATTERN_BLUE_NOISE_FIRST);
127 SOCKET_ENUM(sampling_pattern,
128 "Sampling Pattern",
129 sampling_pattern_enum,
131 SOCKET_FLOAT(scrambling_distance, "Scrambling Distance", 1.0f);
132
133 static NodeEnum denoiser_type_enum;
134 denoiser_type_enum.insert("optix", DENOISER_OPTIX);
135 denoiser_type_enum.insert("openimagedenoise", DENOISER_OPENIMAGEDENOISE);
136
137 static NodeEnum denoiser_prefilter_enum;
138 denoiser_prefilter_enum.insert("none", DENOISER_PREFILTER_NONE);
139 denoiser_prefilter_enum.insert("fast", DENOISER_PREFILTER_FAST);
140 denoiser_prefilter_enum.insert("accurate", DENOISER_PREFILTER_ACCURATE);
141
142 static NodeEnum denoiser_quality_enum;
143 denoiser_quality_enum.insert("high", DENOISER_QUALITY_HIGH);
144 denoiser_quality_enum.insert("balanced", DENOISER_QUALITY_BALANCED);
145 denoiser_quality_enum.insert("fast", DENOISER_QUALITY_FAST);
146
147 /* Default to accurate denoising with OpenImageDenoise. For interactive viewport
148 * it's best use OptiX and disable the normal pass since it does not always have
149 * the desired effect for that denoiser. */
150 SOCKET_BOOLEAN(use_denoise, "Use Denoiser", false);
151 SOCKET_ENUM(denoiser_type, "Denoiser Type", denoiser_type_enum, DENOISER_OPENIMAGEDENOISE);
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);
155 SOCKET_ENUM(denoiser_prefilter,
156 "Denoiser Prefilter",
157 denoiser_prefilter_enum,
159 SOCKET_BOOLEAN(denoise_use_gpu, "Denoise on GPU", true);
160 SOCKET_ENUM(denoiser_quality, "Denoiser Quality", denoiser_quality_enum, DENOISER_QUALITY_HIGH);
161
162 return type;
163}
164
165Integrator::Integrator() : Node(get_node_type()) {}
166
168
169void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene)
170{
171 if (!is_modified()) {
172 return;
173 }
174
175 scoped_callback_timer timer([scene](double time) {
176 if (scene->update_stats) {
177 scene->update_stats->integrator.times.add_entry({"device_update", time});
178 }
179 });
180
181 KernelIntegrator *kintegrator = &dscene->data.integrator;
182
183 device_free(device, dscene);
184
185 /* integrator parameters */
186 kintegrator->min_bounce = min_bounce + 1;
187 kintegrator->max_bounce = max_bounce + 1;
188
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;
193
194 kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
195 kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
196
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;
201
202#ifdef WITH_CYCLES_DEBUG
203 kintegrator->direct_light_sampling_type = direct_light_sampling_type;
204#else
205 kintegrator->direct_light_sampling_type = DIRECT_LIGHT_SAMPLING_MIS;
206#endif
207
208 /* Transparent Shadows
209 * We only need to enable transparent shadows, if we actually have
210 * transparent shaders in the scene. Otherwise we can disable it
211 * to improve performance a bit. */
212 kintegrator->transparent_shadows = false;
213 foreach (Shader *shader, scene->shaders) {
214 /* keep this in sync with SD_HAS_TRANSPARENT_SHADOW in shader.cpp */
215 if ((shader->has_surface_transparent && shader->get_use_transparent_shadow()) ||
216 shader->has_volume)
217 {
218 kintegrator->transparent_shadows = true;
219 break;
220 }
221 }
222
223 kintegrator->volume_max_steps = volume_max_steps;
224 kintegrator->volume_step_rate = volume_step_rate;
225
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;
229
230 kintegrator->filter_closures = 0;
231 if (!use_direct_light) {
232 kintegrator->filter_closures |= FILTER_CLOSURE_DIRECT_LIGHT;
233 }
234 if (!use_indirect_light) {
235 kintegrator->min_bounce = 1;
236 kintegrator->max_bounce = 1;
237 }
238 if (!use_diffuse) {
239 kintegrator->filter_closures |= FILTER_CLOSURE_DIFFUSE;
240 }
241 if (!use_glossy) {
242 kintegrator->filter_closures |= FILTER_CLOSURE_GLOSSY;
243 }
244 if (!use_transmission) {
245 kintegrator->filter_closures |= FILTER_CLOSURE_TRANSMISSION;
246 }
247 if (!use_emission) {
248 kintegrator->filter_closures |= FILTER_CLOSURE_EMISSION;
249 }
250 if (scene->bake_manager->get_baking()) {
251 /* Baking does not need to trace through transparency, we only want to bake
252 * the object itself. */
253 kintegrator->filter_closures |= FILTER_CLOSURE_TRANSPARENT;
254 }
255
256 GuidingParams guiding_params = get_guiding_params(device);
257 kintegrator->use_guiding = guiding_params.use;
258 kintegrator->train_guiding = kintegrator->use_guiding;
259 kintegrator->use_surface_guiding = guiding_params.use_surface_guiding;
260 kintegrator->use_volume_guiding = guiding_params.use_volume_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;
267 kintegrator->guiding_roughness_threshold = guiding_params.roughness_threshold;
268
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) ?
272 FLT_MAX :
273 sample_clamp_indirect * 3.0f;
274
275 kintegrator->sampling_pattern = sampling_pattern;
276 kintegrator->scrambling_distance = scrambling_distance;
277 kintegrator->sobol_index_mask = reverse_integer_bits(next_power_of_two(aa_samples - 1) - 1);
278 kintegrator->blue_noise_sequence_length = aa_samples;
279 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_ROUND) {
280 if (!is_power_of_two(aa_samples)) {
281 kintegrator->blue_noise_sequence_length = next_power_of_two(aa_samples);
282 }
283 kintegrator->sampling_pattern = SAMPLING_PATTERN_BLUE_NOISE_PURE;
284 }
285 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_FIRST) {
286 kintegrator->blue_noise_sequence_length -= 1;
287 }
288
289 /* The blue-noise sampler needs a randomized seed to scramble properly, providing e.g. 0 won't
290 * work properly. Therefore, hash the seed in those cases. */
291 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_FIRST ||
292 kintegrator->sampling_pattern == SAMPLING_PATTERN_BLUE_NOISE_PURE)
293 {
294 kintegrator->seed = hash_uint(seed);
295 }
296 else {
297 kintegrator->seed = seed;
298 }
299
300 /* NOTE: The kintegrator->use_light_tree is assigned to the efficient value in the light manager,
301 * and the synchronization code is expected to tag the light manager for update when the
302 * `use_light_tree` is changed. */
303 if (light_sampling_threshold > 0.0f && !kintegrator->use_light_tree) {
304 kintegrator->light_inv_rr_threshold = scene->film->get_exposure() / light_sampling_threshold;
305 }
306 else {
307 kintegrator->light_inv_rr_threshold = 0.0f;
308 }
309
310 /* Build pre-tabulated Sobol samples if needed. */
311 int sequence_size = clamp(
313 const int table_size = sequence_size * NUM_TAB_SOBOL_PATTERNS * NUM_TAB_SOBOL_DIMENSIONS;
314 if (kintegrator->sampling_pattern == SAMPLING_PATTERN_TABULATED_SOBOL &&
315 dscene->sample_pattern_lut.size() != table_size)
316 {
317 kintegrator->tabulated_sobol_sequence_size = sequence_size;
318
319 if (dscene->sample_pattern_lut.size() != 0) {
320 dscene->sample_pattern_lut.free();
321 }
322 float4 *directions = (float4 *)dscene->sample_pattern_lut.alloc(table_size);
324 for (int j = 0; j < NUM_TAB_SOBOL_PATTERNS; ++j) {
325 float4 *sequence = directions + j * sequence_size;
326 pool.push(function_bind(&tabulated_sobol_generate_4D, sequence, sequence_size, j));
327 }
328 pool.wait_work();
329
330 dscene->sample_pattern_lut.copy_to_device();
331 }
332
333 kintegrator->has_shadow_catcher = scene->has_shadow_catcher();
334
335 dscene->sample_pattern_lut.clear_modified();
336 clear_modified();
337}
338
339void Integrator::device_free(Device *, DeviceScene *dscene, bool force_free)
340{
341 dscene->sample_pattern_lut.free_if_need_realloc(force_free);
342}
343
345{
346 if (flag & UPDATE_ALL) {
347 tag_modified();
348 }
349
350 if (flag & AO_PASS_MODIFIED) {
351 /* tag only the ao_bounces socket as modified so we avoid updating sample_pattern_lut
352 * unnecessarily */
353 tag_ao_bounces_modified();
354 }
355
356 if (motion_blur_is_modified()) {
357 scene->object_manager->tag_update(scene, ObjectManager::MOTION_BLUR_MODIFIED);
358 scene->camera->tag_modified();
359 }
360}
361
363{
364 uint kernel_features = 0;
365
366 if (ao_additive_factor != 0.0f) {
367 kernel_features |= KERNEL_FEATURE_AO_ADDITIVE;
368 }
369
370 if (get_use_light_tree()) {
371 kernel_features |= KERNEL_FEATURE_LIGHT_TREE;
372 }
373
374 return kernel_features;
375}
376
378{
379 AdaptiveSampling adaptive_sampling;
380
381 adaptive_sampling.use = use_adaptive_sampling;
382
383 if (!adaptive_sampling.use) {
384 return adaptive_sampling;
385 }
386
387 if (aa_samples > 0 && adaptive_threshold == 0.0f) {
388 adaptive_sampling.threshold = max(0.001f, 1.0f / (float)aa_samples);
389 VLOG_INFO << "Cycles adaptive sampling: automatic threshold = " << adaptive_sampling.threshold;
390 }
391 else {
392 adaptive_sampling.threshold = adaptive_threshold;
393 }
394
395 if (adaptive_sampling.threshold > 0 && adaptive_min_samples == 0) {
396 /* Threshold 0.1 -> 32, 0.01 -> 64, 0.001 -> 128.
397 * This is highly scene dependent, we make a guess that seemed to work well
398 * in various test scenes. */
399 const int min_samples = (int)ceilf(16.0f / powf(adaptive_sampling.threshold, 0.3f));
400 adaptive_sampling.min_samples = max(4, min_samples);
401 VLOG_INFO << "Cycles adaptive sampling: automatic min samples = "
402 << adaptive_sampling.min_samples;
403 }
404 else {
405 adaptive_sampling.min_samples = max(4, adaptive_min_samples);
406 }
407
408 /* Arbitrary factor that makes the threshold more similar to what is was before,
409 * and gives arguably more intuitive values. */
410 adaptive_sampling.threshold *= 5.0f;
411
412 adaptive_sampling.adaptive_step = 16;
413
414 DCHECK(is_power_of_two(adaptive_sampling.adaptive_step))
415 << "Adaptive step must be a power of two for bitwise operations to work";
416
417 return adaptive_sampling;
418}
419
421{
422 DenoiseParams denoise_params;
423
424 denoise_params.use = use_denoise;
425
426 denoise_params.type = denoiser_type;
427
428 denoise_params.use_gpu = denoise_use_gpu;
429
430 denoise_params.start_sample = denoise_start_sample;
431
432 denoise_params.use_pass_albedo = use_denoise_pass_albedo;
433 denoise_params.use_pass_normal = use_denoise_pass_normal;
434
435 denoise_params.prefilter = denoiser_prefilter;
436 denoise_params.quality = denoiser_quality;
437
438 return denoise_params;
439}
440
442{
443 const bool use = use_guiding && device->info.has_guiding;
444
445 GuidingParams guiding_params;
446 guiding_params.use_surface_guiding = use && use_surface_guiding &&
447 surface_guiding_probability > 0.0f;
448 guiding_params.use_volume_guiding = use && use_volume_guiding &&
449 volume_guiding_probability > 0.0f;
450 guiding_params.use = guiding_params.use_surface_guiding || guiding_params.use_volume_guiding;
451 guiding_params.type = guiding_distribution_type;
452 guiding_params.training_samples = guiding_training_samples;
453 guiding_params.deterministic = deterministic_guiding;
454 guiding_params.sampling_type = guiding_directional_sampling_type;
455 // In Blender/Cycles the user set roughness is squared to behave more linear.
456 guiding_params.roughness_threshold = guiding_roughness_threshold * guiding_roughness_threshold;
457 return guiding_params;
458}
unsigned int uint
static unsigned long seed
Definition btSoftBody.h:39
DenoiserType type
Definition denoise.h:61
DenoiserQuality quality
Definition denoise.h:78
bool use_gpu
Definition denoise.h:75
int start_sample
Definition denoise.h:64
DenoiserPrefilter prefilter
Definition denoise.h:77
NODE_DECLARE bool use
Definition denoise.h:58
bool use_pass_normal
Definition denoise.h:68
bool use_pass_albedo
Definition denoise.h:67
device_vector< float > sample_pattern_lut
Definition devicescene.h:90
DeviceInfo info
void tag_update(Scene *scene, uint32_t flag)
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
DenoiseParams get_denoise_params() const
AdaptiveSampling get_adaptive_sampling() const
void device_free(Device *device, DeviceScene *dscene, bool force_free=false)
GuidingParams get_guiding_params(const Device *device) const
uint get_kernel_features() const
void free_if_need_realloc(bool force_free)
@ DENOISER_QUALITY_FAST
Definition denoise.h:46
@ DENOISER_QUALITY_BALANCED
Definition denoise.h:45
@ DENOISER_QUALITY_HIGH
Definition denoise.h:44
@ DENOISER_PREFILTER_FAST
Definition denoise.h:34
@ DENOISER_PREFILTER_NONE
Definition denoise.h:30
@ DENOISER_PREFILTER_ACCURATE
Definition denoise.h:38
@ DENOISER_OPTIX
Definition denoise.h:14
@ DENOISER_OPENIMAGEDENOISE
Definition denoise.h:15
#define function_bind
#define powf(x, y)
#define CCL_NAMESPACE_END
#define ceilf(x)
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
ccl_device_inline uint hash_uint(uint kx)
Definition hash.h:78
#define KERNEL_FEATURE_LIGHT_TREE
@ FILTER_CLOSURE_EMISSION
@ FILTER_CLOSURE_GLOSSY
@ FILTER_CLOSURE_DIFFUSE
@ FILTER_CLOSURE_TRANSPARENT
@ FILTER_CLOSURE_DIRECT_LIGHT
@ FILTER_CLOSURE_TRANSMISSION
#define MIN_TAB_SOBOL_SAMPLES
#define NUM_TAB_SOBOL_DIMENSIONS
@ DIRECT_LIGHT_SAMPLING_MIS
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
#define MAX_TAB_SOBOL_SAMPLES
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_PRODUCT_MIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_RIS
@ GUIDING_DIRECTIONAL_SAMPLING_TYPE_ROUGHNESS
@ SAMPLING_PATTERN_BLUE_NOISE_FIRST
@ SAMPLING_PATTERN_TABULATED_SOBOL
@ SAMPLING_PATTERN_BLUE_NOISE_PURE
@ SAMPLING_PATTERN_SOBOL_BURLEY
@ SAMPLING_PATTERN_BLUE_NOISE_ROUND
#define NUM_TAB_SOBOL_PATTERNS
#define KERNEL_FEATURE_AO_ADDITIVE
@ GUIDING_TYPE_VMM
@ GUIDING_TYPE_DIRECTIONAL_QUAD_TREE
@ GUIDING_TYPE_PARALLAX_AWARE_VMM
#define VLOG_INFO
Definition log.h:72
#define DCHECK(expression)
Definition log.h:51
VecBase< float, 4 > float4
#define SOCKET_FLOAT(name, ui_name, default_value,...)
Definition node_type.h:200
#define SOCKET_INT(name, ui_name, default_value,...)
Definition node_type.h:194
#define NODE_DEFINE(structname)
Definition node_type.h:148
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
Definition node_type.h:192
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
Definition node_type.h:216
#define FLT_MAX
Definition stdcycles.h:14
unsigned int uint32_t
Definition stdint.h:80
GuidingDirectionalSamplingType sampling_type
GuidingDistributionType type
void insert(const char *x, int y)
Definition node_enum.h:21
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
void tag_modified()
bool is_modified() const
void push(TaskRunFunction &&task)
Definition task.cpp:22
void wait_work(Summary *stats=NULL)
Definition task.cpp:28
CCL_NAMESPACE_BEGIN void tabulated_sobol_generate_4D(float4 points[], int size, int rng_seed)
float max
ccl_device_inline uint32_t reverse_integer_bits(uint32_t x)
Definition util/math.h:1016
ccl_device_inline uint next_power_of_two(uint x)
Definition util/math.h:1000
ccl_device_inline int clamp(int a, int mn, int mx)
Definition util/math.h:379
ccl_device_inline bool is_power_of_two(size_t x)
Definition util/types.h:68
wmTimer * timer
uint8_t flag
Definition wm_window.cc:138