47 SOCKET_INT(max_diffuse_bounce,
"Max Diffuse Bounce", 7);
48 SOCKET_INT(max_glossy_bounce,
"Max Glossy Bounce", 7);
49 SOCKET_INT(max_transmission_bounce,
"Max Transmission Bounce", 7);
50 SOCKET_INT(max_volume_bounce,
"Max Volume Bounce", 7);
52 SOCKET_INT(transparent_min_bounce,
"Transparent Min Bounce", 0);
53 SOCKET_INT(transparent_max_bounce,
"Transparent Max Bounce", 7);
57 SOCKET_INT(volume_max_steps,
"Volume Max Steps", 1024);
58 SOCKET_FLOAT(volume_step_rate,
"Volume Step Rate", 1.0f);
64 SOCKET_FLOAT(sample_clamp_direct,
"Sample Clamp Direct", 0.0f);
65 SOCKET_FLOAT(sample_clamp_indirect,
"Sample Clamp Indirect", 0.0f);
69 SOCKET_INT(diffuse_samples,
"Diffuse Samples", 1);
70 SOCKET_INT(glossy_samples,
"Glossy Samples", 1);
71 SOCKET_INT(transmission_samples,
"Transmission Samples", 1);
73 SOCKET_INT(mesh_light_samples,
"Mesh Light Samples", 1);
74 SOCKET_INT(subsurface_samples,
"Subsurface Samples", 1);
75 SOCKET_INT(volume_samples,
"Volume Samples", 1);
78 SOCKET_FLOAT(adaptive_threshold,
"Adaptive Threshold", 0.0f);
79 SOCKET_INT(adaptive_min_samples,
"Adaptive Min Samples", 0);
81 SOCKET_BOOLEAN(sample_all_lights_direct,
"Sample All Lights Direct",
true);
82 SOCKET_BOOLEAN(sample_all_lights_indirect,
"Sample All Lights Indirect",
true);
83 SOCKET_FLOAT(light_sampling_threshold,
"Light Sampling Threshold", 0.05f);
86 method_enum.
insert(
"path", PATH);
87 method_enum.
insert(
"branched_path", BRANCHED_PATH);
90 static NodeEnum sampling_pattern_enum;
114 scene->update_stats->integrator.times.add_entry({
"device_update", time});
118 const bool need_update_lut = ao_samples_is_modified() || diffuse_samples_is_modified() ||
119 glossy_samples_is_modified() || max_bounce_is_modified() ||
120 max_transmission_bounce_is_modified() ||
121 mesh_light_samples_is_modified() || method_is_modified() ||
122 sampling_pattern_is_modified() ||
123 subsurface_samples_is_modified() ||
124 transmission_samples_is_modified() || volume_samples_is_modified();
126 if (need_update_lut) {
127 dscene->sample_pattern_lut.tag_realloc();
130 device_free(device, dscene);
146 if (ao_bounces == 0) {
160 if ((
shader->has_surface_transparent &&
shader->get_use_transparent_shadow()) ||
172 kintegrator->
filter_glossy = (filter_glossy == 0.0f) ? FLT_MAX : 1.0f / filter_glossy;
177 dscene->data.background.ao_factor != 0.0f);
180 sample_clamp_direct * 3.0f;
183 sample_clamp_indirect * 3.0f;
185 kintegrator->
branched = (method == BRANCHED_PATH) && device->info.has_branched_path;
207 if (
aa_samples > 0 && adaptive_min_samples == 0) {
209 VLOG(1) <<
"Cycles adaptive sampling: automatic min samples = "
222 if (
aa_samples > 0 && adaptive_threshold == 0.0f) {
224 VLOG(1) <<
"Cycles adaptive sampling: automatic threshold = "
231 if (light_sampling_threshold > 0.0f) {
243 max_samples =
max(max_samples, light->get_samples());
245 max_samples =
max(max_samples,
246 max(diffuse_samples,
max(glossy_samples, transmission_samples)));
247 max_samples =
max(max_samples,
max(ao_samples,
max(mesh_light_samples, subsurface_samples)));
248 max_samples =
max(max_samples, volume_samples);
254 max_samples *= total_bounces;
259 if (need_update_lut) {
261 uint *directions = dscene->sample_pattern_lut.alloc(
SOBOL_BITS * dimensions);
265 dscene->sample_pattern_lut.copy_to_device();
270 float2 *directions = (
float2 *)dscene->sample_pattern_lut.alloc(sequence_size *
273 for (
int j = 0; j < num_sequences; ++j) {
274 float2 *sequence = directions + j * sequence_size;
279 dscene->sample_pattern_lut.copy_to_device();
283 dscene->sample_pattern_lut.clear_modified();
301 tag_ao_bounces_modified();
306 tag_sampling_pattern_modified();
309 if (filter_glossy_is_modified()) {
311 if (
shader->has_integrator_dependency) {
318 if (motion_blur_is_modified()) {
_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 CCL_NAMESPACE_BEGIN int aa_samples(Scene *scene, Object *object, ShaderEvalType type)
static unsigned long seed
device_vector< uint > sample_pattern_lut
void tag_update(Scene *scene, uint32_t flag)
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
void device_free(Device *device, DeviceScene *dscene, bool force_free=false)
void tag_update(Scene *scene, uint32_t flag)
static bool contains(const vector< Pass > &passes, PassType)
void tag_update(Scene *scene, uint32_t flag)
void free_if_need_realloc(bool force_free)
CCL_NAMESPACE_BEGIN NODE_DEFINE(Integrator)
void progressive_multi_jitter_02_generate_2D(float2 points[], int size, int rng_seed)
#define CCL_NAMESPACE_END
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
#define VOLUME_BOUNDS_MAX
#define BSSRDF_MAX_BOUNCES
#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,...)
void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions)
#define SOBOL_MAX_DIMENSIONS
float sample_clamp_indirect
int transparent_max_bounce
int use_ambient_occlusion
int adaptive_stop_per_sample
int sample_all_lights_indirect
float light_inv_rr_threshold
int sample_all_lights_direct
int transparent_min_bounce
int max_transmission_bounce
float sample_clamp_direct
void insert(const char *x, int y)
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
vector< Shader * > shaders
ObjectManager * object_manager
ShaderManager * shader_manager
SceneUpdateStats * update_stats
void push(TaskRunFunction &&task)
void wait_work(Summary *stats=NULL)
ccl_device_inline uint hash_uint2(uint kx, uint ky)