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-08 17:17:04 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-04-08 17:17:04 +0300
commit2a7d9d451559b50acf2d5c061b6fd1a9c42d04d6 (patch)
tree3e04cb53e978c7303544945c739281ac8ededa8c /source/blender/draw/engines/eevee/eevee_shader.hh
parent89f2d3427ed42a96126ec08605bec238421cd7be (diff)
EEVEE: Depth Of Field: Add back post process depth of field.
Pretty much identical to the previous implementation. With the exception of a temporary noise function and some simplification of the CoC computation. This also fixes issues with the Ortho depth of field. Most of the files were modified to comply to new shader codestyle. This also adds partial support of panoramic cameras (bokeh and anamorphic is still buggy).
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_shader.hh')
-rw-r--r--source/blender/draw/engines/eevee/eevee_shader.hh140
1 files changed, 134 insertions, 6 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shader.hh b/source/blender/draw/engines/eevee/eevee_shader.hh
index 301172bf788..9c972a76cef 100644
--- a/source/blender/draw/engines/eevee/eevee_shader.hh
+++ b/source/blender/draw/engines/eevee/eevee_shader.hh
@@ -39,12 +39,30 @@ extern char datatoc_common_math_lib_glsl[];
extern char datatoc_common_view_lib_glsl[];
extern char datatoc_eevee_camera_lib_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[];
+extern char datatoc_eevee_depth_of_field_filter_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_gather_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_gather_holefill_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_lib_glsl[];
+extern char datatoc_eevee_depth_of_field_reduce_copy_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_reduce_downsample_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_reduce_recursive_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_resolve_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_scatter_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_scatter_lib_glsl[];
+extern char datatoc_eevee_depth_of_field_scatter_vert_glsl[];
+extern char datatoc_eevee_depth_of_field_setup_frag_glsl[];
+extern char datatoc_eevee_depth_of_field_tiles_dilate_frag_glsl[];
+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_object_forward_frag_glsl[];
extern char datatoc_eevee_object_lib_glsl[];
extern char datatoc_eevee_object_mesh_vert_glsl[];
+extern char datatoc_eevee_random_lib_glsl[];
extern char datatoc_eevee_shader_shared_hh[];
@@ -52,8 +70,32 @@ namespace blender::eevee {
/* Keep alphabetical order and clean prefix. */
enum eShaderType {
- FILM_FILTER = 0,
+ DOF_BOKEH_LUT = 0,
+ DOF_GATHER_BACKGROUND_LUT,
+ DOF_GATHER_BACKGROUND,
+ DOF_FILTER,
+ DOF_GATHER_FOREGROUND_LUT,
+ DOF_GATHER_FOREGROUND,
+ DOF_GATHER_HOLEFILL,
+ DOF_REDUCE_COPY,
+ DOF_REDUCE_DOWNSAMPLE,
+ DOF_REDUCE_RECURSIVE,
+ DOF_RESOLVE,
+ DOF_RESOLVE_HQ,
+ DOF_RESOLVE_LUT,
+ DOF_RESOLVE_LUT_HQ,
+ DOF_SCATTER_BACKGROUND_LUT,
+ DOF_SCATTER_BACKGROUND,
+ DOF_SCATTER_FOREGROUND_LUT,
+ DOF_SCATTER_FOREGROUND,
+ DOF_SETUP,
+ DOF_TILES_DILATE_MINABS,
+ DOF_TILES_DILATE_MINMAX,
+ DOF_TILES_FLATTEN,
+
+ FILM_FILTER,
FILM_RESOLVE,
+
MESH, /* TEST */
MAX_SHADER_TYPE,
@@ -66,6 +108,7 @@ class ShaderModule {
const char *vertex_shader_code;
const char *geometry_shader_code;
const char *fragment_shader_code;
+ const char *defines_shader_code;
};
DRWShaderLibrary *shader_lib_ = nullptr;
@@ -89,24 +132,109 @@ class ShaderModule {
DRW_SHADER_LIB_ADD(shader_lib_, common_math_geom_lib);
DRW_SHADER_LIB_ADD(shader_lib_, common_hair_lib);
DRW_SHADER_LIB_ADD(shader_lib_, common_view_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_random_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_camera_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_depth_of_field_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_depth_of_field_accumulator_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_depth_of_field_scatter_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_film_lib);
DRW_SHADER_LIB_ADD(shader_lib_, eevee_object_lib);
/* Meh ¯\_(ツ)_/¯. */
char *datatoc_nullptr_glsl = nullptr;
-#define SHADER(enum_, vert_, geom_, frag_) \
+#define SHADER(enum_, vert_, geom_, frag_, defs_) \
shader_descriptions_[enum_].name = STRINGIFY(enum_); \
shader_descriptions_[enum_].vertex_shader_code = datatoc_##vert_##_glsl; \
shader_descriptions_[enum_].geometry_shader_code = datatoc_##geom_##_glsl; \
- shader_descriptions_[enum_].fragment_shader_code = datatoc_##frag_##_glsl;
+ shader_descriptions_[enum_].fragment_shader_code = datatoc_##frag_##_glsl; \
+ shader_descriptions_[enum_].defines_shader_code = defs_;
-#define SHADER_FULLSCREEN(enum_, frag_) SHADER(enum_, common_fullscreen_vert, nullptr, frag_)
+#define SHADER_FULLSCREEN_DEFINES(enum_, frag_, defs_) \
+ SHADER(enum_, common_fullscreen_vert, nullptr, frag_, defs_)
+#define SHADER_FULLSCREEN(enum_, frag_) SHADER_FULLSCREEN_DEFINES(enum_, frag_, nullptr)
SHADER_FULLSCREEN(FILM_FILTER, eevee_film_filter_frag);
SHADER_FULLSCREEN(FILM_RESOLVE, eevee_film_resolve_frag);
- SHADER(MESH, eevee_object_mesh_vert, nullptr, eevee_object_forward_frag);
+ SHADER_FULLSCREEN(DOF_BOKEH_LUT, eevee_depth_of_field_bokeh_lut_frag);
+ SHADER_FULLSCREEN(DOF_FILTER, eevee_depth_of_field_filter_frag);
+ SHADER_FULLSCREEN_DEFINES(DOF_GATHER_BACKGROUND_LUT,
+ eevee_depth_of_field_gather_frag,
+ "#define DOF_FOREGROUND_PASS false\n"
+ "#define DOF_BOKEH_TEXTURE true\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_GATHER_BACKGROUND,
+ eevee_depth_of_field_gather_frag,
+ "#define DOF_FOREGROUND_PASS false\n"
+ "#define DOF_BOKEH_TEXTURE false\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_GATHER_FOREGROUND_LUT,
+ eevee_depth_of_field_gather_frag,
+ "#define DOF_FOREGROUND_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE true\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_GATHER_FOREGROUND,
+ eevee_depth_of_field_gather_frag,
+ "#define DOF_FOREGROUND_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE false\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_GATHER_HOLEFILL,
+ eevee_depth_of_field_gather_holefill_frag,
+ "#define DOF_HOLEFILL_PASS true\n"
+ "#define DOF_FOREGROUND_PASS false\n"
+ "#define DOF_BOKEH_TEXTURE false\n");
+ SHADER_FULLSCREEN(DOF_REDUCE_COPY, eevee_depth_of_field_reduce_copy_frag);
+ SHADER_FULLSCREEN(DOF_REDUCE_DOWNSAMPLE, eevee_depth_of_field_reduce_downsample_frag);
+ SHADER_FULLSCREEN(DOF_REDUCE_RECURSIVE, eevee_depth_of_field_reduce_recursive_frag);
+ SHADER_FULLSCREEN_DEFINES(DOF_RESOLVE_LUT,
+ eevee_depth_of_field_resolve_frag,
+ "#define DOF_RESOLVE_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE true\n"
+ "#define DOF_SLIGHT_FOCUS_DENSITY 2\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_RESOLVE_LUT_HQ,
+ eevee_depth_of_field_resolve_frag,
+ "#define DOF_RESOLVE_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE true\n"
+ "#define DOF_SLIGHT_FOCUS_DENSITY 4\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_RESOLVE,
+ eevee_depth_of_field_resolve_frag,
+ "#define DOF_RESOLVE_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE false\n"
+ "#define DOF_SLIGHT_FOCUS_DENSITY 2\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_RESOLVE_HQ,
+ eevee_depth_of_field_resolve_frag,
+ "#define DOF_RESOLVE_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE false\n"
+ "#define DOF_SLIGHT_FOCUS_DENSITY 4\n");
+ SHADER(DOF_SCATTER_BACKGROUND_LUT,
+ eevee_depth_of_field_scatter_vert,
+ nullptr,
+ eevee_depth_of_field_scatter_frag,
+ "#define DOF_FOREGROUND_PASS false\n"
+ "#define DOF_BOKEH_TEXTURE true\n");
+ SHADER(DOF_SCATTER_BACKGROUND,
+ eevee_depth_of_field_scatter_vert,
+ nullptr,
+ eevee_depth_of_field_scatter_frag,
+ "#define DOF_FOREGROUND_PASS false\n"
+ "#define DOF_BOKEH_TEXTURE false\n");
+ SHADER(DOF_SCATTER_FOREGROUND_LUT,
+ eevee_depth_of_field_scatter_vert,
+ nullptr,
+ eevee_depth_of_field_scatter_frag,
+ "#define DOF_FOREGROUND_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE true\n");
+ SHADER(DOF_SCATTER_FOREGROUND,
+ eevee_depth_of_field_scatter_vert,
+ nullptr,
+ eevee_depth_of_field_scatter_frag,
+ "#define DOF_FOREGROUND_PASS true\n"
+ "#define DOF_BOKEH_TEXTURE false\n");
+ SHADER_FULLSCREEN(DOF_SETUP, eevee_depth_of_field_setup_frag);
+ SHADER_FULLSCREEN_DEFINES(DOF_TILES_DILATE_MINABS,
+ eevee_depth_of_field_tiles_dilate_frag,
+ "#define DILATE_MODE_MIN_MAX false\n");
+ SHADER_FULLSCREEN_DEFINES(DOF_TILES_DILATE_MINMAX,
+ eevee_depth_of_field_tiles_dilate_frag,
+ "#define DILATE_MODE_MIN_MAX true\n");
+ SHADER_FULLSCREEN(DOF_TILES_FLATTEN, eevee_depth_of_field_tiles_flatten_frag);
+ SHADER(MESH, eevee_object_mesh_vert, nullptr, eevee_object_forward_frag, nullptr);
#undef SHADER
#undef SHADER_FULLSCREEN
@@ -137,7 +265,7 @@ class ShaderModule {
desc.geometry_shader_code,
desc.fragment_shader_code,
shader_lib_,
- nullptr,
+ desc.defines_shader_code,
desc.name);
if (shaders_[shader_type] == nullptr) {
fprintf(stderr, "EEVEE: error: Could not compile static shader \"%s\"\n", desc.name);