diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2021-12-10 20:19:47 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2021-12-10 20:19:47 +0300 |
commit | 55a6a8900aec81e94f4d82401d6051e3b5507c0e (patch) | |
tree | e3f1b065ebc6ca3dfe9d7cfe995bc400ce7d16be /source/blender | |
parent | 36bec765e2edbe07d8137fc019f7db7d3292875d (diff) |
EEVEE: Shadow: Avoid double rendering
The update flag was not being cleared after the opaque pass, making the
updates of the forward pass re-render the same tiles.
Diffstat (limited to 'source/blender')
3 files changed, 13 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shadow.cc b/source/blender/draw/engines/eevee/eevee_shadow.cc index ae026db0efb..70eb49ec487 100644 --- a/source/blender/draw/engines/eevee/eevee_shadow.cc +++ b/source/blender/draw/engines/eevee/eevee_shadow.cc @@ -711,6 +711,7 @@ void ShadowModule::end_sync(void) DRW_shgroup_vertex_buffer(grp, "pages_free_buf", pages_free_data_); DRW_shgroup_vertex_buffer(grp, "tilemaps_buf", tilemap_allocator.tilemaps_data); DRW_shgroup_uniform_image(grp, "tilemaps_img", tilemap_allocator.tilemap_tx); + DRW_shgroup_uniform_bool(grp, "do_tilemap_setup", &do_tilemap_setup_, 1); int64_t tilemaps_updated_len = tilemaps_len + tilemap_allocator.deleted_maps_len; if (tilemaps_updated_len > 0) { DRW_shgroup_call_compute(grp, 1, 1, tilemaps_updated_len); @@ -1074,9 +1075,12 @@ void ShadowModule::set_view(const DRWView *view, GPUTexture *depth_tx) tilemap_allocator.tilemap_tx.clear((uint)0); DRW_draw_pass(page_init_ps_); } - do_tilemap_setup_ = false; - DRW_draw_pass(tilemap_setup_ps_); + } + /* Run every every time but only process tilemap update once. */ + DRW_draw_pass(tilemap_setup_ps_); + if (do_tilemap_setup_) { DRW_draw_pass(tilemap_update_tag_ps_); + do_tilemap_setup_ = false; } if (do_process_view) { DRW_draw_pass(tilemap_visibility_ps_); diff --git a/source/blender/draw/engines/eevee/eevee_shadow.hh b/source/blender/draw/engines/eevee/eevee_shadow.hh index 2bc252d4f8e..65456f11326 100644 --- a/source/blender/draw/engines/eevee/eevee_shadow.hh +++ b/source/blender/draw/engines/eevee/eevee_shadow.hh @@ -474,7 +474,7 @@ class ShadowModule { DRWCallBuffer *casters_updated_; DRWCallBuffer *receivers_non_opaque_; - bool do_tilemap_setup_ = true; + int do_tilemap_setup_ = true; const DRWView *last_processed_view = nullptr; float tilemap_pixel_radius_; float screen_pixel_radius_inv_; diff --git a/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl b/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl index 92a0c3d6d14..d6f01f6326e 100644 --- a/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl +++ b/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl @@ -29,12 +29,14 @@ layout(std430, binding = 3) restrict buffer pages_infos_buf layout(r32ui) restrict uniform uimage2D tilemaps_img; +uniform bool do_tilemap_setup; + void main() { ShadowTileMapData tilemap = tilemaps[gl_GlobalInvocationID.z]; - + ivec2 grid_shift = (do_tilemap_setup) ? tilemap.grid_shift : ivec2(0); ivec2 tile_co = ivec2(gl_GlobalInvocationID.xy); - ivec2 tile_shifted = tile_co + tilemap.grid_shift; + ivec2 tile_shifted = tile_co + grid_shift; /* Still load a valid tile after the shifting in order to not loose any page reference. * This way the tile can even be reused if it is needed. Also avoid negative modulo. */ ivec2 tile_wrapped = (tile_shifted + SHADOW_TILEMAP_RES) % SHADOW_TILEMAP_RES; @@ -52,7 +54,7 @@ void main() tile_data.do_update = true; } - if (tilemap.grid_shift != ivec2(0) && tile_data.is_cached) { + if (grid_shift != ivec2(0) && tile_data.is_cached) { /* Update page location after shift. */ free_page_owners[tile_data.free_page_owner_index] = packUvec2x16(uvec2(texel_out)); } @@ -61,7 +63,7 @@ void main() if (tilemap.is_cubeface) { /* Cubemap shift update is always all or nothing. */ - bool do_update = (tilemap.grid_shift.x != 0); + bool do_update = (grid_shift.x != 0); /* Number of lod0 tiles covered by the current lod level (in one dimension). */ uint lod_stride = 1u << 1u; |