Blender  V3.3
Functions
eevee_cryptomatte.c File Reference
#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.

Functions

void EEVEE_cryptomatte_free (EEVEE_Data *vedata)
 
Data Management cryptomatte accum buffer
BLI_INLINE eViewLayerCryptomatteFlags eevee_cryptomatte_active_layers (const ViewLayer *view_layer)
 
BLI_INLINE int eevee_cryptomatte_layers_count (const ViewLayer *view_layer)
 
BLI_INLINE int eevee_cryptomatte_passes_per_layer (const ViewLayer *view_layer)
 
BLI_INLINE int eevee_cryptomatte_layer_stride (const ViewLayer *view_layer)
 
BLI_INLINE int eevee_cryptomatte_layer_offset (const ViewLayer *view_layer, const int layer)
 
BLI_INLINE int eevee_cryptomatte_pixel_stride (const ViewLayer *view_layer)
 
Init Render-Passes
void EEVEE_cryptomatte_renderpasses_init (EEVEE_Data *vedata)
 
void EEVEE_cryptomatte_output_init (EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, int UNUSED(tot_samples))
 
Populate Cache
void EEVEE_cryptomatte_cache_init (EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
 
static DRWShadingGroupeevee_cryptomatte_shading_group_create (EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, Material *material, bool is_hair)
 
static void eevee_cryptomatte_curves_cache_populate (EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob, ParticleSystem *psys, ModifierData *md, Material *material)
 
void EEVEE_cryptomatte_object_curves_cache_populate (EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob)
 
void EEVEE_cryptomatte_particle_hair_cache_populate (EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob)
 
void EEVEE_cryptomatte_cache_populate (EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata, Object *ob)
 
Accumulate Samples
static void eevee_cryptomatte_download_buffer (EEVEE_Data *vedata, GPUFrameBuffer *framebuffer)
 
void EEVEE_cryptomatte_output_accumulate (EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
 
Update Render Passes
void EEVEE_cryptomatte_update_passes (RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
 
Construct Render Result
static int eevee_cryptomatte_sample_cmp_reverse (const void *a_, const void *b_)
 
static void eevee_cryptomatte_postprocess_weights (EEVEE_Data *vedata)
 
static void eevee_cryptomatte_extract_render_passes (RenderLayer *rl, const char *viewname, const char *render_pass_name_format, EEVEE_CryptomatteSample *accum_buffer, const int num_cryptomatte_passes, const int num_cryptomatte_levels, const int accum_pixel_stride, const int layer_stride, const int layer_index, const int rect_width, const int rect_height, const int rect_offset_x, const int rect_offset_y, const int viewport_width)
 
void EEVEE_cryptomatte_render_result (RenderLayer *rl, const char *viewname, const rcti *rect, EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata))
 
void EEVEE_cryptomatte_store_metadata (EEVEE_Data *vedata, RenderResult *render_result)
 

Detailed Description

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

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.

Function Documentation

◆ eevee_cryptomatte_active_layers()

BLI_INLINE eViewLayerCryptomatteFlags eevee_cryptomatte_active_layers ( const ViewLayer view_layer)

◆ EEVEE_cryptomatte_cache_init()

void EEVEE_cryptomatte_cache_init ( EEVEE_ViewLayerData UNUSEDsldata,
EEVEE_Data vedata 
)

◆ EEVEE_cryptomatte_cache_populate()

void EEVEE_cryptomatte_cache_populate ( EEVEE_Data vedata,
EEVEE_ViewLayerData sldata,
Object ob 
)

◆ eevee_cryptomatte_curves_cache_populate()

static void eevee_cryptomatte_curves_cache_populate ( EEVEE_Data vedata,
EEVEE_ViewLayerData sldata,
Object ob,
ParticleSystem psys,
ModifierData md,
Material material 
)
static

◆ eevee_cryptomatte_download_buffer()

static void eevee_cryptomatte_download_buffer ( EEVEE_Data vedata,
GPUFrameBuffer framebuffer 
)
static

◆ eevee_cryptomatte_extract_render_passes()

static void eevee_cryptomatte_extract_render_passes ( RenderLayer rl,
const char *  viewname,
const char *  render_pass_name_format,
EEVEE_CryptomatteSample accum_buffer,
const int  num_cryptomatte_passes,
const int  num_cryptomatte_levels,
const int  accum_pixel_stride,
const int  layer_stride,
const int  layer_index,
const int  rect_width,
const int  rect_height,
const int  rect_offset_x,
const int  rect_offset_y,
const int  viewport_width 
)
static

◆ EEVEE_cryptomatte_free()

void EEVEE_cryptomatte_free ( EEVEE_Data vedata)

◆ eevee_cryptomatte_layer_offset()

BLI_INLINE int eevee_cryptomatte_layer_offset ( const ViewLayer view_layer,
const int  layer 
)

◆ eevee_cryptomatte_layer_stride()

BLI_INLINE int eevee_cryptomatte_layer_stride ( const ViewLayer view_layer)

◆ eevee_cryptomatte_layers_count()

BLI_INLINE int eevee_cryptomatte_layers_count ( const ViewLayer view_layer)

◆ EEVEE_cryptomatte_object_curves_cache_populate()

void EEVEE_cryptomatte_object_curves_cache_populate ( EEVEE_Data vedata,
EEVEE_ViewLayerData sldata,
Object ob 
)

◆ EEVEE_cryptomatte_output_accumulate()

void EEVEE_cryptomatte_output_accumulate ( EEVEE_ViewLayerData UNUSEDsldata,
EEVEE_Data vedata 
)

◆ EEVEE_cryptomatte_output_init()

void EEVEE_cryptomatte_output_init ( EEVEE_ViewLayerData UNUSEDsldata,
EEVEE_Data vedata,
int   UNUSEDtot_samples 
)

◆ EEVEE_cryptomatte_particle_hair_cache_populate()

void EEVEE_cryptomatte_particle_hair_cache_populate ( EEVEE_Data vedata,
EEVEE_ViewLayerData sldata,
Object ob 
)

◆ eevee_cryptomatte_passes_per_layer()

BLI_INLINE int eevee_cryptomatte_passes_per_layer ( const ViewLayer view_layer)

◆ eevee_cryptomatte_pixel_stride()

BLI_INLINE int eevee_cryptomatte_pixel_stride ( const ViewLayer view_layer)

◆ eevee_cryptomatte_postprocess_weights()

static void eevee_cryptomatte_postprocess_weights ( EEVEE_Data vedata)
static

◆ EEVEE_cryptomatte_render_result()

void EEVEE_cryptomatte_render_result ( RenderLayer rl,
const char *  viewname,
const rcti rect,
EEVEE_Data vedata,
EEVEE_ViewLayerData UNUSEDsldata 
)

◆ EEVEE_cryptomatte_renderpasses_init()

void EEVEE_cryptomatte_renderpasses_init ( EEVEE_Data vedata)

◆ eevee_cryptomatte_sample_cmp_reverse()

static int eevee_cryptomatte_sample_cmp_reverse ( const void a_,
const void b_ 
)
static

Definition at line 462 of file eevee_cryptomatte.c.

References Freestyle::a, and usdtokens::b().

Referenced by eevee_cryptomatte_postprocess_weights().

◆ eevee_cryptomatte_shading_group_create()

static DRWShadingGroup* eevee_cryptomatte_shading_group_create ( EEVEE_Data vedata,
EEVEE_ViewLayerData sldata,
Object ob,
Material material,
bool  is_hair 
)
static

◆ EEVEE_cryptomatte_store_metadata()

void EEVEE_cryptomatte_store_metadata ( EEVEE_Data vedata,
RenderResult render_result 
)

◆ EEVEE_cryptomatte_update_passes()

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().