Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2021-11-18 18:07:47 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-11-18 19:13:16 +0300
commitf0be276514f2b7cae27c744ac80f999fbc69f12f (patch)
treed9ae4b6a4a0fdcde471893b8f3a518561bc24d1b /intern
parented91e759d1f0debce58b10261799378e1639e6c0 (diff)
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.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/session.cpp31
-rw-r--r--intern/cycles/kernel/integrator/init_from_bake.h8
-rw-r--r--intern/cycles/kernel/integrator/shader_eval.h29
-rw-r--r--intern/cycles/kernel/types.h3
-rw-r--r--intern/cycles/scene/integrator.cpp9
5 files changed, 46 insertions, 34 deletions
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<BlenderOutputDriver>(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();
}
diff --git a/intern/cycles/kernel/integrator/init_from_bake.h b/intern/cycles/kernel/integrator/init_from_bake.h
index 4e30563e21b..dbaf02836e4 100644
--- a/intern/cycles/kernel/integrator/init_from_bake.h
+++ b/intern/cycles/kernel/integrator/init_from_bake.h
@@ -70,14 +70,16 @@ ccl_device bool integrator_init_from_bake(KernelGlobals kg,
/* Setup render buffers. */
const int index = INTEGRATOR_STATE(state, path, render_pixel_index);
const int pass_stride = kernel_data.film.pass_stride;
- render_buffer += index * pass_stride;
+ ccl_global float *buffer = render_buffer + index * pass_stride;
- ccl_global float *primitive = render_buffer + kernel_data.film.pass_bake_primitive;
- ccl_global float *differential = render_buffer + kernel_data.film.pass_bake_differential;
+ ccl_global float *primitive = buffer + kernel_data.film.pass_bake_primitive;
+ ccl_global float *differential = buffer + kernel_data.film.pass_bake_differential;
const int seed = __float_as_uint(primitive[0]);
int prim = __float_as_uint(primitive[1]);
if (prim == -1) {
+ /* Accumulate transparency for empty pixels. */
+ kernel_accum_transparent(kg, state, 0, 1.0f, buffer);
return false;
}
diff --git a/intern/cycles/kernel/integrator/shader_eval.h b/intern/cycles/kernel/integrator/shader_eval.h
index 169a01d0797..2dcba73561d 100644
--- a/intern/cycles/kernel/integrator/shader_eval.h
+++ b/intern/cycles/kernel/integrator/shader_eval.h
@@ -122,23 +122,20 @@ ccl_device_inline void shader_prepare_surface_closures(KernelGlobals kg,
for (int i = 0; i < sd->num_closure; i++) {
ccl_private ShaderClosure *sc = &sd->closure[i];
- if (CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
- if (kernel_data.integrator.filter_closures & FILTER_CLOSURE_DIFFUSE) {
- sc->type = CLOSURE_NONE_ID;
- sc->sample_weight = 0.0f;
- }
+ if ((CLOSURE_IS_BSDF_DIFFUSE(sc->type) &&
+ (kernel_data.integrator.filter_closures & FILTER_CLOSURE_DIFFUSE)) ||
+ (CLOSURE_IS_BSDF_GLOSSY(sc->type) &&
+ (kernel_data.integrator.filter_closures & FILTER_CLOSURE_GLOSSY)) ||
+ (CLOSURE_IS_BSDF_TRANSMISSION(sc->type) &&
+ (kernel_data.integrator.filter_closures & FILTER_CLOSURE_TRANSMISSION))) {
+ sc->type = CLOSURE_NONE_ID;
+ sc->sample_weight = 0.0f;
}
- else if (CLOSURE_IS_BSDF_GLOSSY(sc->type)) {
- if (kernel_data.integrator.filter_closures & FILTER_CLOSURE_GLOSSY) {
- sc->type = CLOSURE_NONE_ID;
- sc->sample_weight = 0.0f;
- }
- }
- else if (CLOSURE_IS_BSDF_TRANSMISSION(sc->type)) {
- if (kernel_data.integrator.filter_closures & FILTER_CLOSURE_TRANSMISSION) {
- sc->type = CLOSURE_NONE_ID;
- sc->sample_weight = 0.0f;
- }
+ else if ((CLOSURE_IS_BSDF_TRANSPARENT(sc->type) &&
+ (kernel_data.integrator.filter_closures & FILTER_CLOSURE_TRANSPARENT))) {
+ sc->type = CLOSURE_HOLDOUT_ID;
+ sc->sample_weight = 0.0f;
+ sd->flag |= SD_HOLDOUT;
}
}
}
diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h
index cae514d4dbd..2f6cadf7496 100644
--- a/intern/cycles/kernel/types.h
+++ b/intern/cycles/kernel/types.h
@@ -438,7 +438,8 @@ typedef enum FilterClosures {
FILTER_CLOSURE_DIFFUSE = (1 << 1),
FILTER_CLOSURE_GLOSSY = (1 << 2),
FILTER_CLOSURE_TRANSMISSION = (1 << 3),
- FILTER_CLOSURE_DIRECT_LIGHT = (1 << 4),
+ FILTER_CLOSURE_TRANSPARENT = (1 << 4),
+ FILTER_CLOSURE_DIRECT_LIGHT = (1 << 5),
} FilterClosures;
/* Shader Flag */
diff --git a/intern/cycles/scene/integrator.cpp b/intern/cycles/scene/integrator.cpp
index 737db8b98d5..a97833a8d32 100644
--- a/intern/cycles/scene/integrator.cpp
+++ b/intern/cycles/scene/integrator.cpp
@@ -14,11 +14,13 @@
* limitations under the License.
*/
-#include "scene/integrator.h"
#include "device/device.h"
+
#include "scene/background.h"
+#include "scene/bake.h"
#include "scene/camera.h"
#include "scene/film.h"
+#include "scene/integrator.h"
#include "scene/jitter.h"
#include "scene/light.h"
#include "scene/object.h"
@@ -212,6 +214,11 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene
if (!use_emission) {
kintegrator->filter_closures |= FILTER_CLOSURE_EMISSION;
}
+ if (scene->bake_manager->get_baking()) {
+ /* Baking does not need to trace through transparency, we only want to bake
+ * the object itself. */
+ kintegrator->filter_closures |= FILTER_CLOSURE_TRANSPARENT;
+ }
kintegrator->seed = seed;