Blender  V2.93
integrator.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "render/integrator.h"
18 #include "device/device.h"
19 #include "render/background.h"
20 #include "render/camera.h"
21 #include "render/film.h"
22 #include "render/jitter.h"
23 #include "render/light.h"
24 #include "render/object.h"
25 #include "render/scene.h"
26 #include "render/shader.h"
27 #include "render/sobol.h"
28 #include "render/stats.h"
29 
30 #include "kernel/kernel_types.h"
31 
32 #include "util/util_foreach.h"
33 #include "util/util_hash.h"
34 #include "util/util_logging.h"
35 #include "util/util_task.h"
36 #include "util/util_time.h"
37 
39 
41 {
42  NodeType *type = NodeType::add("integrator", create);
43 
44  SOCKET_INT(min_bounce, "Min Bounce", 0);
45  SOCKET_INT(max_bounce, "Max Bounce", 7);
46 
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);
51 
52  SOCKET_INT(transparent_min_bounce, "Transparent Min Bounce", 0);
53  SOCKET_INT(transparent_max_bounce, "Transparent Max Bounce", 7);
54 
55  SOCKET_INT(ao_bounces, "AO Bounces", 0);
56 
57  SOCKET_INT(volume_max_steps, "Volume Max Steps", 1024);
58  SOCKET_FLOAT(volume_step_rate, "Volume Step Rate", 1.0f);
59 
60  SOCKET_BOOLEAN(caustics_reflective, "Reflective Caustics", true);
61  SOCKET_BOOLEAN(caustics_refractive, "Refractive Caustics", true);
62  SOCKET_FLOAT(filter_glossy, "Filter Glossy", 0.0f);
63  SOCKET_INT(seed, "Seed", 0);
64  SOCKET_FLOAT(sample_clamp_direct, "Sample Clamp Direct", 0.0f);
65  SOCKET_FLOAT(sample_clamp_indirect, "Sample Clamp Indirect", 0.0f);
66  SOCKET_BOOLEAN(motion_blur, "Motion Blur", false);
67 
68  SOCKET_INT(aa_samples, "AA Samples", 0);
69  SOCKET_INT(diffuse_samples, "Diffuse Samples", 1);
70  SOCKET_INT(glossy_samples, "Glossy Samples", 1);
71  SOCKET_INT(transmission_samples, "Transmission Samples", 1);
72  SOCKET_INT(ao_samples, "AO 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);
76  SOCKET_INT(start_sample, "Start Sample", 0);
77 
78  SOCKET_FLOAT(adaptive_threshold, "Adaptive Threshold", 0.0f);
79  SOCKET_INT(adaptive_min_samples, "Adaptive Min Samples", 0);
80 
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);
84 
85  static NodeEnum method_enum;
86  method_enum.insert("path", PATH);
87  method_enum.insert("branched_path", BRANCHED_PATH);
88  SOCKET_ENUM(method, "Method", method_enum, PATH);
89 
90  static NodeEnum sampling_pattern_enum;
91  sampling_pattern_enum.insert("sobol", SAMPLING_PATTERN_SOBOL);
92  sampling_pattern_enum.insert("cmj", SAMPLING_PATTERN_CMJ);
93  sampling_pattern_enum.insert("pmj", SAMPLING_PATTERN_PMJ);
94  SOCKET_ENUM(sampling_pattern, "Sampling Pattern", sampling_pattern_enum, SAMPLING_PATTERN_SOBOL);
95 
96  return type;
97 }
98 
99 Integrator::Integrator() : Node(get_node_type())
100 {
101 }
102 
104 {
105 }
106 
108 {
109  if (!is_modified())
110  return;
111 
112  scoped_callback_timer timer([scene](double time) {
113  if (scene->update_stats) {
114  scene->update_stats->integrator.times.add_entry({"device_update", time});
115  }
116  });
117 
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();
125 
126  if (need_update_lut) {
127  dscene->sample_pattern_lut.tag_realloc();
128  }
129 
130  device_free(device, dscene);
131 
132  KernelIntegrator *kintegrator = &dscene->data.integrator;
133 
134  /* integrator parameters */
135  kintegrator->min_bounce = min_bounce + 1;
136  kintegrator->max_bounce = max_bounce + 1;
137 
138  kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
139  kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
140  kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
141  kintegrator->max_volume_bounce = max_volume_bounce + 1;
142 
143  kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
144  kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
145 
146  if (ao_bounces == 0) {
147  kintegrator->ao_bounces = INT_MAX;
148  }
149  else {
150  kintegrator->ao_bounces = ao_bounces - 1;
151  }
152 
153  /* Transparent Shadows
154  * We only need to enable transparent shadows, if we actually have
155  * transparent shaders in the scene. Otherwise we can disable it
156  * to improve performance a bit. */
157  kintegrator->transparent_shadows = false;
158  foreach (Shader *shader, scene->shaders) {
159  /* keep this in sync with SD_HAS_TRANSPARENT_SHADOW in shader.cpp */
160  if ((shader->has_surface_transparent && shader->get_use_transparent_shadow()) ||
161  shader->has_volume) {
162  kintegrator->transparent_shadows = true;
163  break;
164  }
165  }
166 
167  kintegrator->volume_max_steps = volume_max_steps;
168  kintegrator->volume_step_rate = volume_step_rate;
169 
170  kintegrator->caustics_reflective = caustics_reflective;
171  kintegrator->caustics_refractive = caustics_refractive;
172  kintegrator->filter_glossy = (filter_glossy == 0.0f) ? FLT_MAX : 1.0f / filter_glossy;
173 
174  kintegrator->seed = hash_uint2(seed, 0);
175 
177  dscene->data.background.ao_factor != 0.0f);
178 
179  kintegrator->sample_clamp_direct = (sample_clamp_direct == 0.0f) ? FLT_MAX :
180  sample_clamp_direct * 3.0f;
181  kintegrator->sample_clamp_indirect = (sample_clamp_indirect == 0.0f) ?
182  FLT_MAX :
183  sample_clamp_indirect * 3.0f;
184 
185  kintegrator->branched = (method == BRANCHED_PATH) && device->info.has_branched_path;
186  kintegrator->volume_decoupled = device->info.has_volume_decoupled;
187  kintegrator->diffuse_samples = diffuse_samples;
188  kintegrator->glossy_samples = glossy_samples;
189  kintegrator->transmission_samples = transmission_samples;
190  kintegrator->ao_samples = ao_samples;
191  kintegrator->mesh_light_samples = mesh_light_samples;
192  kintegrator->subsurface_samples = subsurface_samples;
193  kintegrator->volume_samples = volume_samples;
194  kintegrator->start_sample = start_sample;
195 
196  if (kintegrator->branched) {
197  kintegrator->sample_all_lights_direct = sample_all_lights_direct;
198  kintegrator->sample_all_lights_indirect = sample_all_lights_indirect;
199  }
200  else {
201  kintegrator->sample_all_lights_direct = false;
202  kintegrator->sample_all_lights_indirect = false;
203  }
204 
205  kintegrator->sampling_pattern = sampling_pattern;
206  kintegrator->aa_samples = aa_samples;
207  if (aa_samples > 0 && adaptive_min_samples == 0) {
208  kintegrator->adaptive_min_samples = max(4, (int)sqrtf(aa_samples));
209  VLOG(1) << "Cycles adaptive sampling: automatic min samples = "
210  << kintegrator->adaptive_min_samples;
211  }
212  else {
213  kintegrator->adaptive_min_samples = max(4, adaptive_min_samples);
214  }
215 
216  kintegrator->adaptive_step = 4;
217  kintegrator->adaptive_stop_per_sample = device->info.has_adaptive_stop_per_sample;
218 
219  /* Adaptive step must be a power of two for bitwise operations to work. */
220  assert((kintegrator->adaptive_step & (kintegrator->adaptive_step - 1)) == 0);
221 
222  if (aa_samples > 0 && adaptive_threshold == 0.0f) {
223  kintegrator->adaptive_threshold = max(0.001f, 1.0f / (float)aa_samples);
224  VLOG(1) << "Cycles adaptive sampling: automatic threshold = "
225  << kintegrator->adaptive_threshold;
226  }
227  else {
228  kintegrator->adaptive_threshold = adaptive_threshold;
229  }
230 
231  if (light_sampling_threshold > 0.0f) {
232  kintegrator->light_inv_rr_threshold = 1.0f / light_sampling_threshold;
233  }
234  else {
235  kintegrator->light_inv_rr_threshold = 0.0f;
236  }
237 
238  /* sobol directions table */
239  int max_samples = 1;
240 
241  if (kintegrator->branched) {
242  foreach (Light *light, scene->lights)
243  max_samples = max(max_samples, light->get_samples());
244 
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);
249  }
250 
251  uint total_bounces = max_bounce + transparent_max_bounce + 3 + VOLUME_BOUNDS_MAX +
253 
254  max_samples *= total_bounces;
255 
256  int dimensions = PRNG_BASE_NUM + max_samples * PRNG_BOUNCE_NUM;
257  dimensions = min(dimensions, SOBOL_MAX_DIMENSIONS);
258 
259  if (need_update_lut) {
260  if (sampling_pattern == SAMPLING_PATTERN_SOBOL) {
261  uint *directions = dscene->sample_pattern_lut.alloc(SOBOL_BITS * dimensions);
262 
263  sobol_generate_direction_vectors((uint(*)[SOBOL_BITS])directions, dimensions);
264 
265  dscene->sample_pattern_lut.copy_to_device();
266  }
267  else {
268  constexpr int sequence_size = NUM_PMJ_SAMPLES;
269  constexpr int num_sequences = NUM_PMJ_PATTERNS;
270  float2 *directions = (float2 *)dscene->sample_pattern_lut.alloc(sequence_size *
271  num_sequences * 2);
272  TaskPool pool;
273  for (int j = 0; j < num_sequences; ++j) {
274  float2 *sequence = directions + j * sequence_size;
275  pool.push(
276  function_bind(&progressive_multi_jitter_02_generate_2D, sequence, sequence_size, j));
277  }
278  pool.wait_work();
279  dscene->sample_pattern_lut.copy_to_device();
280  }
281  }
282 
283  dscene->sample_pattern_lut.clear_modified();
284  clear_modified();
285 }
286 
287 void Integrator::device_free(Device *, DeviceScene *dscene, bool force_free)
288 {
289  dscene->sample_pattern_lut.free_if_need_realloc(force_free);
290 }
291 
293 {
294  if (flag & UPDATE_ALL) {
295  tag_modified();
296  }
297 
298  if (flag & (AO_PASS_MODIFIED | BACKGROUND_AO_MODIFIED)) {
299  /* tag only the ao_bounces socket as modified so we avoid updating sample_pattern_lut
300  * unnecessarily */
301  tag_ao_bounces_modified();
302  }
303 
304  if ((flag & LIGHT_SAMPLES_MODIFIED) && (method == BRANCHED_PATH)) {
305  /* the number of light samples may affect the size of the sample_pattern_lut */
306  tag_sampling_pattern_modified();
307  }
308 
309  if (filter_glossy_is_modified()) {
310  foreach (Shader *shader, scene->shaders) {
311  if (shader->has_integrator_dependency) {
313  break;
314  }
315  }
316  }
317 
318  if (motion_blur_is_modified()) {
321  }
322 }
323 
unsigned int uint
Definition: BLI_sys_types.h:83
_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)
Definition: bake.cpp:29
static unsigned long seed
Definition: btSoftBody.h:39
device_vector< uint > sample_pattern_lut
Definition: scene.h:131
Definition: device.h:293
@ BRANCHED_PATH
Definition: integrator.h:82
void tag_update(Scene *scene, uint32_t flag)
Definition: integrator.cpp:292
void device_update(Device *device, DeviceScene *dscene, Scene *scene)
Definition: integrator.cpp:107
void device_free(Device *device, DeviceScene *dscene, bool force_free=false)
Definition: integrator.cpp:287
@ LIGHT_SAMPLES_MODIFIED
Definition: integrator.h:95
@ AO_PASS_MODIFIED
Definition: integrator.h:93
@ BACKGROUND_AO_MODIFIED
Definition: integrator.h:94
void tag_update(Scene *scene, uint32_t flag)
Definition: object.cpp:903
@ MOTION_BLUR_MODIFIED
Definition: object.h:131
static bool contains(const vector< Pass > &passes, PassType)
Definition: film.cpp:295
void tag_update(Scene *scene, uint32_t flag)
Definition: shader.cpp:790
@ INTEGRATOR_MODIFIED
Definition: shader.h:171
Definition: shader.h:80
void free_if_need_realloc(bool force_free)
double time
Scene scene
#define function_bind
CCL_NAMESPACE_BEGIN NODE_DEFINE(Integrator)
Definition: integrator.cpp:40
void progressive_multi_jitter_02_generate_2D(float2 points[], int size, int rng_seed)
Definition: jitter.cpp:281
#define CCL_NAMESPACE_END
#define sqrtf(x)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
#define NUM_PMJ_SAMPLES
#define VOLUME_BOUNDS_MAX
Definition: kernel_types.h:54
@ PRNG_BOUNCE_NUM
Definition: kernel_types.h:248
@ PRNG_BASE_NUM
Definition: kernel_types.h:238
#define BSSRDF_MAX_BOUNCES
Definition: kernel_types.h:51
@ SAMPLING_PATTERN_PMJ
Definition: kernel_types.h:257
@ SAMPLING_PATTERN_SOBOL
Definition: kernel_types.h:255
@ SAMPLING_PATTERN_CMJ
Definition: kernel_types.h:256
#define NUM_PMJ_PATTERNS
@ PASS_AO
Definition: kernel_types.h:376
#define BSSRDF_MAX_HITS
Definition: kernel_types.h:50
#define SOCKET_FLOAT(name, ui_name, default_value,...)
Definition: node_type.h:204
#define SOCKET_INT(name, ui_name, default_value,...)
Definition: node_type.h:200
#define SOCKET_BOOLEAN(name, ui_name, default_value,...)
Definition: node_type.h:198
#define SOCKET_ENUM(name, ui_name, values, default_value,...)
Definition: node_type.h:220
void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions)
Definition: sobol.cpp:21269
#define SOBOL_BITS
Definition: sobol.h:24
#define SOBOL_MAX_DIMENSIONS
Definition: sobol.h:25
#define min(a, b)
Definition: sort.c:51
unsigned int uint32_t
Definition: stdint.h:83
float sample_clamp_indirect
int sample_all_lights_indirect
float light_inv_rr_threshold
void insert(const char *x, int y)
Definition: node_enum.h:33
static NodeType * add(const char *name, CreateFunc create, Type type=NONE, const NodeType *base=NULL)
Definition: node.h:98
bool is_modified()
Definition: node.cpp:781
void tag_modified()
Definition: node.cpp:786
vector< Shader * > shaders
Definition: scene.h:236
vector< Pass > passes
Definition: scene.h:239
vector< Light * > lights
Definition: scene.h:237
ObjectManager * object_manager
Definition: scene.h:247
ShaderManager * shader_manager
Definition: scene.h:245
struct Object * camera
SceneUpdateStats * update_stats
Definition: scene.h:270
void push(TaskRunFunction &&task)
Definition: util_task.cpp:36
void wait_work(Summary *stats=NULL)
Definition: util_task.cpp:42
float max
ccl_device_inline uint hash_uint2(uint kx, uint ky)
Definition: util_hash.h:83
#define VLOG(severity)
Definition: util_logging.h:50