[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