[Bf-blender-cvs] [6abb886787b] cycles-x: Cycles X: Make shadow catcher approximation more explicit
Sergey Sharybin
noreply at git.blender.org
Wed May 19 10:19:01 CEST 2021
Commit: 6abb886787b04ed6b8d450c72ee396a986b0ba2b
Author: Sergey Sharybin
Date: Fri May 14 11:58:32 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB6abb886787b04ed6b8d450c72ee396a986b0ba2b
Cycles X: Make shadow catcher approximation more explicit
Only affects internal API, the user level stays unchanged.
Just replacing some implicit decisions in a generic code path with
something what is more explicit.
===================================================================
M intern/cycles/blender/blender_sync.cpp
M intern/cycles/blender/blender_sync.h
M intern/cycles/render/film.cpp
M intern/cycles/render/film.h
M intern/cycles/render/pass_accessor.cpp
M intern/cycles/render/pass_accessor.h
M intern/cycles/render/session.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 06a8996fdd7..42c7bf5f351 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -254,7 +254,7 @@ void BlenderSync::sync_data(BL::RenderSettings &b_render,
sync_view_layer(b_v3d, b_view_layer);
sync_integrator(b_view_layer, background);
- sync_film(b_v3d);
+ sync_film(b_view_layer, b_v3d);
sync_shaders(b_depsgraph, b_v3d);
sync_images();
@@ -383,9 +383,10 @@ void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background)
/* Film */
-void BlenderSync::sync_film(BL::SpaceView3D &b_v3d)
+void BlenderSync::sync_film(BL::ViewLayer &b_view_layer, BL::SpaceView3D &b_v3d)
{
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ PointerRNA crl = RNA_pointer_get(&b_view_layer.ptr, "cycles");
Film *film = scene->film;
@@ -425,6 +426,8 @@ void BlenderSync::sync_film(BL::SpaceView3D &b_v3d)
break;
}
}
+
+ film->set_use_approximate_shadow_catcher(!get_boolean(crl, "use_pass_shadow_catcher"));
}
/* Render Layer */
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index cba0dc20a9c..c417d5e35c9 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -124,7 +124,7 @@ class BlenderSync {
int width,
int height,
void **python_thread_state);
- void sync_film(BL::SpaceView3D &b_v3d);
+ void sync_film(BL::ViewLayer &b_view_layer, BL::SpaceView3D &b_v3d);
void sync_view();
/* Shader */
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index de29a12b159..ccf8105dd0d 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -130,6 +130,8 @@ NODE_DEFINE(Film)
SOCKET_INT(cryptomatte_depth, "Cryptomatte Depth", 0);
+ SOCKET_BOOLEAN(use_approximate_shadow_catcher, "Use Approximate Shadow Catcher", false);
+
return type;
}
diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h
index 77b5c39259f..1b9cbac5266 100644
--- a/intern/cycles/render/film.h
+++ b/intern/cycles/render/film.h
@@ -60,6 +60,10 @@ class Film : public Node {
NODE_SOCKET_API(CryptomatteType, cryptomatte_passes)
NODE_SOCKET_API(int, cryptomatte_depth)
+ /* Approximate shadow catcher pass into its matte pass, so that both artificial objects and
+ * shadows can be alpha-overed onto a backdrop. */
+ NODE_SOCKET_API(bool, use_approximate_shadow_catcher)
+
private:
size_t filter_table_offset_;
diff --git a/intern/cycles/render/pass_accessor.cpp b/intern/cycles/render/pass_accessor.cpp
index 3fe2db19225..9eb1dc0f5c7 100644
--- a/intern/cycles/render/pass_accessor.cpp
+++ b/intern/cycles/render/pass_accessor.cpp
@@ -165,12 +165,14 @@ static float4 shadow_catcher_calc_matte_with_shadow(const float scale,
(1.0f - alpha) * (1.0f - average(float4_to_float3(shadow_catcher))) + alpha);
}
-PassAccessor::PassAccessor(const vector<Pass> &passes,
+PassAccessor::PassAccessor(const Film *film,
+ const vector<Pass> &passes,
const string &pass_name,
int num_components,
float exposure,
int num_samples)
- : passes_(passes),
+ : film_(film),
+ passes_(passes),
pass_offset_(PASS_UNUSED),
pass_(nullptr),
num_components_(num_components),
@@ -185,13 +187,6 @@ PassAccessor::PassAccessor(const vector<Pass> &passes,
* combined pass with shadow catcher matte here. */
if (pass_ && pass_->type == PASS_COMBINED) {
get_pass_by_type(PASS_SHADOW_CATCHER_MATTE, &pass_, &pass_offset_);
-
- /* When shadow catcher pass is created automatically, assume that pass with synthetic objects
- * is expected to have shadows as well. */
- const Pass *shadow_catcher_pass = nullptr;
- if (get_pass_by_type(PASS_SHADOW_CATCHER, &shadow_catcher_pass)) {
- approximate_shadow_in_matte_ = shadow_catcher_pass->is_auto;
- }
}
}
@@ -433,7 +428,7 @@ bool PassAccessor::get_render_tile_pixels(RenderBuffers *render_buffers, float *
pixels[3] = shadow_catcher.w;
}
}
- else if (type == PASS_SHADOW_CATCHER_MATTE && approximate_shadow_in_matte_) {
+ else if (type == PASS_SHADOW_CATCHER_MATTE && film_->get_use_approximate_shadow_catcher()) {
const int pass_combined = get_pass_offset(PASS_COMBINED);
const int pass_shadow_catcher = get_pass_offset(PASS_SHADOW_CATCHER);
diff --git a/intern/cycles/render/pass_accessor.h b/intern/cycles/render/pass_accessor.h
index 55fb5442df7..6fc3b99d2ab 100644
--- a/intern/cycles/render/pass_accessor.h
+++ b/intern/cycles/render/pass_accessor.h
@@ -22,6 +22,7 @@
CCL_NAMESPACE_BEGIN
+class Film;
class RenderBuffers;
/* Helper class which allows to access pass data.
@@ -29,7 +30,8 @@ class RenderBuffers;
* progressively update from various render buffers. */
class PassAccessor {
public:
- PassAccessor(const vector<Pass> &passes,
+ PassAccessor(const Film *film,
+ const vector<Pass> &passes,
const string &pass_name,
int num_components,
float exposure,
@@ -53,6 +55,8 @@ class PassAccessor {
bool get_pass_by_type(const PassType type, const Pass **r_pass, int *r_offset = nullptr) const;
protected:
+ const Film *film_;
+
const vector<Pass> &passes_;
int pass_offset_ = -1;
@@ -62,8 +66,6 @@ class PassAccessor {
float exposure_ = 0.0f;
int num_samples_ = 0;
-
- bool approximate_shadow_in_matte_ = false;
};
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 013c161590a..9501f99b1b3 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -562,7 +562,8 @@ bool Session::get_render_tile_pixels(const string &pass_name, int num_components
const float exposure = scene->film->get_exposure();
const int num_samples = render_scheduler_.get_num_rendered_samples();
- PassAccessor pass_accessor(scene->passes, pass_name, num_components, exposure, num_samples);
+ PassAccessor pass_accessor(
+ scene->film, scene->passes, pass_name, num_components, exposure, num_samples);
if (!pass_accessor.is_valid()) {
return false;
More information about the Bf-blender-cvs
mailing list