[Bf-blender-cvs] [02d8d9a3a16] temp-eevee-next-cryptomatte: Cryptomatte: show hash in viewport.

Jeroen Bakker noreply at git.blender.org
Mon Aug 22 15:49:49 CEST 2022


Commit: 02d8d9a3a16d05503839f5ce046380a895219ce0
Author: Jeroen Bakker
Date:   Mon Aug 22 15:22:57 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rB02d8d9a3a16d05503839f5ce046380a895219ce0

Cryptomatte: show hash in viewport.

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

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_shader_shared.hh
M	source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl
M	source/blender/draw/engines/eevee_next/shaders/eevee_film_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee_next/eevee_film.cc b/source/blender/draw/engines/eevee_next/eevee_film.cc
index 0287c833edd..0509c47bcc7 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_film.cc
@@ -275,7 +275,7 @@ void Film::init(const int2 &extent, const rcti *output_rect)
     /* Set pass offsets.  */
 
     data_.display_id = aovs_info.display_id;
-    data_.display_is_value = aovs_info.display_is_value;
+    data_.display_mode = aovs_info.display_is_value ? DISPLAY_MODE_VALUE : DISPLAY_MODE_COLOR;
 
     /* Combined is in a separate buffer. */
     data_.combined_id = (enabled_passes_ & EEVEE_RENDER_PASS_COMBINED) ? 0 : -1;
@@ -286,13 +286,13 @@ void Film::init(const int2 &extent, const rcti *output_rect)
     data_.value_len = 0;
 
     auto pass_index_get = [&](eViewLayerEEVEEPassType pass_type) {
-      bool is_value = pass_is_value(pass_type);
+      eDisplayMode display_mode = pass_display_mode(pass_type);
       int index = (enabled_passes_ & pass_type) ?
-                      (is_value ? data_.value_len : data_.color_len)++ :
+                      (display_mode == DISPLAY_MODE_VALUE ? data_.value_len : data_.color_len)++ :
                       -1;
       if (inst_.is_viewport() && inst_.v3d->shading.render_pass == pass_type) {
         data_.display_id = index;
-        data_.display_is_value = is_value;
+        data_.display_mode = display_mode;
       }
       return index;
     };
