Blender  V3.3
eevee_occlusion.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2016 Blender Foundation. */
3 
10 #include "DRW_render.h"
11 
12 #include "BLI_string_utils.h"
13 
14 #include "DEG_depsgraph_query.h"
15 
16 #include "BKE_global.h" /* for G.debug_value */
17 
18 #include "eevee_private.h"
19 
20 #include "GPU_capabilities.h"
21 #include "GPU_platform.h"
22 #include "GPU_state.h"
23 
24 static struct {
26 } e_data = {NULL}; /* Engine data */
27 
29 {
30  EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
31  EEVEE_FramebufferList *fbl = vedata->fbl;
32  EEVEE_StorageList *stl = vedata->stl;
33  EEVEE_EffectsInfo *effects = stl->effects;
34 
35  const DRWContextState *draw_ctx = DRW_context_state_get();
36  const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
37 
38  if (!e_data.dummy_horizon_tx) {
39  const float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f};
40  e_data.dummy_horizon_tx = DRW_texture_create_2d(1, 1, GPU_RGBA8, DRW_TEX_WRAP, pixel);
41  }
42 
43  if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED ||
45  const float *viewport_size = DRW_viewport_size_get();
46  const int fs_size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
47 
48  common_data->ao_dist = scene_eval->eevee.gtao_distance;
49  common_data->ao_factor = max_ff(1e-4f, scene_eval->eevee.gtao_factor);
50  common_data->ao_quality = scene_eval->eevee.gtao_quality;
51 
52  if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED) {
53  common_data->ao_settings = 1.0f; /* USE_AO */
54  }
55  if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BENT_NORMALS) {
56  common_data->ao_settings += 2.0f; /* USE_BENT_NORMAL */
57  }
58  if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) {
59  common_data->ao_settings += 4.0f; /* USE_DENOISE */
60  }
61 
62  common_data->ao_bounce_fac = (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) ? 1.0f : 0.0f;
63 
66  GPU_framebuffer_ensure_config(
67  &fbl->gtao_fb,
68  {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons_renderpass)});
69 
70  if (G.debug_value == 6) {
73  GPU_framebuffer_ensure_config(
74  &fbl->gtao_debug_fb,
75  {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons_debug)});
76  }
77  else {
78  effects->gtao_horizons_debug = NULL;
79  }
80 
81  effects->gtao_horizons = (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED) ?
82  effects->gtao_horizons_renderpass :
83  e_data.dummy_horizon_tx;
84 
86  }
87 
88  /* Cleanup */
89  effects->gtao_horizons_renderpass = e_data.dummy_horizon_tx;
90  effects->gtao_horizons = e_data.dummy_horizon_tx;
91  GPU_FRAMEBUFFER_FREE_SAFE(fbl->gtao_fb);
92  common_data->ao_settings = 0.0f;
93 
94  return 0;
95 }
96 
98 {
99  EEVEE_FramebufferList *fbl = vedata->fbl;
100  EEVEE_TextureList *txl = vedata->txl;
101  EEVEE_StorageList *stl = vedata->stl;
102  EEVEE_PassList *psl = vedata->psl;
103  EEVEE_EffectsInfo *effects = stl->effects;
104 
105  const eGPUTextureFormat texture_format = (tot_samples > 128) ? GPU_R32F : GPU_R16F;
106 
108 
109  /* Should be enough precision for many samples. */
110  DRW_texture_ensure_fullscreen_2d(&txl->ao_accum, texture_format, 0);
111 
112  GPU_framebuffer_ensure_config(&fbl->ao_accum_fb,
113  {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->ao_accum)});
114 
115  /* Accumulation pass */
119  psl->ao_accum_ps);
121  DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
122  DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
123  DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input);
124  DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons_renderpass);
125  DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
126  DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
128 }
129 
131 {
132  EEVEE_PassList *psl = vedata->psl;
133  EEVEE_StorageList *stl = vedata->stl;
134  EEVEE_TextureList *txl = vedata->txl;
135  EEVEE_EffectsInfo *effects = stl->effects;
137 
138  if ((effects->enabled_effects & EFFECT_GTAO) != 0) {
153  psl->ao_horizon_search);
155  DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
156  DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
157  DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
159 
160  if (G.debug_value == 6) {
163  psl->ao_horizon_debug);
165  DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
166  DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
167  DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input);
168  DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons_renderpass);
169  DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
170  DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
172  }
173  }
174 }
175 
177 {
178  EEVEE_PassList *psl = vedata->psl;
179  EEVEE_FramebufferList *fbl = vedata->fbl;
180  EEVEE_StorageList *stl = vedata->stl;
181  EEVEE_EffectsInfo *effects = stl->effects;
182  EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
183 
184  if ((effects->enabled_effects & EFFECT_GTAO) != 0) {
185  DRW_stats_group_start("GTAO Horizon Scan");
186 
188 
191  if (common_data->ray_type != EEVEE_RAY_GLOSSY) {
192  const float *viewport_size = DRW_viewport_size_get();
193  GPU_framebuffer_viewport_set(fbl->gtao_fb, 0, 0, UNPACK2(viewport_size));
194  }
195 
197 
198  if (common_data->ray_type != EEVEE_RAY_GLOSSY) {
200  }
201 
205  /* Fix dot corruption on intel HD5XX/HD6XX series. */
206  GPU_flush();
207  }
208 
209  /* Restore */
211 
213  }
214 }
215 
217 {
218  EEVEE_PassList *psl = vedata->psl;
219  EEVEE_FramebufferList *fbl = vedata->fbl;
220  EEVEE_StorageList *stl = vedata->stl;
221  EEVEE_EffectsInfo *effects = stl->effects;
222 
223  if (((effects->enabled_effects & EFFECT_GTAO) != 0) && (G.debug_value == 6)) {
224  DRW_stats_group_start("GTAO Debug");
225 
228 
229  /* Restore */
231 
233  }
234 }
235 
237 {
238  EEVEE_FramebufferList *fbl = vedata->fbl;
239  EEVEE_PassList *psl = vedata->psl;
240  EEVEE_EffectsInfo *effects = vedata->stl->effects;
241 
242  if (fbl->ao_accum_fb != NULL) {
244 
245  /* Update the min_max/horizon buffers so the refraction materials appear in it. */
246  EEVEE_create_minmax_buffer(vedata, dtxl->depth, -1);
247  EEVEE_occlusion_compute(sldata, vedata);
248 
250 
251  /* Clear texture. */
252  if (effects->taa_current_sample == 1) {
253  const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f};
254  GPU_framebuffer_clear_color(fbl->ao_accum_fb, clear);
255  }
256 
258 
259  /* Restore */
261  }
262 }
263 
265 {
266  DRW_TEXTURE_FREE_SAFE(e_data.dummy_horizon_tx);
267 }
MINLINE float max_ff(float a, float b)
unsigned int uint
Definition: BLI_sys_types.h:67
#define UNPACK2(a)
#define UNUSED(x)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
@ EEVEE_RENDER_PASS_AO
@ SCE_EEVEE_GTAO_BOUNCE
@ SCE_EEVEE_GTAO_BENT_NORMALS
@ SCE_EEVEE_GTAO_ENABLED
@ DRW_TEX_WRAP
Definition: DRW_render.h:141
DRWState
Definition: DRW_render.h:298
@ DRW_STATE_BLEND_ADD
Definition: DRW_render.h:324
@ DRW_STATE_WRITE_COLOR
Definition: DRW_render.h:303
#define DRW_PASS_CREATE(pass, state)
Definition: DRW_render.h:690
#define DRW_shgroup_uniform_block(shgroup, name, ubo)
Definition: DRW_render.h:651
#define DRW_shgroup_call(shgroup, geom, ob)
Definition: DRW_render.h:414
#define DRW_TEXTURE_FREE_SAFE(tex)
Definition: DRW_render.h:183
bool GPU_mip_render_workaround(void)
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
@ GPU_BACKEND_OPENGL
Definition: GPU_platform.h:17
@ GPU_DRIVER_ANY
Definition: GPU_platform.h:47
bool GPU_type_matches_ex(eGPUDeviceType device, eGPUOSType os, eGPUDriverType driver, eGPUBackendType backend)
@ GPU_OS_WIN
Definition: GPU_platform.h:37
@ GPU_DEVICE_INTEL_UHD
Definition: GPU_platform.h:27
void GPU_flush(void)
Definition: gpu_state.cc:291
struct GPUTexture GPUTexture
Definition: GPU_texture.h:17
eGPUTextureFormat
Definition: GPU_texture.h:83
@ GPU_R16F
Definition: GPU_texture.h:113
@ GPU_RGBA8
Definition: GPU_texture.h:87
GPUBatch * DRW_cache_fullscreen_quad_get(void)
Definition: draw_cache.c:356
const DRWContextState * DRW_context_state_get(void)
const float * DRW_viewport_size_get(void)
Definition: draw_manager.c:288
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:638
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *shgroup, Object *ob, uint tri_count)
DRWShadingGroup * DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
void DRW_shgroup_uniform_texture_ref(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex)
void DRW_draw_pass(DRWPass *pass)
void DRW_stats_group_start(const char *name)
void DRW_stats_group_end(void)
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
GPUTexture * DRW_texture_create_2d(int w, int h, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
GPUTexture * DRW_texture_pool_query_2d(int w, int h, eGPUTextureFormat format, DrawEngineType *engine_type)
void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int layer)
DrawEngineType draw_engine_eevee_type
Definition: eevee_engine.c:618
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx GPU_R32F
struct GPUTexture * EEVEE_materials_get_util_tex(void)
void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_occlusion_draw_debug(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void EEVEE_occlusion_free(void)
struct GPUTexture * dummy_horizon_tx
void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples)
static struct @203 e_data
int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_occlusion_output_accumulate(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_occlusion_compute(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
#define EEVEE_RAY_GLOSSY
@ EFFECT_GTAO
@ EFFECT_NORMAL_BUFFER
struct GPUShader * EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(void)
struct GPUShader * EEVEE_shaders_effect_ambient_occlusion_sh_get(void)
void GPU_framebuffer_viewport_reset(GPUFrameBuffer *gpu_fb)
void GPU_framebuffer_viewport_set(GPUFrameBuffer *gpu_fb, int x, int y, int width, int height)
const int state
#define G(x, y, z)
static void clear(Message *msg)
Definition: msgfmt.c:278
struct Depsgraph * depsgraph
Definition: DRW_render.h:987
struct GPUTexture * depth
EEVEE_TextureList * txl
EEVEE_StorageList * stl
EEVEE_PassList * psl
EEVEE_FramebufferList * fbl
struct GPUTexture * gtao_horizons_renderpass
struct GPUTexture * gtao_horizons
EEVEE_EffectsFlag enabled_effects
struct GPUTexture * gtao_horizons_debug
struct GPUTexture * ssr_normal_input
struct GPUFrameBuffer * main_fb
struct GPUFrameBuffer * gtao_fb
struct GPUFrameBuffer * ao_accum_fb
struct GPUFrameBuffer * gtao_debug_fb
struct DRWPass * ao_accum_ps
struct DRWPass * ao_horizon_search
struct DRWPass * ao_horizon_debug
eViewLayerEEVEEPassType render_passes
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUTexture * maxzbuffer
struct GPUTexture * ao_accum
struct EEVEE_CommonUniformBuffer common_data
struct GPUUniformBuf * combined
struct EEVEE_ViewLayerData::@210 renderpass_ubo
struct GPUUniformBuf * common_ubo
struct SceneEEVEE eevee