[Bf-blender-cvs] [e951f5f0fe0] tmp-eevee-shadowmap-refactor: Eevee: Replace ESM and VSM by PCF shadow mapping

Clément Foucault noreply at git.blender.org
Mon Sep 2 16:53:12 CEST 2019


Commit: e951f5f0fe026696e9479a6fe9171c97a3818497
Author: Clément Foucault
Date:   Mon Aug 26 14:53:15 2019 +0200
Branches: tmp-eevee-shadowmap-refactor
https://developer.blender.org/rBe951f5f0fe026696e9479a6fe9171c97a3818497

Eevee: Replace ESM and VSM by PCF shadow mapping

PCF shadowmaps are less prone to light leaking and are faster to
render.

This remove a substantial part of the shadowing code.

===================================================================

M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/eevee_subsurface.c
M	source/blender/draw/engines/eevee/eevee_volumes.c
M	source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lights_lib.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index b792f93ced2..8016e11e55a 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -36,17 +36,8 @@ void EEVEE_view_layer_data_free(void *storage)
   DRW_UBO_FREE_SAFE(sldata->light_ubo);
   DRW_UBO_FREE_SAFE(sldata->shadow_ubo);
   DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_target_fb);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_store_fb);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cube_copy_fb);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_target_fb);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_store_fb);
-  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_cascade_copy_fb);
-  DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
-  DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
+  GPU_FRAMEBUFFER_FREE_SAFE(sldata->shadow_fb);
   DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
-  DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
-  DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
   DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_pool);
   MEM_SAFE_FREE(sldata->shcasters_buffers[0].shadow_casters);
   MEM_SAFE_FREE(sldata->shcasters_buffers[0].flags);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index afc86af35f9..f2b8eb042ae 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -269,9 +269,7 @@ static void eevee_draw_background(void *vedata)
     if (DRW_state_draw_background()) {
       DRW_draw_pass(psl->background_pass);
     }
-    EEVEE_draw_default_passes(psl);
-    DRW_draw_pass(psl->material_pass);
-    DRW_draw_pass(psl->material_pass_cull);
+    EEVEE_materials_draw_opaque(sldata, psl);
     EEVEE_subsurface_data_render(sldata, vedata);
     DRW_stats_group_end();
 
diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c
index 8b1309e8537..63594e64df9 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -912,11 +912,9 @@ static void lightbake_render_scene_face(int face, EEVEE_BakeRenderData *user_dat
   DRW_draw_pass(psl->depth_pass);
   DRW_draw_pass(psl->depth_pass_cull);
   DRW_draw_pass(psl->probe_background);
-  DRW_draw_pass(psl->material_pass);
-  DRW_draw_pass(psl->material_pass_cull);
+  EEVEE_materials_draw_opaque(sldata, psl);
   DRW_draw_pass(psl->sss_pass); /* Only output standard pass */
   DRW_draw_pass(psl->sss_pass_cull);
-  EEVEE_draw_default_passes(psl);
   DRW_draw_pass(psl->transparent_pass);
 }
 
@@ -987,9 +985,7 @@ static void lightbake_render_scene_reflected(int layer, EEVEE_BakeRenderData *us
   GPU_framebuffer_bind(fbl->planarref_fb);
 
   /* Shading pass */
-  EEVEE_draw_default_passes(psl);
-  DRW_draw_pass(psl->material_pass);
-  DRW_draw_pass(psl->material_pass_cull);
+  EEVEE_materials_draw_opaque(sldata, psl);
   DRW_draw_pass(psl->sss_pass); /* Only output standard pass */
   DRW_draw_pass(psl->sss_pass_cull);
   DRW_draw_pass(psl->refract_pass);
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 0bfc23b8354..b4c833f4e89 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -39,21 +39,10 @@
 
 static struct {
   struct GPUShader *shadow_sh;
-  struct GPUShader *shadow_store_cube_sh[SHADOW_METHOD_MAX];
-  struct GPUShader *shadow_store_cube_high_sh[SHADOW_METHOD_MAX];
-  struct GPUShader *shadow_store_cascade_sh[SHADOW_METHOD_MAX];
-  struct GPUShader *shadow_store_cascade_high_sh[SHADOW_METHOD_MAX];
-  struct GPUShader *shadow_copy_cube_sh[SHADOW_METHOD_MAX];
-  struct GPUShader *shadow_copy_cascade_sh[SHADOW_METHOD_MAX];
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_shadow_vert_glsl[];
 extern char datatoc_shadow_frag_glsl[];
-extern char datatoc_shadow_process_vert_glsl[];
-extern char datatoc_shadow_process_geom_glsl[];
-extern char datatoc_shadow_store_frag_glsl[];
-extern char datatoc_shadow_copy_frag_glsl[];
-extern char datatoc_concentric_samples_lib_glsl[];
 
 extern char datatoc_common_view_lib_glsl[];
 
@@ -158,25 +147,13 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
       (linfo->shadow_high_bitdepth != sh_high_bitdepth)) {
     BLI_assert((sh_cube_size > 0) && (sh_cube_size <= 4096));
     DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_pool);
-    DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
-    DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
-
-    /* Compute adequate size for the octahedral map. */
-    linfo->shadow_cube_store_size = OCTAHEDRAL_SIZE_FROM_CUBESIZE(sh_cube_size);
-
-    CLAMP(linfo->shadow_cube_store_size, 1, 4096);
     CLAMP(sh_cube_size, 1, 4096);
-
-    linfo->shadow_render_data.cube_texel_size = 1.0f / sh_cube_size;
   }
 
   if ((linfo->shadow_cascade_size != sh_cascade_size) || (linfo->shadow_method != sh_method) ||
       (linfo->shadow_high_bitdepth != sh_high_bitdepth)) {
     BLI_assert((sh_cascade_size > 0) && (sh_cascade_size <= 4096));
     DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_pool);
