From f0be276514f2b7cae27c744ac80f999fbc69f12f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 18 Nov 2021 16:07:47 +0100 Subject: Fix T93082: Cycles baking not handling transparency correctly For baking, replace transparent BSDF with holdout for baking. This ensure no objects behind are baked, and that the baked image has alpha. --- intern/cycles/blender/session.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/session.cpp b/intern/cycles/blender/session.cpp index b8ac437443b..2c4e57404b8 100644 --- a/intern/cycles/blender/session.cpp +++ b/intern/cycles/blender/session.cpp @@ -606,19 +606,6 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_, pass->set_type(bake_type_to_pass(bake_type, bake_filter)); pass->set_include_albedo((bake_filter & BL::BakeSettings::pass_filter_COLOR)); - if (pass->get_type() == PASS_COMBINED) { - /* Filtering settings for combined pass. */ - Integrator *integrator = scene->integrator; - integrator->set_use_direct_light((bake_filter & BL::BakeSettings::pass_filter_DIRECT) != 0); - integrator->set_use_indirect_light((bake_filter & BL::BakeSettings::pass_filter_INDIRECT) != - 0); - integrator->set_use_diffuse((bake_filter & BL::BakeSettings::pass_filter_DIFFUSE) != 0); - integrator->set_use_glossy((bake_filter & BL::BakeSettings::pass_filter_GLOSSY) != 0); - integrator->set_use_transmission((bake_filter & BL::BakeSettings::pass_filter_TRANSMISSION) != - 0); - integrator->set_use_emission((bake_filter & BL::BakeSettings::pass_filter_EMIT) != 0); - } - session->set_display_driver(nullptr); session->set_output_driver(make_unique(b_engine)); @@ -628,6 +615,24 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_, sync->sync_camera(b_render, b_camera_override, width, height, ""); sync->sync_data( b_render, b_depsgraph, b_v3d, b_camera_override, width, height, &python_thread_state); + + /* Filtering settings for combined pass. */ + if (pass->get_type() == PASS_COMBINED) { + Integrator *integrator = scene->integrator; + integrator->set_use_direct_light((bake_filter & BL::BakeSettings::pass_filter_DIRECT) != 0); + integrator->set_use_indirect_light((bake_filter & BL::BakeSettings::pass_filter_INDIRECT) != + 0); + integrator->set_use_diffuse((bake_filter & BL::BakeSettings::pass_filter_DIFFUSE) != 0); + integrator->set_use_glossy((bake_filter & BL::BakeSettings::pass_filter_GLOSSY) != 0); + integrator->set_use_transmission( + (bake_filter & BL::BakeSettings::pass_filter_TRANSMISSION) != 0); + integrator->set_use_emission((bake_filter & BL::BakeSettings::pass_filter_EMIT) != 0); + } + + /* Always use transpanent background for baking. */ + scene->background->set_transparent(true); + + /* Load built-in images from Blender. */ builtin_images_load(); } -- cgit v1.2.3