144 if (scene->update_stats) {
145 scene->update_stats->film.times.add_entry({
"update", time});
149 device_free(device, dscene, scene);
151 KernelFilm *kfilm = &dscene->data.film;
154 kfilm->exposure = exposure;
155 kfilm->pass_alpha_threshold = pass_alpha_threshold;
156 kfilm->pass_flag = 0;
158 kfilm->use_approximate_shadow_catcher = get_use_approximate_shadow_catcher();
160 kfilm->light_pass_flag = 0;
161 kfilm->pass_stride = 0;
197 kfilm->pass_shadow_catcher_sample_count =
PASS_UNUSED;
204 bool have_cryptomatte =
false;
205 bool have_aov_color =
false;
206 bool have_aov_value =
false;
207 bool have_lightgroup =
false;
209 for (
size_t i = 0; i < scene->passes.size(); i++) {
210 const Pass *pass = scene->passes[i];
212 if (pass->get_type() ==
PASS_NONE || !pass->is_written()) {
226 kfilm->pass_stride += pass->get_info().num_components;
231 const int pass_flag = (1 << (pass->get_type() % 32));
233 kfilm->light_pass_flag |= pass_flag;
236 kfilm->pass_flag |= pass_flag;
242 if (pass->get_lightgroup() != ustring()) {
243 if (!have_lightgroup) {
244 kfilm->pass_lightgroup = kfilm->pass_stride;
245 have_lightgroup =
true;
247 kfilm->pass_stride += pass->get_info().num_components;
251 switch (pass->get_type()) {
253 kfilm->pass_combined = kfilm->pass_stride;
256 kfilm->pass_depth = kfilm->pass_stride;
259 kfilm->pass_normal = kfilm->pass_stride;
262 kfilm->pass_position = kfilm->pass_stride;
265 kfilm->pass_roughness = kfilm->pass_stride;
268 kfilm->pass_uv = kfilm->pass_stride;
271 kfilm->pass_motion = kfilm->pass_stride;
274 kfilm->pass_motion_weight = kfilm->pass_stride;
277 kfilm->pass_object_id = kfilm->pass_stride;
280 kfilm->pass_material_id = kfilm->pass_stride;
284 kfilm->pass_mist = kfilm->pass_stride;
287 kfilm->pass_emission = kfilm->pass_stride;
290 kfilm->pass_background = kfilm->pass_stride;
293 kfilm->pass_ao = kfilm->pass_stride;
297 kfilm->pass_diffuse_color = kfilm->pass_stride;
300 kfilm->pass_glossy_color = kfilm->pass_stride;
303 kfilm->pass_transmission_color = kfilm->pass_stride;
306 kfilm->pass_diffuse_indirect = kfilm->pass_stride;
309 kfilm->pass_glossy_indirect = kfilm->pass_stride;
312 kfilm->pass_transmission_indirect = kfilm->pass_stride;
315 kfilm->pass_volume_indirect = kfilm->pass_stride;
318 kfilm->pass_diffuse_direct = kfilm->pass_stride;
321 kfilm->pass_glossy_direct = kfilm->pass_stride;
324 kfilm->pass_transmission_direct = kfilm->pass_stride;
327 kfilm->pass_volume_direct = kfilm->pass_stride;
331 kfilm->pass_bake_primitive = kfilm->pass_stride;
334 kfilm->pass_bake_seed = kfilm->pass_stride;
337 kfilm->pass_bake_differential = kfilm->pass_stride;
341 kfilm->pass_cryptomatte = have_cryptomatte ?
342 min(kfilm->pass_cryptomatte, kfilm->pass_stride) :
344 have_cryptomatte =
true;
348 kfilm->pass_denoising_normal = kfilm->pass_stride;
351 kfilm->pass_denoising_albedo = kfilm->pass_stride;
354 kfilm->pass_denoising_depth = kfilm->pass_stride;
358 kfilm->pass_shadow_catcher = kfilm->pass_stride;
361 kfilm->pass_shadow_catcher_sample_count = kfilm->pass_stride;
364 kfilm->pass_shadow_catcher_matte = kfilm->pass_stride;
368 kfilm->pass_adaptive_aux_buffer = kfilm->pass_stride;
371 kfilm->pass_sample_count = kfilm->pass_stride;
375 if (!have_aov_color) {
376 kfilm->pass_aov_color = kfilm->pass_stride;
377 have_aov_color =
true;
381 if (!have_aov_value) {
382 kfilm->pass_aov_value = kfilm->pass_stride;
383 have_aov_value =
true;
387 kfilm->pass_guiding_color = kfilm->pass_stride;
390 kfilm->pass_guiding_probability = kfilm->pass_stride;
393 kfilm->pass_guiding_avg_roughness = kfilm->pass_stride;
400 kfilm->pass_stride += pass->get_info().num_components;
405 scene->lookup_tables->remove_table(&filter_table_offset_);
406 filter_table_offset_ = scene->lookup_tables->add_table(dscene, table);
407 dscene->data.tables.filter_table_offset = (
int)filter_table_offset_;
410 kfilm->mist_start = mist_start;
411 kfilm->mist_inv_depth = (mist_depth > 0.0f) ? 1.0f / mist_depth : 0.0f;
412 kfilm->mist_falloff = mist_falloff;
414 kfilm->cryptomatte_passes = cryptomatte_passes;
415 kfilm->cryptomatte_depth = cryptomatte_depth;
473 const Background *background = scene->background;
474 const BakeManager *bake_manager = scene->bake_manager;
479 !background->is_modified())
485 remove_auto_passes(scene);
488 const PassType display_pass = get_display_pass();
489 add_auto_pass(scene, display_pass);
501 if (adaptive_sampling.
use) {
507 const bool use_denoise = integrator->get_use_denoise();
509 if (integrator->get_use_denoise_pass_normal()) {
512 if (integrator->get_use_denoise_pass_albedo()) {
518 if (scene->has_shadow_catcher()) {
519 const bool need_background = get_use_approximate_shadow_catcher() &&
520 !background->get_transparent();
526 if (need_background) {
536 for (
const Pass *pass : passes_immutable) {
537 const PassInfo info = pass->get_info();
564 if (add_sample_count_pass) {
571 finalize_passes(scene, use_denoise);
578 if (have_uv_pass != prev_have_uv_pass) {
580 foreach (
Shader *shader, scene->shaders)
581 shader->need_update_uvs =
true;
583 if (have_motion_pass != prev_have_motion_pass) {
586 if (have_ao_pass != prev_have_ao_pass) {
590 prev_have_uv_pass = have_uv_pass;
591 prev_have_motion_pass = have_motion_pass;
592 prev_have_ao_pass = have_ao_pass;
599 for (
const Pass *pass : scene->passes) {