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 DRWShadingGroup * eevee_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().