[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