[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