@@ -324,13 +324,28 @@ void Film::init(const int2 &extent, const rcti *output_rect)
     if (enabled_passes_ & EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT) {
       data_.cryptomatte_object_id = cryptomatte_id;
       cryptomatte_id += data_.cryptomatte_samples_len / 2;
+      if (inst_.is_viewport() &&
+          inst_.v3d->shading.render_pass == EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT) {
+        data_.display_id = data_.cryptomatte_object_id;
+        data_.display_mode = DISPLAY_MODE_CRYPTOMATTE;
+      }
     }
     if (enabled_passes_ & EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
       data_.cryptomatte_asset_id = cryptomatte_id;
       cryptomatte_id += data_.cryptomatte_samples_len / 2;
+      if (inst_.is_viewport() &&
+          inst_.v3d->shading.render_pass == EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
+        data_.display_id = data_.cryptomatte_asset_id;
+        data_.display_mode = DISPLAY_MODE_CRYPTOMATTE;
+      }
     }
     if (enabled_passes_ & EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL) {
       data_.cryptomatte_material_id = cryptomatte_id;
+      if (inst_.is_viewport() &&
+          inst_.v3d->shading.render_pass == EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL) {
+        data_.display_id = data_.cryptomatte_material_id;
+        data_.display_mode = DISPLAY_MODE_CRYPTOMATTE;
+      }
     }
   }
   {
@@ -638,8 +653,8 @@ void Film::display()
 
 float *Film::read_pass(eViewLayerEEVEEPassType pass_type)
 {
-
-  bool is_value = pass_is_value(pass_type);
+  // TODO(jbakker): readback cryptomatte?
+  bool is_value = pass_display_mode(pass_type) == DISPLAY_MODE_VALUE;
   Texture &accum_tx = (pass_type == EEVEE_RENDER_PASS_COMBINED) ?
                           combined_tx_.current() :
                       (pass_type == EEVEE_RENDER_PASS_Z) ?
diff --git a/source/blender/draw/engines/eevee_next/eevee_film.hh b/source/blender/draw/engines/eevee_next/eevee_film.hh
index 17d297ac218..ce85e982f58 100644
--- a/source/blender/draw/engines/eevee_next/eevee_film.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_film.hh
@@ -100,16 +100,20 @@ class Film {
   eViewLayerEEVEEPassType enabled_passes_get() const;
   int cryptomatte_layer_len_get() const;
 
-  static bool pass_is_value(eViewLayerEEVEEPassType pass_type)
+  static eDisplayMode pass_display_mode(eViewLayerEEVEEPassType pass_type)
   {
     switch (pass_type) {
       case EEVEE_RENDER_PASS_Z:
       case EEVEE_RENDER_PASS_MIST:
       case EEVEE_RENDER_PASS_SHADOW:
       case EEVEE_RENDER_PASS_AO:
-        return true;
+        return DISPLAY_MODE_VALUE;
+      case EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT:
+      case EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET:
+      case EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL:
+        return DISPLAY_MODE_CRYPTOMATTE;
       default:
-        return false;
+        return DISPLAY_MODE_COLOR;
     }
   }
 
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 99adddd1309..9342e1f0e28 100644
--- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh
@@ -194,6 +194,12 @@ BLI_STATIC_ASSERT_ALIGN(CameraData, 16)
 
 #define FILM_PRECOMP_SAMPLE_MAX 16
 
+enum eDisplayMode : uint32_t {
+  DISPLAY_MODE_COLOR = 0u,
+  DISPLAY_MODE_VALUE = 1u,
+  DISPLAY_MODE_CRYPTOMATTE = 2u,
+};
+
 struct FilmSample {
   int2 texel;
   float weight;
@@ -251,7 +257,7 @@ struct FilmData {
   /** Id of the render-pass to be displayed. -1 for combined. */
   int display_id;
   /** True if the render-pass to be displayed is from the value accum buffer. */
-  bool1 display_is_value;
+  int display_mode;
   /** True if we bypass the accumulation and directly output the accumulation buffer. */
   bool1 display_only;
   /** Start of AOVs and number of aov. */
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl
index 57f4c880132..9c525da67f9 100644
--- a/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl
+++ b/source/blender/draw/engines/eevee_next/shaders/eevee_cryptomatte_lib.glsl
@@ -1,38 +1,47 @@
 /** Storing/merging and sorting cryptomatte samples. */
 
-bool can_merge_cryptomatte_sample(vec2 cryptomatte_sample, float hash) {
-    if (cryptomatte_sample == vec2(0.0, 0.0)) {
-        return true;
-    }
-    if (cryptomatte_sample.x == hash) {
-        return true;
-    }
+bool can_merge_cryptomatte_sample(vec2 cryptomatte_sample, float hash)
+{
+  if (cryptomatte_sample == vec2(0.0, 0.0)) {
+    return true;
+  }
+  if (cryptomatte_sample.x == hash) {
+    return true;
+  }
 }
 
-vec2 merge_cryptomatte_sample(vec2 cryptomatte_sample, float hash, float weight) {
-    return vec2(hash, cryptomatte_sample.y + weight);
+vec2 merge_cryptomatte_sample(vec2 cryptomatte_sample, float hash, float weight)
+{
+  return vec2(hash, cryptomatte_sample.y + weight);
 }
 
-void film_store_cryptomatte_sample(FilmSample dst, int cryptomatte_layer_id, float hash){
-    float weight = dst.weight;
+void film_store_cryptomatte_sample(FilmSample dst, int cryptomatte_layer_id, float hash)
+{
+  float weight = dst.weight;
 
-    for (int i = 0; i < film_buf.cryptomatte_samples_len/2; i ++) {
-        ivec3 img_co = ivec3(dst.texel, i);
-        vec4 sample_pair = imageLoad(cryptomatte_img, img_co);
-        if (can_merge_cryptomatte_sample(sample_pair.xy, hash)) {
-            sample_pair.xy = merge_cryptomatte_sample(sample_pair.xy, hash, weight);
-        }
-        else if (can_merge_cryptomatte_sample(sample_pair.zw, hash)) {
-            sample_pair.zw = merge_cryptomatte_sample(sample_pair.zw, hash, weight);
-        }
-        else if (i == film_buf.cryptomatte_samples_len / 2 -1) {
-            // TODO: new hash, no space, we should compare/overwrite lowest sample.
-            continue;
-        }
-        else {
-            continue;
-        }
-        imageStore(cryptomatte_img, img_co, sample_pair);
-        break;
-    }   
+  for (int i = 0; i < film_buf.cryptomatte_samples_len / 2; i++) {
+    ivec3 img_co = ivec3(dst.texel, i);
+    vec4 sample_pair = imageLoad(cryptomatte_img, img_co);
+    if (can_merge_cryptomatte_sample(sample_pair.xy, hash)) {
+      sample_pair.xy = merge_cryptomatte_sample(sample_pair.xy, hash, weight);
+    }
+    else if (can_merge_cryptomatte_sample(sample_pair.zw, hash)) {
+      sample_pair.zw = merge_cryptomatte_sample(sample_pair.zw, hash, weight);
+    }
+    else if (i == film_buf.cryptomatte_samples_len / 2 - 1) {
+      // TODO: new hash, no space, we should compare/overwrite lowest sample.
+      continue;
+    }
+    else {
+      continue;
+    }
+    imageStore(cryptomatte_img, img_co, sample_pair);
+    break;
+  }
 }
+
+vec4 cryptomatte_false_color(float hash)
+{
+  /* TODO(jbakker): implement this (see CryptomatteOperationm::execute_pixel). */
+  return vec4(hash, 0.0, 0.0, 1.0);
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_film_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_film_frag.glsl
index 26040234fd0..0e9bf27571a 100644
--- a/source/blender/draw/engines/eevee_next/shaders/eevee_film_frag.glsl
+++ b/source/blender/draw/engines/eevee_next/shaders/eevee_film_frag.glsl
@@ -13,13 +13,17 @@ void main()
     if (film_buf.display_id == -1) {
       out_color = texelFetch(in_combined_tx, texel_film, 0);
     }
-    else if (film_buf.display_is_value) {
+    else if (film_buf.display_mode == DISPLAY_MODE_VALUE) {
       out_color.rgb = imageLoad(value_accum_img, ivec3(texel_film, film_buf.display_id)).rrr;
       out_color.a = 1.0;
     }
-    else {
+    else if (film_buf.display_mode == DISPLAY_MODE_COLOR) {
       out_color = imageLoad(color_accum_img, ivec3(texel_film, film_buf.display_id));
     }
+    else /* DISPLAY_MODE_CRYPTOMATTE */ {
+      out_color = cryptomatte_false_color(
+          imageLoad(cryptomatte_img, ivec3(texel_film, film_buf.display_id)).r);
+    }
   }
   else {
     film_process_data(texel_film, out_color, out_depth);



More information about the Bf-blender-cvs mailing list