Blender  V3.3
eevee_renderpasses.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2019 Blender Foundation. */
3 
8 #include "DRW_engine.h"
9 #include "DRW_render.h"
10 
11 #include "draw_color_management.h" /* TODO: remove dependency. */
12 
13 #include "BKE_global.h" /* for G.debug_value */
14 
15 #include "BLI_hash.h"
16 #include "BLI_string_utils.h"
17 
18 #include "DEG_depsgraph_query.h"
19 
20 #include "eevee_private.h"
21 
34 
35 /* bitmask containing all renderpasses that need post-processing */
36 #define EEVEE_RENDERPASSES_WITH_POST_PROCESSING \
37  (EEVEE_RENDER_PASS_Z | EEVEE_RENDER_PASS_MIST | EEVEE_RENDER_PASS_NORMAL | \
38  EEVEE_RENDER_PASS_AO | EEVEE_RENDER_PASS_BLOOM | EEVEE_RENDER_PASS_VOLUME_LIGHT | \
39  EEVEE_RENDER_PASS_SHADOW | EEVEE_RENDERPASSES_MATERIAL)
40 
41 #define EEVEE_RENDERPASSES_ALL \
42  (EEVEE_RENDERPASSES_WITH_POST_PROCESSING | EEVEE_RENDER_PASS_COMBINED)
43 
44 #define EEVEE_RENDERPASSES_POST_PROCESS_ON_FIRST_SAMPLE \
45  (EEVEE_RENDER_PASS_Z | EEVEE_RENDER_PASS_NORMAL)
46 
47 #define EEVEE_RENDERPASSES_COLOR_PASS \
48  (EEVEE_RENDER_PASS_DIFFUSE_COLOR | EEVEE_RENDER_PASS_SPECULAR_COLOR | EEVEE_RENDER_PASS_EMIT | \
49  EEVEE_RENDER_PASS_BLOOM)
50 #define EEVEE_RENDERPASSES_LIGHT_PASS \
51  (EEVEE_RENDER_PASS_DIFFUSE_LIGHT | EEVEE_RENDER_PASS_SPECULAR_LIGHT)
52 /* Render passes that uses volume transmittance when available */
53 #define EEVEE_RENDERPASSES_USES_TRANSMITTANCE \
54  (EEVEE_RENDER_PASS_DIFFUSE_COLOR | EEVEE_RENDER_PASS_SPECULAR_COLOR | EEVEE_RENDER_PASS_EMIT | \
55  EEVEE_RENDER_PASS_ENVIRONMENT)
57 {
58  EEVEE_StorageList *stl = vedata->stl;
60  return (g_data->render_passes & ~EEVEE_RENDERPASSES_POST_PROCESS_ON_FIRST_SAMPLE) == 0;
61 }
62 
64 {
65  uint hash = BLI_hash_string(aov->name) << 1u;
67  return hash;
68 }
69 
71 {
72  const DRWContextState *draw_ctx = DRW_context_state_get();
73  EEVEE_StorageList *stl = vedata->stl;
75  ViewLayer *view_layer = draw_ctx->view_layer;
76  View3D *v3d = draw_ctx->v3d;
77 
78  if (v3d) {
79  const Scene *scene = draw_ctx->scene;
80  eViewLayerEEVEEPassType render_pass = v3d->shading.render_pass;
81  g_data->aov_hash = 0;
82 
83  if (render_pass == EEVEE_RENDER_PASS_BLOOM &&
85  render_pass = EEVEE_RENDER_PASS_COMBINED;
86  }
87  if (render_pass == EEVEE_RENDER_PASS_AOV) {
89  &view_layer->aovs, v3d->shading.aov_name, offsetof(ViewLayerAOV, name));
90  if (aov != NULL) {
91  g_data->aov_hash = EEVEE_renderpasses_aov_hash(aov);
92  }
93  else {
94  /* AOV not found in view layer. */
95  render_pass = EEVEE_RENDER_PASS_COMBINED;
96  }
97  }
98 
99  g_data->render_passes = render_pass;
100  }
101  else {
102  eViewLayerEEVEEPassType enabled_render_passes = view_layer->eevee.render_passes;
103 
104 #define ENABLE_FROM_LEGACY(name_legacy, name_eevee) \
105  SET_FLAG_FROM_TEST(enabled_render_passes, \
106  (view_layer->passflag & SCE_PASS_##name_legacy) != 0, \
107  EEVEE_RENDER_PASS_##name_eevee);
108 
110  ENABLE_FROM_LEGACY(MIST, MIST)
112  ENABLE_FROM_LEGACY(SHADOW, SHADOW)
113  ENABLE_FROM_LEGACY(AO, AO)
114  ENABLE_FROM_LEGACY(EMIT, EMIT)
115  ENABLE_FROM_LEGACY(ENVIRONMENT, ENVIRONMENT)
116  ENABLE_FROM_LEGACY(DIFFUSE_COLOR, DIFFUSE_COLOR)
117  ENABLE_FROM_LEGACY(GLOSSY_COLOR, SPECULAR_COLOR)
118  ENABLE_FROM_LEGACY(DIFFUSE_DIRECT, DIFFUSE_LIGHT)
119  ENABLE_FROM_LEGACY(GLOSSY_DIRECT, SPECULAR_LIGHT)
120 
121  ENABLE_FROM_LEGACY(ENVIRONMENT, ENVIRONMENT)
122 
123 #undef ENABLE_FROM_LEGACY
124  if (DRW_state_is_image_render() && !BLI_listbase_is_empty(&view_layer->aovs)) {
125  enabled_render_passes |= EEVEE_RENDER_PASS_AOV;
126  g_data->aov_hash = EEVEE_AOV_HASH_ALL;
127  }
128 
129  g_data->render_passes = (enabled_render_passes & EEVEE_RENDERPASSES_ALL) |
131  }
134 }
135 
137  const EEVEE_PrivateData *g_data)
138 {
139  if (effects->enabled_effects & EFFECT_VOLUMETRIC) {
140  if (g_data->render_passes &
142  return true;
143  }
144  }
145  return false;
146 }
147 
149  EEVEE_Data *vedata,
150  uint tot_samples)
151 {
152  EEVEE_FramebufferList *fbl = vedata->fbl;
153  EEVEE_TextureList *txl = vedata->txl;
154  EEVEE_StorageList *stl = vedata->stl;
155  EEVEE_EffectsInfo *effects = stl->effects;
157 
158  const bool needs_post_processing = (g_data->render_passes &
160  if (needs_post_processing) {
161  /* Create FrameBuffer. */
162 
163  /* Should be enough to store the data needs for a single pass.
164  * Some passes will use less, but it is only relevant for final renderings and
165  * when renderpasses other than `EEVEE_RENDER_PASS_COMBINED` are requested */
167  GPU_framebuffer_ensure_config(&fbl->renderpass_fb,
168  {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->renderpass)});
169 
170  if ((g_data->render_passes & EEVEE_RENDERPASSES_MATERIAL) != 0) {
171  EEVEE_material_output_init(sldata, vedata, tot_samples);
172  }
173 
174  if ((g_data->render_passes & EEVEE_RENDER_PASS_MIST) != 0) {
175  EEVEE_mist_output_init(sldata, vedata);
176  }
177  if ((g_data->render_passes & EEVEE_RENDER_PASS_SHADOW) != 0) {
178  EEVEE_shadow_output_init(sldata, vedata, tot_samples);
179  }
180 
181  if ((g_data->render_passes & EEVEE_RENDER_PASS_AO) != 0) {
182  EEVEE_occlusion_output_init(sldata, vedata, tot_samples);
183  }
184 
185  if ((g_data->render_passes & EEVEE_RENDER_PASS_BLOOM) != 0 &&
186  (effects->enabled_effects & EFFECT_BLOOM) != 0) {
187  EEVEE_bloom_output_init(sldata, vedata, tot_samples);
188  }
189 
191  EEVEE_volumes_output_init(sldata, vedata, tot_samples);
192  }
193 
194  /* We set a default texture as not all post processes uses the inputBuffer. */
195  g_data->renderpass_input = txl->color;
196  g_data->renderpass_col_input = txl->color;
197  g_data->renderpass_light_input = txl->color;
198  g_data->renderpass_transmittance_input = txl->color;
199  }
200  else {
201  /* Free unneeded memory */
203  GPU_FRAMEBUFFER_FREE_SAFE(fbl->renderpass_fb);
204  }
205 
206  /* Cryptomatte doesn't use the GPU shader for post processing */
207  if ((g_data->render_passes & (EEVEE_RENDER_PASS_CRYPTOMATTE)) != 0) {
208  EEVEE_cryptomatte_output_init(sldata, vedata, tot_samples);
209  }
210 }
211 
213 {
214  EEVEE_PassList *psl = vedata->psl;
215  EEVEE_PrivateData *g_data = vedata->stl->g_data;
217 
218  const bool needs_post_processing = (g_data->render_passes &
220  if (needs_post_processing) {
223  psl->renderpass_pass);
224  DRW_shgroup_uniform_texture_ref(grp, "inputBuffer", &g_data->renderpass_input);
225  DRW_shgroup_uniform_texture_ref(grp, "inputColorBuffer", &g_data->renderpass_col_input);
227  grp, "inputSecondLightBuffer", &g_data->renderpass_light_input);
229  grp, "inputTransmittanceBuffer", &g_data->renderpass_transmittance_input);
230  DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
231  DRW_shgroup_uniform_block_ref(grp, "common_block", &sldata->common_ubo);
232  DRW_shgroup_uniform_block_ref(grp, "renderpass_block", &sldata->renderpass_ubo.combined);
233  DRW_shgroup_uniform_int(grp, "currentSample", &g_data->renderpass_current_sample, 1);
234  DRW_shgroup_uniform_int(grp, "renderpassType", &g_data->renderpass_type, 1);
235  DRW_shgroup_uniform_int(grp, "postProcessType", &g_data->renderpass_postprocess, 1);
237  }
238  else {
239  psl->renderpass_pass = NULL;
240  }
241 }
242 
244  EEVEE_Data *vedata,
245  eViewLayerEEVEEPassType renderpass_type,
246  int aov_index)
247 {
248  EEVEE_PassList *psl = vedata->psl;
249  EEVEE_TextureList *txl = vedata->txl;
250  EEVEE_FramebufferList *fbl = vedata->fbl;
251  EEVEE_StorageList *stl = vedata->stl;
253  EEVEE_EffectsInfo *effects = stl->effects;
254 
255  /* Compensate for taa_current_sample being incremented after last drawing in
256  * EEVEE_temporal_sampling_draw when DRW_state_is_image_render(). */
257  const int current_sample = DRW_state_is_image_render() ? effects->taa_current_sample - 1 :
258  effects->taa_current_sample;
259  g_data->renderpass_current_sample = current_sample;
260  g_data->renderpass_type = renderpass_type;
261  g_data->renderpass_postprocess = PASS_POST_UNDEFINED;
262  const bool volumetric_active = eevee_renderpasses_volumetric_active(effects, g_data);
263  eRenderPassPostProcessType default_color_pass_type =
265  g_data->renderpass_transmittance_input = volumetric_active ? txl->volume_transmittance_accum :
266  txl->color;
267 
268  if (!volumetric_active && renderpass_type == EEVEE_RENDER_PASS_VOLUME_LIGHT) {
269  /* Early exit: Volumetric effect is off, but the volume light pass was requested. */
270  static float clear_col[4] = {0.0f};
272  GPU_framebuffer_clear_color(fbl->renderpass_fb, clear_col);
273  return;
274  }
275 
276  switch (renderpass_type) {
277  case EEVEE_RENDER_PASS_Z: {
278  g_data->renderpass_postprocess = PASS_POST_DEPTH;
279  break;
280  }
281  case EEVEE_RENDER_PASS_AO: {
282  g_data->renderpass_postprocess = PASS_POST_AO;
283  g_data->renderpass_input = txl->ao_accum;
284  break;
285  }
287  g_data->renderpass_postprocess = PASS_POST_NORMAL;
288  g_data->renderpass_input = effects->ssr_normal_input;
289  break;
290  }
291  case EEVEE_RENDER_PASS_MIST: {
292  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_VALUE;
293  g_data->renderpass_input = txl->mist_accum;
294  break;
295  }
297  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_COLOR;
298  g_data->renderpass_input = txl->volume_scatter_accum;
299  break;
300  }
302  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_VALUE;
303  g_data->renderpass_input = txl->shadow_accum;
304  break;
305  }
307  g_data->renderpass_postprocess = default_color_pass_type;
308  g_data->renderpass_input = txl->diff_color_accum;
309  break;
310  }
312  g_data->renderpass_postprocess = default_color_pass_type;
313  g_data->renderpass_input = txl->spec_color_accum;
314  break;
315  }
317  g_data->renderpass_postprocess = default_color_pass_type;
318  g_data->renderpass_input = txl->env_accum;
319  break;
320  }
321  case EEVEE_RENDER_PASS_EMIT: {
322  g_data->renderpass_postprocess = default_color_pass_type;
323  g_data->renderpass_input = txl->emit_accum;
324  break;
325  }
327  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_LIGHT;
328  g_data->renderpass_input = txl->spec_light_accum;
329  g_data->renderpass_col_input = txl->spec_color_accum;
330  if ((stl->effects->enabled_effects & EFFECT_SSR) != 0) {
331  g_data->renderpass_postprocess = PASS_POST_TWO_LIGHT_BUFFERS;
332  g_data->renderpass_light_input = txl->ssr_accum;
333  }
334  else {
335  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_LIGHT;
336  }
337  break;
338  }
340  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_LIGHT;
341  g_data->renderpass_input = txl->diff_light_accum;
342  g_data->renderpass_col_input = txl->diff_color_accum;
343  if ((stl->effects->enabled_effects & EFFECT_SSS) != 0) {
344  g_data->renderpass_postprocess = PASS_POST_TWO_LIGHT_BUFFERS;
345  g_data->renderpass_light_input = txl->sss_accum;
346  }
347  else {
348  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_LIGHT;
349  }
350  break;
351  }
352  case EEVEE_RENDER_PASS_AOV: {
353  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_COLOR_ALPHA;
354  g_data->renderpass_input = txl->aov_surface_accum[aov_index];
355  break;
356  }
358  g_data->renderpass_postprocess = PASS_POST_ACCUMULATED_COLOR;
359  g_data->renderpass_input = txl->bloom_accum;
360  g_data->renderpass_current_sample = 1;
361  break;
362  }
363  default: {
364  break;
365  }
366  }
369 }
370 
372  EEVEE_Data *vedata,
373  bool post_effect)
374 {
375  EEVEE_StorageList *stl = vedata->stl;
376  EEVEE_EffectsInfo *effects = stl->effects;
378  eViewLayerEEVEEPassType render_pass = g_data->render_passes;
379 
380  if (!post_effect) {
381  if ((render_pass & EEVEE_RENDER_PASS_MIST) != 0) {
382  EEVEE_mist_output_accumulate(sldata, vedata);
383  }
384  if ((render_pass & EEVEE_RENDER_PASS_AO) != 0) {
385  EEVEE_occlusion_output_accumulate(sldata, vedata);
386  }
387  if ((render_pass & EEVEE_RENDER_PASS_SHADOW) != 0) {
388  EEVEE_shadow_output_accumulate(sldata, vedata);
389  }
390  if ((render_pass & EEVEE_RENDERPASSES_MATERIAL) != 0) {
391  EEVEE_material_output_accumulate(sldata, vedata);
392  }
394  EEVEE_volumes_output_accumulate(sldata, vedata);
395  }
396  if ((render_pass & EEVEE_RENDER_PASS_CRYPTOMATTE) != 0) {
397  EEVEE_cryptomatte_output_accumulate(sldata, vedata);
398  }
399  }
400  else {
401  if ((render_pass & EEVEE_RENDER_PASS_BLOOM) != 0 &&
402  (effects->enabled_effects & EFFECT_BLOOM) != 0) {
403  EEVEE_bloom_output_accumulate(sldata, vedata);
404  }
405  }
406 }
407 
409 {
410  EEVEE_FramebufferList *fbl = vedata->fbl;
411  EEVEE_TextureList *txl = vedata->txl;
412  EEVEE_StorageList *stl = vedata->stl;
413  EEVEE_EffectsInfo *effects = stl->effects;
415 
416  /* We can only draw a single render-pass. Light-passes also select their color pass
417  * (a second pass). We mask the light pass when a light pass is selected. */
418  const eViewLayerEEVEEPassType render_pass =
421  stl->g_data->render_passes;
422 
423  bool is_valid = (render_pass & EEVEE_RENDERPASSES_ALL) != 0;
424  bool needs_color_transfer = (render_pass & EEVEE_RENDERPASSES_COLOR_PASS) != 0 &&
426  UNUSED_VARS(needs_color_transfer);
427 
428  if ((render_pass & EEVEE_RENDER_PASS_BLOOM) != 0 &&
429  (effects->enabled_effects & EFFECT_BLOOM) == 0) {
430  is_valid = false;
431  }
432 
433  const int current_sample = stl->effects->taa_current_sample;
434  const int total_samples = stl->effects->taa_total_sample;
436  (current_sample > 1 && total_samples != 1)) {
437  return;
438  }
439 
440  if (is_valid) {
441  EEVEE_renderpasses_postprocess(sldata, vedata, render_pass, 0);
444  }
445  else {
446  /* Draw state is not valid for this pass, clear the buffer */
447  static float clear_color[4] = {0.0f, 0.0f, 0.0f, 1.0f};
449  GPU_framebuffer_clear_color(dfbl->default_fb, clear_color);
450  }
452 }
453 
455 {
456  EEVEE_TextureList *txl = vedata->txl;
457  EEVEE_StorageList *stl = vedata->stl;
458  EEVEE_EffectsInfo *effects = stl->effects;
459 
460  GPUTexture *tx = NULL;
461  /* Debug : Output buffer to view. */
462  switch (G.debug_value) {
463  case 1:
464  tx = txl->maxzbuffer;
465  break;
466  case 2:
467  /* UNUSED */
468  break;
469  case 3:
470  tx = effects->ssr_normal_input;
471  break;
472  case 4:
473  tx = effects->ssr_specrough_input;
474  break;
475  case 5:
476  tx = txl->color_double_buffer;
477  break;
478  case 6:
479  tx = effects->gtao_horizons_renderpass;
480  break;
481  case 7:
482  tx = effects->gtao_horizons_renderpass;
483  break;
484  case 8:
485  tx = effects->sss_irradiance;
486  break;
487  case 9:
488  tx = effects->sss_radius;
489  break;
490  case 10:
491  tx = effects->sss_albedo;
492  break;
493  case 11:
494  tx = effects->velocity_tx;
495  break;
496  default:
497  break;
498  }
499 
500  if (tx) {
501  DRW_transform_none(tx);
502  }
503 }
#define BLI_INLINE
BLI_INLINE unsigned int BLI_hash_string(const char *str)
Definition: BLI_hash.h:69
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:269
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
unsigned int uint
Definition: BLI_sys_types.h:67
#define UNUSED_VARS(...)
#define UNUSED(x)
#define SET_FLAG_FROM_TEST(value, test, flag)
eViewLayerEEVEEPassType
@ EEVEE_RENDER_PASS_AO
@ EEVEE_RENDER_PASS_NORMAL
@ EEVEE_RENDER_PASS_DIFFUSE_LIGHT
@ EEVEE_RENDER_PASS_VOLUME_LIGHT
@ EEVEE_RENDER_PASS_AOV
@ EEVEE_RENDER_PASS_BLOOM
@ EEVEE_RENDER_PASS_DIFFUSE_COLOR
@ EEVEE_RENDER_PASS_CRYPTOMATTE
@ EEVEE_RENDER_PASS_Z
@ EEVEE_RENDER_PASS_ENVIRONMENT
@ EEVEE_RENDER_PASS_COMBINED
@ EEVEE_RENDER_PASS_SPECULAR_LIGHT
@ EEVEE_RENDER_PASS_SPECULAR_COLOR
@ EEVEE_RENDER_PASS_EMIT
@ EEVEE_RENDER_PASS_MIST
@ EEVEE_RENDER_PASS_SHADOW
@ AOV_TYPE_COLOR
@ SCE_EEVEE_BLOOM_ENABLED
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
#define DRW_shgroup_uniform_block_ref(shgroup, name, ubo)
Definition: DRW_render.h:653
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
#define DRW_shgroup_call(shgroup, geom, ob)
Definition: DRW_render.h:414
#define DRW_TEXTURE_FREE_SAFE(tex)
Definition: DRW_render.h:183
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
#define Z
Definition: GeomUtils.cpp:201
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value NORMAL
Scene scene
bool is_valid
GPUBatch * DRW_cache_fullscreen_quad_get(void)
Definition: draw_cache.c:356
void DRW_transform_none(GPUTexture *tex)
bool DRW_state_is_opengl_render(void)
DefaultFramebufferList * DRW_viewport_framebuffer_list_get(void)
Definition: draw_manager.c:633
const DRWContextState * DRW_context_state_get(void)
bool DRW_state_is_image_render(void)
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:638
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
void DRW_shgroup_uniform_int(DRWShadingGroup *shgroup, const char *name, const int *value, int arraysize)
void DRW_shgroup_uniform_texture_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_draw_pass(DRWPass *pass)
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
static struct @318 g_data
void EEVEE_bloom_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
Definition: eevee_bloom.c:322
void EEVEE_bloom_output_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, uint UNUSED(tot_samples))
Definition: eevee_bloom.c:296
void EEVEE_cryptomatte_output_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, int UNUSED(tot_samples))
void EEVEE_cryptomatte_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void EEVEE_cryptomatte_renderpasses_init(EEVEE_Data *vedata)
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img GPU_RGBA16F
void EEVEE_material_renderpasses_init(EEVEE_Data *vedata)
void EEVEE_material_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_material_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
void EEVEE_mist_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
Definition: eevee_mist.c:78
void EEVEE_mist_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
Definition: eevee_mist.c:20
void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
#define EEVEE_AOV_HASH_COLOR_TYPE_MASK
#define EEVEE_RENDERPASSES_MATERIAL
@ EFFECT_SSS
@ EFFECT_BLOOM
@ EFFECT_SSR
@ EFFECT_VOLUMETRIC
void EEVEE_volumes_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_volumes_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#define EEVEE_AOV_HASH_ALL
struct GPUShader * EEVEE_shaders_renderpasses_post_process_sh_get(void)
#define EEVEE_RENDERPASSES_POST_PROCESS_ON_FIRST_SAMPLE
void EEVEE_renderpasses_postprocess(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, eViewLayerEEVEEPassType renderpass_type, int aov_index)
void EEVEE_renderpasses_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, bool post_effect)
#define EEVEE_RENDERPASSES_ALL
#define EEVEE_RENDERPASSES_USES_TRANSMITTANCE
BLI_INLINE bool eevee_renderpasses_volumetric_active(const EEVEE_EffectsInfo *effects, const EEVEE_PrivateData *g_data)
void EEVEE_renderpasses_init(EEVEE_Data *vedata)
void EEVEE_renderpasses_draw(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_renderpasses_draw_debug(EEVEE_Data *vedata)
void EEVEE_renderpasses_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
uint EEVEE_renderpasses_aov_hash(const ViewLayerAOV *aov)
#define ENABLE_FROM_LEGACY(name_legacy, name_eevee)
void EEVEE_renderpasses_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#define EEVEE_RENDERPASSES_LIGHT_PASS
#define EEVEE_RENDERPASSES_WITH_POST_PROCESSING
bool EEVEE_renderpasses_only_first_sample_pass_active(EEVEE_Data *vedata)
eRenderPassPostProcessType
@ PASS_POST_ACCUMULATED_COLOR_ALPHA
@ PASS_POST_NORMAL
@ PASS_POST_TWO_LIGHT_BUFFERS
@ PASS_POST_ACCUMULATED_VALUE
@ PASS_POST_DEPTH
@ PASS_POST_AO
@ PASS_POST_ACCUMULATED_LIGHT
@ PASS_POST_ACCUMULATED_TRANSMITTANCE_COLOR
@ PASS_POST_UNDEFINED
@ PASS_POST_ACCUMULATED_COLOR
#define EEVEE_RENDERPASSES_COLOR_PASS
#define G(x, y, z)
#define hash
Definition: noise.c:153
struct Scene * scene
Definition: DRW_render.h:979
struct ViewLayer * view_layer
Definition: DRW_render.h:980
struct View3D * v3d
Definition: DRW_render.h:976
struct GPUFrameBuffer * default_fb
struct GPUTexture * depth
EEVEE_TextureList * txl
EEVEE_StorageList * stl
EEVEE_PassList * psl
EEVEE_FramebufferList * fbl
struct GPUTexture * gtao_horizons_renderpass
struct GPUTexture * sss_irradiance
struct GPUTexture * ssr_specrough_input
struct GPUTexture * sss_radius
EEVEE_EffectsFlag enabled_effects
struct GPUTexture * velocity_tx
struct GPUTexture * ssr_normal_input
struct GPUTexture * sss_albedo
struct GPUFrameBuffer * main_fb
struct GPUFrameBuffer * renderpass_fb
struct DRWPass * renderpass_pass
eViewLayerEEVEEPassType render_passes
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUTexture * sss_accum
struct GPUTexture * color_double_buffer
struct GPUTexture * spec_color_accum
struct GPUTexture * maxzbuffer
struct GPUTexture * diff_light_accum
struct GPUTexture * emit_accum
struct GPUTexture * renderpass
struct GPUTexture * volume_scatter_accum
struct GPUTexture * diff_color_accum
struct GPUTexture * ao_accum
struct GPUTexture * bloom_accum
struct GPUTexture * spec_light_accum
struct GPUTexture * volume_transmittance_accum
struct GPUTexture * color
struct GPUTexture * shadow_accum
struct GPUTexture * mist_accum
struct GPUTexture * env_accum
struct GPUTexture * aov_surface_accum[MAX_AOVS]
struct GPUTexture * ssr_accum
struct GPUUniformBuf * combined
struct EEVEE_ViewLayerData::@210 renderpass_ubo
struct GPUUniformBuf * common_ubo
struct SceneEEVEE eevee
View3DShading shading
struct ViewLayerEEVEE eevee
ListBase aovs