Blender  V3.3
eevee_screen_raytrace.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_dynstr.h"
13 #include "BLI_string_utils.h"
14 
15 #include "DEG_depsgraph_query.h"
16 
17 #include "GPU_texture.h"
18 #include "eevee_private.h"
19 
21 {
22  EEVEE_CommonUniformBuffer *common_data = &sldata->common_data;
23  EEVEE_StorageList *stl = vedata->stl;
24  EEVEE_FramebufferList *fbl = vedata->fbl;
25  EEVEE_EffectsInfo *effects = stl->effects;
26  const float *viewport_size = DRW_viewport_size_get();
27 
28  const DRWContextState *draw_ctx = DRW_context_state_get();
29  const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph);
30 
31  if (scene_eval->eevee.flag & SCE_EEVEE_SSR_ENABLED) {
32  const bool use_refraction = (scene_eval->eevee.flag & SCE_EEVEE_SSR_REFRACTION) != 0;
33 
34  const bool is_persp = DRW_view_is_persp_get(NULL);
35  if (effects->ssr_was_persp != is_persp) {
36  effects->ssr_was_persp = is_persp;
39  stl->g_data->valid_double_buffer = false;
40  }
41 
42  if (!effects->ssr_was_valid_double_buffer) {
45  }
47 
48  effects->reflection_trace_full = (scene_eval->eevee.flag & SCE_EEVEE_SSR_HALF_RESOLUTION) == 0;
49  common_data->ssr_thickness = scene_eval->eevee.ssr_thickness;
50  common_data->ssr_border_fac = scene_eval->eevee.ssr_border_fade;
51  common_data->ssr_firefly_fac = scene_eval->eevee.ssr_firefly_fac;
52  common_data->ssr_max_roughness = scene_eval->eevee.ssr_max_roughness;
53  common_data->ssr_quality = 1.0f - 0.95f * scene_eval->eevee.ssr_quality;
54  common_data->ssr_brdf_bias = 0.1f + common_data->ssr_quality * 0.6f; /* Range [0.1, 0.7]. */
55 
56  if (common_data->ssr_firefly_fac < 1e-8f) {
57  common_data->ssr_firefly_fac = FLT_MAX;
58  }
59 
60  void *owner = (void *)EEVEE_screen_raytrace_init;
61  const int divisor = (effects->reflection_trace_full) ? 1 : 2;
62  int tracing_res[2] = {(int)viewport_size[0] / divisor, (int)viewport_size[1] / divisor};
63  const int size_fs[2] = {(int)viewport_size[0], (int)viewport_size[1]};
64  const bool high_qual_input = true; /* TODO: dither low quality input. */
65  const eGPUTextureFormat format = (high_qual_input) ? GPU_RGBA16F : GPU_RGBA8;
66 
67  tracing_res[0] = max_ii(1, tracing_res[0]);
68  tracing_res[1] = max_ii(1, tracing_res[1]);
69 
70  common_data->ssr_uv_scale[0] = size_fs[0] / ((float)tracing_res[0] * divisor);
71  common_data->ssr_uv_scale[1] = size_fs[1] / ((float)tracing_res[1] * divisor);
72 
73  /* MRT for the shading pass in order to output needed data for the SSR pass. */
74  effects->ssr_specrough_input = DRW_texture_pool_query_2d(UNPACK2(size_fs), format, owner);
75 
77 
78  /* Ray-tracing output. */
79  effects->ssr_hit_output = DRW_texture_pool_query_2d(UNPACK2(tracing_res), GPU_RGBA16F, owner);
80  effects->ssr_hit_depth = DRW_texture_pool_query_2d(UNPACK2(tracing_res), GPU_R16F, owner);
81 
82  GPU_framebuffer_ensure_config(&fbl->screen_tracing_fb,
83  {
84  GPU_ATTACHMENT_NONE,
85  GPU_ATTACHMENT_TEXTURE(effects->ssr_hit_output),
86  GPU_ATTACHMENT_TEXTURE(effects->ssr_hit_depth),
87  });
88 
90  ((use_refraction) ? EFFECT_REFRACT : 0);
91  }
92 
93  /* Cleanup to release memory */
94  GPU_FRAMEBUFFER_FREE_SAFE(fbl->screen_tracing_fb);
95  effects->ssr_specrough_input = NULL;
96  effects->ssr_hit_output = NULL;
97 
98  return 0;
99 }
100 
102 {
103  EEVEE_PassList *psl = vedata->psl;
104  EEVEE_StorageList *stl = vedata->stl;
105  EEVEE_TextureList *txl = vedata->txl;
106  EEVEE_EffectsInfo *effects = stl->effects;
107  LightCache *lcache = stl->g_data->light_cache;
108 
109  if ((effects->enabled_effects & EFFECT_SSR) != 0) {
112 
113  int hitbuf_size[3];
114  GPU_texture_get_mipmap_size(effects->ssr_hit_output, 0, hitbuf_size);
115 
130  DRWShadingGroup *grp = DRW_shgroup_create(trace_shader, psl->ssr_raytrace);
131  DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input);
132  DRW_shgroup_uniform_texture_ref(grp, "specroughBuffer", &effects->ssr_specrough_input);
133  DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
134  DRW_shgroup_uniform_texture_ref(grp, "planarDepth", &vedata->txl->planar_depth);
136  DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
137  DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
138  DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
139  DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
140  DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
141  DRW_shgroup_uniform_vec2_copy(grp, "targetSize", (float[2]){hitbuf_size[0], hitbuf_size[1]});
143  grp, "randomScale", effects->reflection_trace_full ? 0.0f : 0.5f);
145 
147 
149  grp = DRW_shgroup_create(resolve_shader, psl->ssr_resolve);
150  DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input);
151  DRW_shgroup_uniform_texture_ref(grp, "specroughBuffer", &effects->ssr_specrough_input);
152  DRW_shgroup_uniform_texture_ref(grp, "probeCubes", &lcache->cube_tx.tex);
153  DRW_shgroup_uniform_texture_ref(grp, "probePlanars", &vedata->txl->planar_pool);
154  DRW_shgroup_uniform_texture_ref(grp, "planarDepth", &vedata->txl->planar_depth);
155  DRW_shgroup_uniform_texture_ref_ex(grp, "hitBuffer", &effects->ssr_hit_output, no_filter);
156  DRW_shgroup_uniform_texture_ref_ex(grp, "hitDepth", &effects->ssr_hit_depth, no_filter);
157  DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &txl->filtered_radiance);
158  DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer);
159  DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool);
160  DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool);
162  DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo);
163  DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo);
164  DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo);
165  DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo);
166  DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
167  DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
168  DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined);
169  DRW_shgroup_uniform_int(grp, "samplePoolOffset", &effects->taa_current_sample, 1);
170  DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons);
172  }
173 }
174 
176 {
177  EEVEE_FramebufferList *fbl = vedata->fbl;
178  EEVEE_TextureList *txl = vedata->txl;
179  EEVEE_StorageList *stl = vedata->stl;
180  EEVEE_EffectsInfo *effects = stl->effects;
181 
182  if ((effects->enabled_effects & EFFECT_REFRACT) != 0) {
184 
185  /* Restore */
187  }
188 }
189 
191 {
192  EEVEE_PassList *psl = vedata->psl;
193  EEVEE_FramebufferList *fbl = vedata->fbl;
194  EEVEE_StorageList *stl = vedata->stl;
195  EEVEE_TextureList *txl = vedata->txl;
196  EEVEE_EffectsInfo *effects = stl->effects;
197 
198  if (((effects->enabled_effects & EFFECT_SSR) != 0) && stl->g_data->valid_double_buffer) {
199  DRW_stats_group_start("SSR");
200 
201  /* Ray-trace. */
204 
206 
209 
210  /* Restore */
213  }
214 }
215 
217  EEVEE_Data *vedata,
218  uint tot_samples)
219 {
220  EEVEE_FramebufferList *fbl = vedata->fbl;
221  EEVEE_TextureList *txl = vedata->txl;
222 
223  /* Create FrameBuffer. */
224  const eGPUTextureFormat texture_format = (tot_samples > 256) ? GPU_RGBA32F : GPU_RGBA16F;
225  DRW_texture_ensure_fullscreen_2d(&txl->ssr_accum, texture_format, 0);
226 
227  GPU_framebuffer_ensure_config(&fbl->ssr_accum_fb,
228  {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->ssr_accum)});
229 }
230 
232 {
233  EEVEE_FramebufferList *fbl = vedata->fbl;
234  EEVEE_PassList *psl = vedata->psl;
235  EEVEE_StorageList *stl = vedata->stl;
236  EEVEE_EffectsInfo *effects = vedata->stl->effects;
237 
238  if (stl->g_data->valid_double_buffer) {
240 
241  /* Clear texture. */
242  if (effects->taa_current_sample == 1) {
243  const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f};
244  GPU_framebuffer_clear_color(fbl->ssr_accum_fb, clear);
245  }
246 
248  }
249 }
typedef float(TangentPoint)[2]
A dynamically sized string ADT.
MINLINE int max_ii(int a, int 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)
@ SCE_EEVEE_SSR_ENABLED
@ SCE_EEVEE_SSR_REFRACTION
@ SCE_EEVEE_SSR_HALF_RESOLUTION
@ 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
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
struct GPUShader GPUShader
Definition: GPU_shader.h:20
eGPUSamplerState
Definition: GPU_texture.h:25
@ GPU_SAMPLER_DEFAULT
Definition: GPU_texture.h:26
void GPU_texture_get_mipmap_size(GPUTexture *tex, int lvl, int *size)
Definition: gpu_texture.cc:688
eGPUTextureFormat
Definition: GPU_texture.h:83
@ GPU_R16F
Definition: GPU_texture.h:113
@ GPU_RGBA32F
Definition: GPU_texture.h:90
@ GPU_RGBA8
Definition: GPU_texture.h:87
const DRWContextState * DRW_context_state_get(void)
const float * DRW_viewport_size_get(void)
Definition: draw_manager.c:288
void DRW_viewport_request_redraw(void)
Definition: draw_manager.c:643
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
bool DRW_view_is_persp_get(const DRWView *view)
void DRW_shgroup_uniform_texture_ref_ex(DRWShadingGroup *shgroup, const char *name, GPUTexture **tex, eGPUSamplerState sampler_state)
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_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_shgroup_uniform_vec2_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
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_pool_query_2d(int w, int h, eGPUTextureFormat format, DrawEngineType *engine_type)
void EEVEE_effects_downsample_radiance_buffer(EEVEE_Data *vedata, GPUTexture *texture_src)
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
struct GPUTexture * EEVEE_materials_get_util_tex(void)
void EEVEE_temporal_sampling_reset(EEVEE_Data *vedata)
struct GPUShader * EEVEE_shaders_effect_reflection_trace_sh_get(void)
struct GPUShader * EEVEE_shaders_effect_reflection_resolve_sh_get(void)
@ EFFECT_RADIANCE_BUFFER
@ EFFECT_DOUBLE_BUFFER
@ EFFECT_REFRACT
@ EFFECT_NORMAL_BUFFER
@ EFFECT_SSR
void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_reflection_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
void EEVEE_reflection_output_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, uint tot_samples)
void EEVEE_refraction_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
void GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, int slot, int mip)
format
Definition: logImageCore.h:38
static void clear(Message *msg)
Definition: msgfmt.c:278
struct Depsgraph * depsgraph
Definition: DRW_render.h:987
EEVEE_TextureList * txl
EEVEE_StorageList * stl
EEVEE_PassList * psl
EEVEE_FramebufferList * fbl
struct GPUTexture * gtao_horizons
struct GPUTexture * ssr_hit_output
bool ssr_was_valid_double_buffer
struct GPUTexture * ssr_specrough_input
EEVEE_EffectsFlag enabled_effects
struct GPUTexture * ssr_normal_input
struct GPUTexture * ssr_hit_depth
struct GPUFrameBuffer * main_fb
struct GPUFrameBuffer * screen_tracing_fb
struct GPUFrameBuffer * main_color_fb
struct GPUFrameBuffer * ssr_accum_fb
struct DRWPass * ssr_resolve
struct DRWPass * ssr_raytrace
struct LightCache * light_cache
struct EEVEE_PrivateData * g_data
struct EEVEE_EffectsInfo * effects
struct GPUTexture * filtered_radiance
struct GPUTexture * planar_depth
struct GPUTexture * color_double_buffer
struct GPUTexture * maxzbuffer
struct GPUTexture * planar_pool
struct GPUTexture * color
struct GPUTexture * ssr_accum
struct EEVEE_CommonUniformBuffer common_data
struct GPUTexture * shadow_cube_pool
struct GPUUniformBuf * combined
struct GPUUniformBuf * shadow_ubo
struct GPUUniformBuf * probe_ubo
struct GPUUniformBuf * grid_ubo
struct GPUUniformBuf * planar_ubo
struct EEVEE_ViewLayerData::@210 renderpass_ubo
struct GPUUniformBuf * common_ubo
struct GPUUniformBuf * light_ubo
struct GPUTexture * shadow_cascade_pool
struct GPUTexture * tex
LightCacheTexture cube_tx
float ssr_max_roughness
float ssr_border_fade
float ssr_firefly_fac
struct SceneEEVEE eevee