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);
76 SOCKET_FLOAT(sample_clamp_direct,
"Sample Clamp Direct", 0.0f);
77 SOCKET_FLOAT(sample_clamp_indirect,
"Sample Clamp Indirect", 10.0f);
83 SOCKET_BOOLEAN(use_adaptive_sampling,
"Use Adaptive Sampling",
true);
84 SOCKET_FLOAT(adaptive_threshold,
"Adaptive Threshold", 0.01f);
85 SOCKET_INT(adaptive_min_samples,
"Adaptive Min Samples", 0);
87 SOCKET_FLOAT(light_sampling_threshold,
"Light Sampling Threshold", 0.01f);
89 static NodeEnum sampling_pattern_enum;
93 SOCKET_FLOAT(scrambling_distance,
"Scrambling Distance", 1.0f);
99 static NodeEnum denoiser_prefilter_enum;
109 SOCKET_INT(denoise_start_sample,
"Start Sample to Denoise", 0);
110 SOCKET_BOOLEAN(use_denoise_pass_albedo,
"Use Albedo Pass for Denoiser",
true);
111 SOCKET_BOOLEAN(use_denoise_pass_normal,
"Use Normal Pass for Denoiser",
true);
113 "Denoiser Prefilter",
114 denoiser_prefilter_enum,
135 scene->update_stats->integrator.times.add_entry({
"device_update", time});
139 KernelIntegrator *kintegrator = &dscene->data.integrator;
150 const bool need_update_lut = max_bounce_is_modified() || max_transmission_bounce_is_modified() ||
151 dscene->sample_pattern_lut.size() == 0 ||
152 kintegrator->sampling_pattern != new_sampling_pattern;
154 if (need_update_lut) {
155 dscene->sample_pattern_lut.tag_realloc();
158 device_free(device, dscene);
161 kintegrator->min_bounce = min_bounce + 1;
162 kintegrator->max_bounce = max_bounce + 1;
164 kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
165 kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
166 kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
167 kintegrator->max_volume_bounce = max_volume_bounce + 1;
169 kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
170 kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
172 kintegrator->ao_bounces = (ao_factor != 0.0f) ? ao_bounces : 0;
173 kintegrator->ao_bounces_distance = ao_distance;
174 kintegrator->ao_bounces_factor = ao_factor;
175 kintegrator->ao_additive_factor = ao_additive_factor;
177 #ifdef WITH_CYCLES_DEBUG
178 kintegrator->direct_light_sampling_type = direct_light_sampling_type;
187 kintegrator->transparent_shadows =
false;
192 kintegrator->transparent_shadows =
true;
197 kintegrator->volume_max_steps = volume_max_steps;
198 kintegrator->volume_step_rate = volume_step_rate;
200 kintegrator->caustics_reflective = caustics_reflective;
201 kintegrator->caustics_refractive = caustics_refractive;
202 kintegrator->filter_glossy = (filter_glossy == 0.0f) ? FLT_MAX : 1.0f / filter_glossy;
204 kintegrator->filter_closures = 0;
205 if (!use_direct_light) {
208 if (!use_indirect_light) {
209 kintegrator->min_bounce = 1;
210 kintegrator->max_bounce = 1;
218 if (!use_transmission) {
230 kintegrator->seed =
seed;
232 kintegrator->sample_clamp_direct = (sample_clamp_direct == 0.0f) ? FLT_MAX :
233 sample_clamp_direct * 3.0f;
234 kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f) ?
236 sample_clamp_indirect * 3.0f;
238 kintegrator->sampling_pattern = new_sampling_pattern;
239 kintegrator->scrambling_distance = scrambling_distance;
241 if (light_sampling_threshold > 0.0f) {
242 kintegrator->light_inv_rr_threshold = 1.0f / light_sampling_threshold;
245 kintegrator->light_inv_rr_threshold = 0.0f;
255 if (need_update_lut) {
261 dscene->sample_pattern_lut.copy_to_device();
266 float2 *directions = (
float2 *)dscene->sample_pattern_lut.alloc(sequence_size *
269 for (
int j = 0; j < num_sequences; ++j) {
270 float2 *sequence = directions + j * sequence_size;
276 dscene->sample_pattern_lut.copy_to_device();
282 dscene->sample_pattern_lut.clear_modified();
300 tag_ao_bounces_modified();
303 if (filter_glossy_is_modified()) {
312 if (motion_blur_is_modified()) {
320 uint kernel_features = 0;
322 if (ao_additive_factor != 0.0f) {
326 return kernel_features;
333 adaptive_sampling.
use = use_adaptive_sampling;
335 if (!adaptive_sampling.
use) {
336 return adaptive_sampling;
339 if (aa_samples > 0 && adaptive_threshold == 0.0f) {
340 adaptive_sampling.
threshold =
max(0.001f, 1.0f / (
float)aa_samples);
341 VLOG_INFO <<
"Cycles adaptive sampling: automatic threshold = " << adaptive_sampling.
threshold;
344 adaptive_sampling.
threshold = adaptive_threshold;
347 if (adaptive_sampling.
threshold > 0 && adaptive_min_samples == 0) {
353 VLOG_INFO <<
"Cycles adaptive sampling: automatic min samples = "
367 <<
"Adaptive step must be a power of two for bitwise operations to work";
369 return adaptive_sampling;
376 denoise_params.
use = use_denoise;
378 denoise_params.
type = denoiser_type;
385 denoise_params.
prefilter = denoiser_prefilter;
387 return denoise_params;
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
static unsigned long seed
DenoiserPrefilter prefilter
device_vector< float > sample_pattern_lut
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)
uint get_kernel_features() const
void tag_update(Scene *scene, uint32_t flag)
void tag_update(Scene *scene, uint32_t flag)
bool has_integrator_dependency
bool has_surface_transparent
void free_if_need_realloc(bool force_free)
#define CCL_NAMESPACE_END
@ DENOISER_PREFILTER_FAST
@ DENOISER_PREFILTER_NONE
@ DENOISER_PREFILTER_ACCURATE
@ DENOISER_OPENIMAGEDENOISE
CCL_NAMESPACE_BEGIN NODE_DEFINE(Integrator)
void progressive_multi_jitter_02_generate_2D(float2 points[], int size, int rng_seed)
@ FILTER_CLOSURE_EMISSION
@ FILTER_CLOSURE_TRANSPARENT
@ FILTER_CLOSURE_DIRECT_LIGHT
@ FILTER_CLOSURE_TRANSMISSION
#define VOLUME_BOUNDS_MAX
@ DIRECT_LIGHT_SAMPLING_MIS
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
@ KERNEL_FEATURE_AO_ADDITIVE
#define BSSRDF_MAX_BOUNCES
#define DCHECK(expression)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRefNull prop_name, int32_t value)
Allocate a new IDProperty of type IDP_INT, set its name and value.
#define SOCKET_FLOAT(name, ui_name, default_value,...)
#define SOCKET_INT(name, ui_name, default_value,...)
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
CCL_NAMESPACE_BEGIN void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions)
#define SOBOL_MAX_DIMENSIONS
void insert(const char *x, int y)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
BakeManager * bake_manager
vector< Shader * > shaders
ObjectManager * object_manager
bool has_shadow_catcher()
ShaderManager * shader_manager
SceneUpdateStats * update_stats
void push(TaskRunFunction &&task)
void wait_work(Summary *stats=NULL)
ccl_device_inline bool is_power_of_two(size_t x)