[Bf-blender-cvs] [9d81490a59c] temp-eevee-next-cryptomatte: Download final cryptomatte passes (f12 render).

Jeroen Bakker noreply at git.blender.org
Wed Aug 24 09:41:36 CEST 2022


Commit: 9d81490a59c3ddeeaacbb7e2610cc31db60c00d4
Author: Jeroen Bakker
Date:   Wed Aug 24 09:24:04 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rB9d81490a59c3ddeeaacbb7e2610cc31db60c00d4

Download final cryptomatte passes (f12 render).

===================================================================

M	source/blender/draw/engines/eevee_next/eevee_engine.cc
M	source/blender/draw/engines/eevee_next/eevee_film.cc
M	source/blender/draw/engines/eevee_next/eevee_film.hh
M	source/blender/draw/engines/eevee_next/eevee_instance.cc
M	source/blender/draw/engines/eevee_next/eevee_instance.hh

===================================================================

diff --git a/source/blender/draw/engines/eevee_next/eevee_engine.cc b/source/blender/draw/engines/eevee_next/eevee_engine.cc
index 37b4bde324e..a2bc3f5b6d5 100644
--- a/source/blender/draw/engines/eevee_next/eevee_engine.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_engine.cc
@@ -172,7 +172,7 @@ static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewL
   if (!GPU_shader_storage_buffer_objects_support()) {
     return;
   }
-  UNUSED_VARS(engine, scene, view_layer);
+  eevee::Instance::update_passes(engine, scene, view_layer);
 }
 
 static const DrawEngineDataSize eevee_data_size = DRW_VIEWPORT_DATA_SIZE(EEVEE_Data);
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc
index e00f241a858..0bd88e1e47d 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@ -670,7 +670,7 @@ void Film::display()
   /* IMPORTANT: Do not swap! No accumulation has happened. */
 }
 
-float *Film::read_pass(eViewLayerEEVEEPassType pass_type)
+float *Film::read_pass(eViewLayerEEVEEPassType pass_type, int layer_offset)
 {
   // TODO(jbakker): readback cryptomatte?
   eDisplayMode pass_mode = pass_display_mode(pass_type);
@@ -687,7 +687,7 @@ float *Film::read_pass(eViewLayerEEVEEPassType pass_type)
   accum_tx.ensure_layer_views();
 
   int index = pass_id_get(pass_type);
-  GPUTexture *pass_tx = accum_tx.layer_view(index);
+  GPUTexture *pass_tx = accum_tx.layer_view(index + layer_offset);
 
   GPU_memory_barrier(GPU_BARRIER_TEXTURE_UPDATE);
 
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh
index a81b1e5b57c..ba8c505e9c9 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_film.hh
@@ -81,7 +81,7 @@ class Film {
   /** Blit to display. No rendered sample needed. */
   void display();
 
-  float *read_pass(eViewLayerEEVEEPassType pass_type);
+  float *read_pass(eViewLayerEEVEEPassType pass_type, int layer_offset);
   float *read_aov(ViewLayerAOV *aov);
 
   /** Returns shading views internal resolution. */
@@ -178,47 +178,80 @@ class Film {
     }
   }
 
-  static const char *pass_to_render_pass_name(eViewLayerEEVEEPassType pass_type)
+  static const Vector<std::string> pass_to_render_pass_names(eViewLayerEEVEEPassType pass_type,
+                                                             const ViewLayer *view_layer)
   {
+    Vector<std::string> result;
+
+    auto build_cryptomatte_passes = [&](const char *pass_name) {
+      const int num_cryptomatte_passes = (view_layer->cryptomatte_levels + 1) / 2;
+      for (int pass = 0; pass < num_cryptomatte_passes; pass++) {
+        std::stringstream ss;
+        ss.fill('0');
+        ss << pass_name;
+        ss.width(2);
+        ss << pass;
+        result.append(ss.str());
+      }
+    };
+
     switch (pass_type) {
       case EEVEE_RENDER_PASS_COMBINED:
-        return RE_PASSNAME_COMBINED;
+        result.append(RE_PASSNAME_COMBINED);
+        break;
       case EEVEE_RENDER_PASS_Z:
-        return RE_PASSNAME_Z;
+        result.append(RE_PASSNAME_Z);
+        break;
       case EEVEE_RENDER_PASS_MIST:
-        return RE_PASSNAME_MIST;
+        result.append(RE_PASSNAME_MIST);
+        break;
       case EEVEE_RENDER_PASS_NORMAL:
-        return RE_PASSNAME_NORMAL;
+        result.append(RE_PASSNAME_NORMAL);
+        break;
       case EEVEE_RENDER_PASS_DIFFUSE_LIGHT:
-        return RE_PASSNAME_DIFFUSE_DIRECT;
+        result.append(RE_PASSNAME_DIFFUSE_DIRECT);
+        break;
       case EEVEE_RENDER_PASS_DIFFUSE_COLOR:
-        return RE_PASSNAME_DIFFUSE_COLOR;
+        result.append(RE_PASSNAME_DIFFUSE_COLOR);
+        break;
       case EEVEE_RENDER_PASS_SPECULAR_LIGHT:
-        return RE_PASSNAME_GLOSSY_DIRECT;
+        result.append(RE_PASSNAME_GLOSSY_DIRECT);
+        break;
       case EEVEE_RENDER_PASS_SPECULAR_COLOR:
-        return RE_PASSNAME_GLOSSY_COLOR;
+        result.append(RE_PASSNAME_GLOSSY_COLOR);
+        break;
       case EEVEE_RENDER_PASS_VOLUME_LIGHT:
-        return RE_PASSNAME_VOLUME_LIGHT;
+        result.append(RE_PASSNAME_VOLUME_LIGHT);
+        break;
       case EEVEE_RENDER_PASS_EMIT:
-        return RE_PASSNAME_EMIT;
+        result.append(RE_PASSNAME_EMIT);
+        break;
       case EEVEE_RENDER_PASS_ENVIRONMENT:
-        return RE_PASSNAME_ENVIRONMENT;
+        result.append(RE_PASSNAME_ENVIRONMENT);
+        break;
       case EEVEE_RENDER_PASS_SHADOW:
-        return RE_PASSNAME_SHADOW;
+        result.append(RE_PASSNAME_SHADOW);
+        break;
       case EEVEE_RENDER_PASS_AO:
-        return RE_PASSNAME_AO;
+        result.append(RE_PASSNAME_AO);
+        break;
       case EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT:
-        return RE_PASSNAME_CRYPTOMATTE_OBJECT;
+        build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_OBJECT);
+        break;
       case EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET:
-        return RE_PASSNAME_CRYPTOMATTE_ASSET;
+        build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_ASSET);
+        break;
       case EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL:
-        return RE_PASSNAME_CRYPTOMATTE_MATERIAL;
+        build_cryptomatte_passes(RE_PASSNAME_CRYPTOMATTE_MATERIAL);
+        break;
       case EEVEE_RENDER_PASS_VECTOR:
-        return RE_PASSNAME_VECTOR;
+        result.append(RE_PASSNAME_VECTOR);
+        break;
       default:
         BLI_assert(0);
-        return "";
+        break;
     }
