[Bf-blender-cvs] [145c349c8d5] temp-eevee-next-cryptomatte: Object based cryptomatte hashes.

Jeroen Bakker noreply at git.blender.org
Tue Aug 23 12:59:56 CEST 2022


Commit: 145c349c8d5626fb459249117dd7bd39f996584f
Author: Jeroen Bakker
Date:   Tue Aug 23 12:53:00 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rB145c349c8d5626fb459249117dd7bd39f996584f

Object based cryptomatte hashes.

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

M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
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_pipeline.cc
M	source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
M	source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
M	source/blender/draw/engines/eevee_next/eevee_sync.cc
M	source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl
M	source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh

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

diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
index 5bcd66949bd..cdaddcbc2bf 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
@@ -20,6 +20,42 @@ void Cryptomatte::init()
                  "Cryptomatte and film mismatch");
 }
 
+void Cryptomatte::begin_sync()
+{
+  if (object_offset_ == -1 && asset_offset_ == -1) {
+    cryptomatte_object_buf.resize(16);
+  }
+}
+
+void Cryptomatte::sync_object(Object *ob)
+{
+  if (object_offset_ == -1 && asset_offset_ == -1) {
+    return;
+  }
+
+  uint32_t resource_id = DRW_object_resource_id_get(ob);
+  float2 object_hashes(0.0f, 0.0f);
+
+  if (object_offset_ != -1) {
+    object_hashes[0] = hash(ob->id);
+  }
+
+  if (asset_offset_ != -1) {
+    Object *asset = ob;
+    while (asset->parent) {
+      asset = asset->parent;
+    }
+    object_hashes[1] = hash(asset->id);
+  }
+
+  cryptomatte_object_buf.get_or_resize(resource_id) = object_hashes;
+}
+
+void Cryptomatte::end_sync()
+{
+  cryptomatte_object_buf.push_update();
+}
+
 float Cryptomatte::hash(const ID &id) const
 {
   const char *name = &id.name[2];
@@ -28,4 +64,9 @@ float Cryptomatte::hash(const ID &id) const
   return BKE_cryptomatte_hash_to_float(cryptomatte_hash);
 }
 
+void Cryptomatte::bind_resources(DRWShadingGroup *grp)
+{
+  DRW_shgroup_storage_block_ref(grp, "cryptomatte_object_buf", &cryptomatte_object_buf);
+}
+
 }  // namespace blender::eevee
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
index c93497a0478..f5568b679e8 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
@@ -44,11 +44,18 @@ class Cryptomatte {
   /** Number of enabled cryptomatte layers. */
   int layer_len_;
 
+  CryptomatteObjectBuf cryptomatte_object_buf;
+
  public:
   Cryptomatte(Instance &inst) : inst_(inst){};
   ~Cryptomatte(){};
 
   void init();
+  void begin_sync();
+  void sync_object(Object *ob);
+  void end_sync();
+
+  void bind_resources(DRWShadingGroup *grp);
 
   float hash(const ID &id) const;
 };
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc
index 0509c47bcc7..a5532122176 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@ -517,6 +517,20 @@ int Film::cryptomatte_layer_len_get() const
   return result;
 }
 
+int Film::cryptomatte_layer_max_get() const
+{
+  if (data_.cryptomatte_material_id != -1) {
+    return 3;
+  }
+  if (data_.cryptomatte_asset_id != -1) {
+    return 2;
+  }
+  if (data_.cryptomatte_object_id != -1) {
+    return 1;
+  }
+  return 0;
+}
+
 void Film::update_sample_table()
 {
   data_.subpixel_offset = pixel_jitter_get();
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh
index ce85e982f58..a81b1e5b57c 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_film.hh
@@ -98,6 +98,7 @@ class Film {
   }
 
   eViewLayerEEVEEPassType enabled_passes_get() const;
+  int cryptomatte_layer_max_get() const;
   int cryptomatte_layer_len_get() const;
 
   static eDisplayMode pass_display_mode(eViewLayerEEVEEPassType pass_type)
diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc
index bd0a6e351a2..6fb955d4d28 100644
--- a/source/blender/draw/engines/eevee_next/eevee_instance.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc
@@ -102,6 +102,7 @@ void Instance::begin_sync()
   materials.begin_sync();
   velocity.begin_sync(); /* NOTE: Also syncs camera. */
   lights.begin_sync();
+  cryptomatte.begin_sync();
 
   gpencil_engine_enabled = false;
 
@@ -178,6 +179,7 @@ void Instance::end_sync()
   lights.end_sync();
   sampling.end_sync();
   film.end_sync();
+  cryptomatte.end_sync();
 }
 
 void Instance::render_sync()
diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
index 6ee79cd6ec7..c15007f41b7 100644
--- a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc
@@ -103,12 +103,14 @@ DRWShadingGroup *ForwardPipeline::material_opaque_add(::Material *blender_mat, G
   DRWPass *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? opaque_culled_ps_ : opaque_ps_;
   LightModule &lights = inst_.lights;
   Sampling &sampling = inst_.sampling;
+  Cryptomatte &cryptomatte = inst_.cryptomatte;
   // LightProbeModule &lightprobes = inst_.lightprobes;
   // RaytracingModule &raytracing = inst_.raytracing;
   // eGPUSamplerState no_interp = GPU_SAMPLER_DEFAULT;
   DRWShadingGroup *grp = DRW_shgroup_material_create(gpumat, pass);
   lights.bind_resources(grp);
   sampling.bind_resources(grp);
+  cryptomatte.bind_resources(grp);
   // DRW_shgroup_uniform_block(grp, "sampling_buf", inst_.sampling.ubo_get());
   // DRW_shgroup_uniform_block(grp, "grids_buf", lightprobes.grid_ubo_get());
   // DRW_shgroup_uniform_block(grp, "cubes_buf", lightprobes.cube_ubo_get());
diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
index 8f41b09d09c..8e36e1d071c 100644
--- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc
@@ -74,7 +74,7 @@ void RenderBuffers::acquire(int2 extent)
       float_format, (aovs.value_len > 0) ? extent : int2(1), max_ii(1, aovs.value_len));
 
   eGPUTextureFormat cryptomatte_format = GPU_R32F;
-  const int cryptomatte_layer_len = inst_.film.cryptomatte_layer_len_get();
+  const int cryptomatte_layer_len = inst_.film.cryptomatte_layer_max_get();
   if (cryptomatte_layer_len == 2) {
     cryptomatte_format = GPU_RG32F;
   }
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
index 9342e1f0e28..564cbbc4da5 100644
--- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
@@ -757,6 +757,7 @@ using SamplingDataBuf = draw::StorageBuffer<SamplingData>;
 using VelocityGeometryBuf = draw::StorageArrayBuffer<float4, 16, true>;
 using VelocityIndexBuf = draw::StorageArrayBuffer<VelocityIndex, 16>;
 using VelocityObjectBuf = draw::StorageArrayBuffer<float4x4, 16>;
+using CryptomatteObjectBuf = draw::StorageArrayBuffer<float2, 16>;
 
 }  // namespace blender::eevee
 #endif
diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc
index e2d4b0ac1c2..0725d72a90d 100644
--- a/source/blender/draw/engines/eevee_next/eevee_sync.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc
@@ -131,6 +131,7 @@ void SyncModule::sync_mesh(Object *ob, ObjectHandle &ob_handle)
     is_alpha_blend = is_alpha_blend || material->is_alpha_blend_transparent;
   }
 
+  inst_.cryptomatte.sync_object(ob);
   // shadows.sync_object(ob, ob_handle, is_shadow_caster, is_alpha_blend);
 }
 
@@ -317,6 +318,7 @@ void SyncModule::sync_curves(Object *ob, ObjectHandle &ob_handle, ModifierData *
   shgroup_curves_call(material.prepass, ob, part_sys, modifier_data);
   shgroup_curves_call(material.shadow, ob, part_sys, modifier_data);
 
+  inst_.cryptomatte.sync_object(ob);
   /* TODO(fclem) Hair velocity. */
   // shading_passes.velocity.gpencil_add(ob, ob_handle);
 
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
index e20553422f8..57d41a9e952 100644
--- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
+++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_lib.glsl
@@ -707,18 +707,15 @@ void film_process_data(ivec2 texel_film, out vec4 out_color, out float out_depth
     vec4 hashes = texelFetch(cryptomatte_tx, dst.texel, 0);
     if (film_buf.cryptomatte_object_id != -1) {
       float hash = hashes.x;
-      hashes = hashes.yzww;
       film_store_cryptomatte_sample(dst, film_buf.cryptomatte_object_id, hash, out_color);
-    } 
+    }
     if (film_buf.cryptomatte_asset_id != -1) {
-      float hash = hashes.x;
-      hashes = hashes.yzww;
+      float hash = hashes.y;
       film_store_cryptomatte_sample(dst, film_buf.cryptomatte_asset_id, hash, out_color);
-    } 
+    }
     if (film_buf.cryptomatte_material_id != -1) {
-      float hash = hashes.x;
-      hashes = hashes.yzww;
+      float hash = hashes.z;
       film_store_cryptomatte_sample(dst, film_buf.cryptomatte_material_id, hash, out_color);
-    } 
+    }
   }
 }
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl
index 9b237dac040..fbe3c3725ed 100644
--- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl
+++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl
@@ -106,11 +106,9 @@ void main()
   imageStore(rp_diffuse_color_img, out_texel, vec4(g_diffuse_data.color, 1.0));
   imageStore(rp_specular_color_img, out_texel, vec4(specular_color, 1.0));
   imageStore(rp_emission_img, out_texel, vec4(g_emission, 1.0));
-  /* TODO(jbakker): read object and asset hash from object data? */
-  imageStore(
-      rp_cryptomatte_img,
-      out_texel,
-      vec4(cryptomatte_material_hash, cryptomatte_material_hash, cryptomatte_material_hash, 1.0));
+  imageStore(rp_cryptomatte_img,
+             out_texel,
+             vec4(cryptomatte_object_buf[resource_id], cryptomatte_material_hash, 0.0));
 
   out_radiance.rgb *= 1.0 - g_holdout;
 
diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh b/source/blender/draw/engines/eevee_next/shader

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list