diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2021-04-18 02:19:43 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2021-04-18 18:30:36 +0300 |
commit | 5697f96608ce96f25e02b3888325d0d23a613175 (patch) | |
tree | 66afbfb9120f3a26022efe3c4d88db37cd257d82 /source/blender/draw/engines/eevee/eevee_shader.hh | |
parent | 93b774a66191843dcaab10d9e6afcd85b39a7109 (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.hh | 15 |
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); |