+    return result;
   }
 
  private:
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc
index 29daa7d49f3..8a237ff6473 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc
@@ -234,10 +234,15 @@ void Instance::render_read_result(RenderLayer *render_layer, const char *view_na
       continue;
     }
 
-    const char *pass_name = Film::pass_to_render_pass_name(pass_type);
-    RenderPass *rp = RE_pass_find_by_name(render_layer, pass_name, view_name);
-    if (rp) {
-      float *result = film.read_pass(pass_type);
+    Vector<std::string> pass_names = Film::pass_to_render_pass_names(pass_type, view_layer);
+    for (int64_t pass_offset : IndexRange(pass_names.size())) {
+      RenderPass *rp = RE_pass_find_by_name(
+          render_layer, pass_names[pass_offset].c_str(), view_name);
+      if (!rp) {
+        continue;
+      }
+      float *result = film.read_pass(pass_type, pass_offset);
+
       if (result) {
         BLI_mutex_lock(&render->update_render_passes_mutex);
         /* WORKAROUND: We use texture read to avoid using a framebuffer to get the render result.
@@ -253,10 +258,13 @@ void Instance::render_read_result(RenderLayer *render_layer, const char *view_na
 
   /* The vector pass is initialized to weird values. Set it to neutral value if not rendered. */
   if ((pass_bits & EEVEE_RENDER_PASS_VECTOR) == 0) {
-    const char *vector_pass_name = Film::pass_to_render_pass_name(EEVEE_RENDER_PASS_VECTOR);
-    RenderPass *vector_rp = RE_pass_find_by_name(render_layer, vector_pass_name, view_name);
-    if (vector_rp) {
-      memset(vector_rp->rect, 0, sizeof(float) * 4 * vector_rp->rectx * vector_rp->recty);
+    for (std::string vector_pass_name :
+         Film::pass_to_render_pass_names(EEVEE_RENDER_PASS_VECTOR, view_layer)) {
+      RenderPass *vector_rp = RE_pass_find_by_name(
+          render_layer, vector_pass_name.c_str(), view_name);
+      if (vector_rp) {
+        memset(vector_rp->rect, 0, sizeof(float) * 4 * vector_rp->rectx * vector_rp->recty);
+      }
     }
   }
 }
@@ -311,6 +319,23 @@ void Instance::draw_viewport(DefaultFramebufferList *dfbl)
   }
 }
 
+void Instance::update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
+{
+  auto register_cryptomatte_passes = [&](eViewLayerCryptomatteFlags cryptomatte_layer,
+                                         eViewLayerEEVEEPassType eevee_pass) {
+    if (view_layer->cryptomatte_flag & cryptomatte_layer) {
+      for (std::string pass_name : Film::pass_to_render_pass_names(eevee_pass, view_layer)) {
+        RE_engine_register_pass(
+            engine, scene, view_layer, pass_name.c_str(), 4, "RGBA", SOCK_RGBA);
+      }
+    }
+  };
+  register_cryptomatte_passes(VIEW_LAYER_CRYPTOMATTE_OBJECT, EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT);
+  register_cryptomatte_passes(VIEW_LAYER_CRYPTOMATTE_ASSET, EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET);
+  register_cryptomatte_passes(VIEW_LAYER_CRYPTOMATTE_MATERIAL,
+                              EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL);
+}
+
 /** \} */
 
 }  // namespace blender::eevee
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.hh b/source/blender/draw/engines/eevee_next/eevee_instance.hh
index ef65b1c327b..b21a31aee98 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.hh
@@ -122,6 +122,8 @@ class Instance {
 
   void draw_viewport(DefaultFramebufferList *dfbl);
 
+  static void update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer);
+
   bool is_viewport() const
   {
     return render == nullptr;



More information about the Bf-blender-cvs mailing list