-    DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
-    DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
-
     CLAMP(sh_cascade_size, 1, 4096);
   }
 
@@ -184,116 +161,6 @@ void EEVEE_lights_init(EEVEE_ViewLayerData *sldata)
   linfo->shadow_method = sh_method;
   linfo->shadow_cube_size = sh_cube_size;
   linfo->shadow_cascade_size = sh_cascade_size;
-
-  /* only compile the ones needed. reduce startup time. */
-  if ((sh_method == SHADOW_ESM) && !e_data.shadow_copy_cube_sh[SHADOW_ESM]) {
-    e_data.shadow_copy_cube_sh[SHADOW_ESM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
-                                                               datatoc_shadow_process_geom_glsl,
-                                                               datatoc_shadow_copy_frag_glsl,
-                                                               "#define ESM\n"
-                                                               "#define COPY\n");
-    e_data.shadow_copy_cascade_sh[SHADOW_ESM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
-                                                                  datatoc_shadow_process_geom_glsl,
-                                                                  datatoc_shadow_copy_frag_glsl,
-                                                                  "#define ESM\n"
-                                                                  "#define COPY\n"
-                                                                  "#define CSM\n");
-  }
-  else if ((sh_method == SHADOW_VSM) && !e_data.shadow_copy_cube_sh[SHADOW_VSM]) {
-    e_data.shadow_copy_cube_sh[SHADOW_VSM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
-                                                               datatoc_shadow_process_geom_glsl,
-                                                               datatoc_shadow_copy_frag_glsl,
-                                                               "#define VSM\n"
-                                                               "#define COPY\n");
-    e_data.shadow_copy_cascade_sh[SHADOW_VSM] = DRW_shader_create(datatoc_shadow_process_vert_glsl,
-                                                                  datatoc_shadow_process_geom_glsl,
-                                                                  datatoc_shadow_copy_frag_glsl,
-                                                                  "#define VSM\n"
-                                                                  "#define COPY\n"
-                                                                  "#define CSM\n");
-  }
-}
-
-static GPUShader *eevee_lights_get_store_sh(int shadow_method, bool high_blur, bool cascade)
-{
-  GPUShader **shader;
-
-  if (cascade) {
-    shader = (high_blur) ? &e_data.shadow_store_cascade_high_sh[shadow_method] :
-                           &e_data.shadow_store_cascade_sh[shadow_method];
-  }
-  else {
-    shader = (high_blur) ? &e_data.shadow_store_cube_high_sh[shadow_method] :
-                           &e_data.shadow_store_cube_sh[shadow_method];
-  }
-
-  if (*shader == NULL) {
-    DynStr *ds_frag = BLI_dynstr_new();
-    BLI_dynstr_append(ds_frag, datatoc_concentric_samples_lib_glsl);
-    BLI_dynstr_append(ds_frag, datatoc_shadow_store_frag_glsl);
-    char *store_shadow_shader_str = BLI_dynstr_get_cstring(ds_frag);
-    BLI_dynstr_free(ds_frag);
-
-    ds_frag = BLI_dynstr_new();
-    BLI_dynstr_append(ds_frag, (shadow_method == SHADOW_VSM) ? "#define VSM\n" : "#define ESM\n");
-    if (high_blur) {
-      BLI_dynstr_append(ds_frag, "#define HIGH_BLUR\n");
-    }
-    if (cascade) {
-      BLI_dynstr_append(ds_frag, "#define CSM\n");
-    }
-    char *define_str = BLI_dynstr_get_cstring(ds_frag);
-    BLI_dynstr_free(ds_frag);
-
-    *shader = DRW_shader_create(datatoc_shadow_process_vert_glsl,
-                                datatoc_shadow_process_geom_glsl,
-                                store_shadow_shader_str,
-                                define_str);
-
-    MEM_freeN(store_shadow_shader_str);
-    MEM_freeN(define_str);
-  }
-
-  return *shader;
-}
-
-static DRWPass *eevee_lights_cube_store_pass_get(EEVEE_PassList *psl,
-                                                 EEVEE_ViewLayerData *sldata,
-                                                 int shadow_method,
-                                                 int shadow_samples_len)
-{
-  bool high_blur = shadow_samples_len > 16;
-  DRWPass **pass = (high_blur) ? &psl->shadow_cube_store_pass : &psl->shadow_cube_store_high_pass;
-  if (*pass == NULL) {
-    *pass = DRW_pass_create("Shadow Cube Storage Pass", DRW_STATE_WRITE_COLOR);
-    GPUShader *shader = eevee_lights_get_store_sh(shadow_method, high_blur, false);
-    DRWShadingGroup *grp = DRW_shgroup_create(shader, *pass);
-    DRW_shgroup_uniform_texture_ref(grp, "shadowTexture", &sldata->shadow

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list