Blender
V3.3
|
#include "DRW_engine.h"
#include "DRW_render.h"
#include "BKE_cryptomatte.h"
#include "GPU_batch.h"
#include "RE_pipeline.h"
#include "BLI_alloca.h"
#include "BLI_math_bits.h"
#include "BLI_rect.h"
#include "DNA_curves_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_particle_types.h"
#include "eevee_private.h"
Go to the source code of this file.
This file implements Cryptomatte for EEVEE. Cryptomatte is used to extract mattes using information already available at render time. See https://raw.githubusercontent.com/Psyop/Cryptomatte/master/specification/IDmattes_poster.pdf for reference to the cryptomatte specification.
The challenge with cryptomatte in EEVEE is the merging and sorting of the samples. User can enable up to 3 cryptomatte layers (Object, Material and Asset).
Process
cryptomatte_download_buffer
).Accurate mode
There are two accuracy modes. The difference between the two is the number of render samples they take into account to create the render passes. When accurate mode is off the number of levels is used as the number of cryptomatte samples to take. When accuracy mode is on the number of render samples is used.
Definition in file eevee_cryptomatte.c.
BLI_INLINE eViewLayerCryptomatteFlags eevee_cryptomatte_active_layers | ( | const ViewLayer * | view_layer | ) |
Definition at line 55 of file eevee_cryptomatte.c.
References ViewLayer::cryptomatte_flag, and VIEW_LAYER_CRYPTOMATTE_ALL.
Referenced by EEVEE_cryptomatte_cache_populate(), eevee_cryptomatte_layers_count(), EEVEE_cryptomatte_renderpasses_init(), and eevee_cryptomatte_shading_group_create().
void EEVEE_cryptomatte_cache_init | ( | EEVEE_ViewLayerData * | UNUSEDsldata, |
EEVEE_Data * | vedata | ||
) |
Definition at line 184 of file eevee_cryptomatte.c.
References EEVEE_PassList::cryptomatte_ps, DRW_PASS_CREATE, DRW_STATE_DEPTH_EQUAL, DRW_STATE_WRITE_COLOR, EEVEE_RENDER_PASS_CRYPTOMATTE, EEVEE_StorageList::g_data, EEVEE_Data::psl, EEVEE_PrivateData::render_passes, and EEVEE_Data::stl.
Referenced by EEVEE_render_cache_init().
void EEVEE_cryptomatte_cache_populate | ( | EEVEE_Data * | vedata, |
EEVEE_ViewLayerData * | sldata, | ||
Object * | ob | ||
) |
Definition at line 285 of file eevee_cryptomatte.c.
References BKE_object_material_get_eval(), BLI_array_alloca, DRW_cache_object_material_count_get(), DRW_cache_object_surface_get(), DRW_cache_object_surface_material_get(), DRW_context_state_get(), DRW_shgroup_call, eevee_cryptomatte_active_layers(), eevee_cryptomatte_shading_group_create(), GPUBatch, material, NULL, DRWContextState::view_layer, and VIEW_LAYER_CRYPTOMATTE_MATERIAL.
Referenced by EEVEE_render_cache().
|
static |
Definition at line 234 of file eevee_cryptomatte.c.
References DRW_shgroup_hair_create_sub(), eevee_cryptomatte_shading_group_create(), material, and NULL.
Referenced by EEVEE_cryptomatte_particle_hair_cache_populate().
|
static |
Definition at line 329 of file eevee_cryptomatte.c.
References BLI_assert, ViewLayer::cryptomatte_levels, DRW_context_state_get(), DRW_viewport_size_get(), eevee_cryptomatte_layer_offset(), eevee_cryptomatte_layers_count(), eevee_cryptomatte_pixel_stride(), EEVEE_StorageList::g_data, g_data, GPU_DATA_FLOAT, GPU_framebuffer_read_color(), sample, EEVEE_Data::stl, and DRWContextState::view_layer.
Referenced by EEVEE_cryptomatte_output_accumulate().
|
static |
Definition at line 559 of file eevee_cryptomatte.c.
References BLI_snprintf_rlen(), EEVEE_CryptomatteSample::hash, MAX_NAME, RE_pass_find_by_name(), RenderPass::rect, rect_height(), rect_width(), EEVEE_CryptomatteSample::weight, x, and y.
Referenced by EEVEE_cryptomatte_render_result().
void EEVEE_cryptomatte_free | ( | EEVEE_Data * | vedata | ) |
Definition at line 701 of file eevee_cryptomatte.c.
References BKE_cryptomatte_free(), EEVEE_StorageList::g_data, g_data, MEM_SAFE_FREE, NULL, and EEVEE_Data::stl.
Referenced by eevee_store_metadata().
BLI_INLINE int eevee_cryptomatte_layer_offset | ( | const ViewLayer * | view_layer, |
const int | layer | ||
) |
Definition at line 84 of file eevee_cryptomatte.c.
References ViewLayer::cryptomatte_levels.
Referenced by eevee_cryptomatte_download_buffer(), and eevee_cryptomatte_postprocess_weights().
BLI_INLINE int eevee_cryptomatte_layer_stride | ( | const ViewLayer * | view_layer | ) |
Definition at line 79 of file eevee_cryptomatte.c.
References ViewLayer::cryptomatte_levels.
Referenced by eevee_cryptomatte_pixel_stride(), and EEVEE_cryptomatte_render_result().
BLI_INLINE int eevee_cryptomatte_layers_count | ( | const ViewLayer * | view_layer | ) |
Definition at line 63 of file eevee_cryptomatte.c.
References count_bits_i(), and eevee_cryptomatte_active_layers().
Referenced by eevee_cryptomatte_download_buffer(), EEVEE_cryptomatte_output_init(), eevee_cryptomatte_pixel_stride(), and eevee_cryptomatte_postprocess_weights().
void EEVEE_cryptomatte_object_curves_cache_populate | ( | EEVEE_Data * | vedata, |
EEVEE_ViewLayerData * | sldata, | ||
Object * | ob | ||
) |
Definition at line 246 of file eevee_cryptomatte.c.
References BKE_object_material_get_eval(), BLI_assert, CURVES_MATERIAL_NR, DRW_shgroup_curves_create_sub(), eevee_cryptomatte_shading_group_create(), material, NULL, OB_CURVES, and Object::type.
Referenced by EEVEE_render_cache().
void EEVEE_cryptomatte_output_accumulate | ( | EEVEE_ViewLayerData * | UNUSEDsldata, |
EEVEE_Data * | vedata | ||
) |
Definition at line 389 of file eevee_cryptomatte.c.
References EEVEE_FramebufferList::cryptomatte_fb, ViewLayer::cryptomatte_levels, EEVEE_PassList::cryptomatte_ps, DRW_context_state_get(), DRW_draw_pass(), eevee_cryptomatte_download_buffer(), EEVEE_StorageList::effects, EEVEE_Data::fbl, EEVEE_StorageList::g_data, g_data, GPU_framebuffer_bind(), EEVEE_FramebufferList::main_fb, EEVEE_Data::psl, EEVEE_Data::stl, EEVEE_EffectsInfo::taa_current_sample, and DRWContextState::view_layer.
Referenced by EEVEE_renderpasses_output_accumulate().
void EEVEE_cryptomatte_output_init | ( | EEVEE_ViewLayerData * | UNUSEDsldata, |
EEVEE_Data * | vedata, | ||
int | UNUSEDtot_samples | ||
) |
Definition at line 132 of file eevee_cryptomatte.c.
References EEVEE_TextureList::cryptomatte, EEVEE_FramebufferList::cryptomatte_fb, DRW_context_state_get(), DRW_texture_ensure_fullscreen_2d(), DRW_viewport_size_get(), DRW_viewport_texture_list_get(), eevee_cryptomatte_layers_count(), eevee_cryptomatte_pixel_stride(), EEVEE_Data::fbl, EEVEE_StorageList::g_data, g_data, GPU_R32F, GPU_RG32F, GPU_RGBA32F, MEM_calloc_arrayN, MEM_malloc_arrayN, NULL, EEVEE_Data::stl, EEVEE_Data::txl, and DRWContextState::view_layer.
Referenced by EEVEE_renderpasses_output_init().
void EEVEE_cryptomatte_particle_hair_cache_populate | ( | EEVEE_Data * | vedata, |
EEVEE_ViewLayerData * | sldata, | ||
Object * | ob | ||
) |
Definition at line 257 of file eevee_cryptomatte.c.
References BKE_object_material_get_eval(), ParticleSettings::draw_as, DRW_context_state_get(), DRW_object_is_visible_psys_in_active_context(), eevee_cryptomatte_curves_cache_populate(), eModifierType_ParticleSystem, if(), LISTBASE_FOREACH, material, Object::modifiers, OB_MESH, DRWContextState::object_edit, ParticleSettings::omat, ParticleSystem::part, PART_DRAW_PATH, PART_DRAW_REND, ParticleSettings::ren_as, and Object::type.
Referenced by EEVEE_render_cache().
BLI_INLINE int eevee_cryptomatte_passes_per_layer | ( | const ViewLayer * | view_layer | ) |
Definition at line 72 of file eevee_cryptomatte.c.
References ViewLayer::cryptomatte_levels.
Referenced by EEVEE_cryptomatte_render_result(), and EEVEE_cryptomatte_update_passes().
BLI_INLINE int eevee_cryptomatte_pixel_stride | ( | const ViewLayer * | view_layer | ) |
Definition at line 89 of file eevee_cryptomatte.c.
References eevee_cryptomatte_layer_stride(), and eevee_cryptomatte_layers_count().
Referenced by eevee_cryptomatte_download_buffer(), EEVEE_cryptomatte_output_init(), eevee_cryptomatte_postprocess_weights(), and EEVEE_cryptomatte_render_result().
|
static |
Definition at line 478 of file eevee_cryptomatte.c.
References BLI_assert, ViewLayer::cryptomatte_levels, DRW_context_state_get(), DRW_viewport_size_get(), eevee_cryptomatte_layer_offset(), eevee_cryptomatte_layers_count(), eevee_cryptomatte_pixel_stride(), eevee_cryptomatte_sample_cmp_reverse(), EFFECT_VOLUMETRIC, EEVEE_StorageList::effects, EEVEE_EffectsInfo::enabled_effects, EEVEE_StorageList::g_data, g_data, GPU_DATA_FLOAT, GPU_texture_read(), MEM_freeN, NULL, num_samples, sample, EEVEE_Data::stl, EEVEE_EffectsInfo::taa_current_sample, EEVEE_Data::txl, DRWContextState::view_layer, and EEVEE_TextureList::volume_transmittance_accum.
Referenced by EEVEE_cryptomatte_render_result().
void EEVEE_cryptomatte_render_result | ( | RenderLayer * | rl, |
const char * | viewname, | ||
const rcti * | rect, | ||
EEVEE_Data * | vedata, | ||
EEVEE_ViewLayerData * | UNUSEDsldata | ||
) |
Definition at line 608 of file eevee_cryptomatte.c.
References BLI_assert, BLI_rcti_size_x(), BLI_rcti_size_y(), ViewLayer::cryptomatte_flag, ViewLayer::cryptomatte_levels, DRW_context_state_get(), DRW_viewport_size_get(), eevee_cryptomatte_extract_render_passes(), eevee_cryptomatte_layer_stride(), eevee_cryptomatte_passes_per_layer(), eevee_cryptomatte_pixel_stride(), eevee_cryptomatte_postprocess_weights(), EEVEE_StorageList::g_data, g_data, EEVEE_PrivateData::overscan_pixels, rect_height(), rect_width(), EEVEE_Data::stl, DRWContextState::view_layer, VIEW_LAYER_CRYPTOMATTE_ALL, VIEW_LAYER_CRYPTOMATTE_ASSET, VIEW_LAYER_CRYPTOMATTE_MATERIAL, VIEW_LAYER_CRYPTOMATTE_OBJECT, rcti::xmin, and rcti::ymin.
Referenced by eevee_render_result_cryptomatte().
void EEVEE_cryptomatte_renderpasses_init | ( | EEVEE_Data * | vedata | ) |
Definition at line 100 of file eevee_cryptomatte.c.
References BKE_cryptomatte_add_layer(), BKE_cryptomatte_init(), ViewLayer::cryptomatte_flag, DRW_context_state_get(), DRW_state_is_scene_render(), eevee_cryptomatte_active_layers(), EEVEE_RENDER_PASS_CRYPTOMATTE, EEVEE_RENDER_PASS_VOLUME_LIGHT, EEVEE_StorageList::g_data, g_data, EEVEE_Data::stl, DRWContextState::view_layer, VIEW_LAYER_CRYPTOMATTE_ACCURATE, VIEW_LAYER_CRYPTOMATTE_ASSET, VIEW_LAYER_CRYPTOMATTE_MATERIAL, and VIEW_LAYER_CRYPTOMATTE_OBJECT.
Referenced by EEVEE_renderpasses_init().
Definition at line 462 of file eevee_cryptomatte.c.
References Freestyle::a, and usdtokens::b().
Referenced by eevee_cryptomatte_postprocess_weights().
|
static |
Definition at line 192 of file eevee_cryptomatte.c.
References BKE_cryptomatte_asset_hash(), BKE_cryptomatte_hash_to_float(), BKE_cryptomatte_material_hash(), BKE_cryptomatte_object_hash(), EEVEE_PassList::cryptomatte_ps, DRW_context_state_get(), DRW_shgroup_create(), DRW_shgroup_uniform_block, DRW_shgroup_uniform_vec4_copy(), eevee_cryptomatte_active_layers(), EEVEE_shaders_cryptomatte_sh_get(), EEVEE_StorageList::g_data, g_data, material, EEVEE_Data::psl, EEVEE_ViewLayerData::shadow_ubo, EEVEE_Data::stl, DRWContextState::view_layer, VIEW_LAYER_CRYPTOMATTE_ASSET, VIEW_LAYER_CRYPTOMATTE_MATERIAL, and VIEW_LAYER_CRYPTOMATTE_OBJECT.
Referenced by EEVEE_cryptomatte_cache_populate(), eevee_cryptomatte_curves_cache_populate(), and EEVEE_cryptomatte_object_curves_cache_populate().
void EEVEE_cryptomatte_store_metadata | ( | EEVEE_Data * | vedata, |
RenderResult * | render_result | ||
) |
Definition at line 689 of file eevee_cryptomatte.c.
References BKE_cryptomatte_store_metadata(), BLI_assert, DRW_context_state_get(), EEVEE_StorageList::g_data, g_data, EEVEE_Data::stl, and DRWContextState::view_layer.
Referenced by eevee_store_metadata().
void EEVEE_cryptomatte_update_passes | ( | struct RenderEngine * | engine, |
struct Scene * | scene, | ||
struct ViewLayer * | view_layer | ||
) |
Register the render passes needed for cryptomatte normally this is done in EEVEE_render_update_passes
, but it has been placed here to keep related code side-by-side for clarity.
Definition at line 423 of file eevee_cryptomatte.c.
References BLI_snprintf_rlen(), ViewLayer::cryptomatte_flag, eevee_cryptomatte_passes_per_layer(), MAX_NAME, RE_engine_register_pass(), scene, SOCK_RGBA, VIEW_LAYER_CRYPTOMATTE_ASSET, VIEW_LAYER_CRYPTOMATTE_MATERIAL, and VIEW_LAYER_CRYPTOMATTE_OBJECT.
Referenced by EEVEE_render_update_passes().