Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2021-04-18 02:19:43 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-04-18 18:30:36 +0300
commit5697f96608ce96f25e02b3888325d0d23a613175 (patch)
tree66afbfb9120f3a26022efe3c4d88db37cd257d82 /source/blender/draw/engines/eevee/eevee_shader.hh
parent93b774a66191843dcaab10d9e6afcd85b39a7109 (diff)
EEVEE: Light: 2.5D Culling: Initial implementation
This follows closely the implementation of 2.5D tiled light culling described in the presentation: "Improved Culling for Tiled and Clustered Rendering" from Michal Drobot http://advances.realtimerendering.com/s2017/2017_Sig_Improved_Culling_final.pdf I chose the tile + Z binning approach for its high depth range support and low CPU overhead & low memory consumption compared to the cluster based culling. The cons is that the culling is a bit less precise in some aspect but it is quite balanced. The culling is done by the `Culling` object which is templated to easily be reused for light probes cullg. The Z-binning process is described starting from slide 20 in the reference pdf. I also implemented a debug pass to visualize false negative (light culled when they shouldn't) and light evaluation density. This is useful to detect failure case and hotspot. This could be exposed as a developper only render pass in the future. Some optimization of the reference implementation requires extensions not yet added to GPU module and will be added later.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_shader.hh')
-rw-r--r--source/blender/draw/engines/eevee/eevee_shader.hh15
1 files changed, 12 insertions, 3 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shader.hh b/source/blender/draw/engines/eevee/eevee_shader.hh
index a492da9bf27..d3f41dae5d1 100644
--- a/source/blender/draw/engines/eevee/eevee_shader.hh
+++ b/source/blender/draw/engines/eevee/eevee_shader.hh
@@ -40,6 +40,10 @@ extern char datatoc_common_view_lib_glsl[];
extern char datatoc_eevee_camera_lib_glsl[];
extern char datatoc_eevee_camera_velocity_frag_glsl[];
+extern char datatoc_eevee_culling_debug_frag_glsl[];
+extern char datatoc_eevee_culling_iter_lib_glsl[];
+extern char datatoc_eevee_culling_lib_glsl[];
+extern char datatoc_eevee_culling_light_frag_glsl[];
extern char datatoc_eevee_depth_of_field_accumulator_lib_glsl[];
extern char datatoc_eevee_depth_of_field_bokeh_lut_frag_glsl[];
extern char datatoc_eevee_depth_of_field_downsample_frag_glsl[];
@@ -60,7 +64,6 @@ extern char datatoc_eevee_depth_of_field_tiles_flatten_frag_glsl[];
extern char datatoc_eevee_film_filter_frag_glsl[];
extern char datatoc_eevee_film_lib_glsl[];
extern char datatoc_eevee_film_resolve_frag_glsl[];
-extern char datatoc_eevee_light_lib_glsl[];
extern char datatoc_eevee_motion_blur_gather_frag_glsl[];
extern char datatoc_eevee_motion_blur_lib_glsl[];
extern char datatoc_eevee_motion_blur_tiles_dilate_frag_glsl[];
@@ -80,7 +83,10 @@ namespace blender::eevee {
/* Keep alphabetical order and clean prefix. */
enum eShaderType {
- DOF_BOKEH_LUT = 0,
+ CULLING_DEBUG = 0,
+ CULLING_LIGHT,
+
+ DOF_BOKEH_LUT,
DOF_GATHER_BACKGROUND_LUT,
DOF_GATHER_BACKGROUND,
DOF_FILTER,
@@ -154,7 +160,8 @@ class ShaderModule {
DRW_SHADER_LIB_ADD(shader_lib_, common_view_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_sampling_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_camera_lib);
- DRW_SHADER_LIB_ADD(shader_lib_, eevee_light_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_culling_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_culling_iter_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_velocity_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_depth_of_field_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_depth_of_field_accumulator_lib);
@@ -178,6 +185,8 @@ class ShaderModule {
SHADER(enum_, common_fullscreen_vert, nullptr, frag_, defs_)
#define SHADER_FULLSCREEN(enum_, frag_) SHADER_FULLSCREEN_DEFINES(enum_, frag_, nullptr)
+ SHADER_FULLSCREEN(CULLING_DEBUG, eevee_culling_debug_frag);
+ SHADER_FULLSCREEN(CULLING_LIGHT, eevee_culling_light_frag);
SHADER_FULLSCREEN(FILM_FILTER, eevee_film_filter_frag);
SHADER_FULLSCREEN(FILM_RESOLVE, eevee_film_resolve_frag);
SHADER_FULLSCREEN(DOF_BOKEH_LUT, eevee_depth_of_field_bokeh_lut_frag);