diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-07-31 16:15:42 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-07-31 16:18:38 +0300 |
commit | 1be1600c325eb1a52e405fa06fb23f5dca156b17 (patch) | |
tree | e88d8935cc175dd3bb78d2e25fb6edee79b31c1c /source | |
parent | 683e31fd80d36cffe4c65cfc0e973bb191889eee (diff) |
Eevee: Draw background after depth prepass.
Reduce overdraw. 0.4ms goes to 0.01ms if background is completely occluded.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 5 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 13 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 7 |
3 files changed, 13 insertions, 12 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 4272e344119..ea72569b4d0 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -165,15 +165,14 @@ static void EEVEE_draw_scene(void *vedata) DRW_framebuffer_bind(fbl->main); DRW_framebuffer_clear(false, true, false, NULL, 1.0f); - /* TODO move background after depth pass to cut some overdraw */ - DRW_draw_pass(psl->background_pass); - /* Depth prepass */ DRW_stats_group_start("Prepass"); DRW_draw_pass(psl->depth_pass); DRW_draw_pass(psl->depth_pass_cull); DRW_stats_group_end(); + DRW_draw_pass(psl->background_pass); + /* Create minmax texture */ DRW_stats_group_start("Main MinMax buffer"); EEVEE_create_minmax_buffer(vedata, dtxl->depth, -1); diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 7f593c2cc61..7a446d221fa 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -334,7 +334,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *veda memset(pinfo->probes_planar_ref, 0, sizeof(pinfo->probes_planar_ref)); { - psl->probe_background = DRW_pass_create("World Probe Background Pass", DRW_STATE_WRITE_COLOR); + psl->probe_background = DRW_pass_create("World Probe Background Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL); struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); DRWShadingGroup *grp = NULL; @@ -1011,12 +1011,12 @@ static void render_scene_to_probe( DRW_viewport_matrix_override_set(viewinv, DRW_MAT_VIEWINV); DRW_viewport_matrix_override_set(winmat, DRW_MAT_WIN); - DRW_draw_pass(psl->probe_background); - /* Depth prepass */ DRW_draw_pass(psl->depth_pass); DRW_draw_pass(psl->depth_pass_cull); + DRW_draw_pass(psl->probe_background); + // EEVEE_create_minmax_buffer(vedata, e_data.cube_face_depth); /* Rebind Planar FB */ @@ -1069,6 +1069,7 @@ static void render_scene_to_planar( DRW_framebuffer_clear(false, true, false, NULL, 1.0); /* Turn off ssr to avoid black specular */ + /* TODO : Enable SSR in planar reflections? (Would be very heavy) */ sldata->probes->ssr_toggle = false; /* Avoid using the texture attached to framebuffer when rendering. */ @@ -1083,9 +1084,6 @@ static void render_scene_to_planar( DRW_viewport_matrix_override_set(viewmat, DRW_MAT_VIEW); DRW_viewport_matrix_override_set(viewinv, DRW_MAT_VIEWINV); - /* Background */ - DRW_draw_pass(psl->probe_background); - /* Since we are rendering with an inverted view matrix, we need * to invert the facing for backface culling to be the same. */ DRW_state_invert_facing(); @@ -1095,6 +1093,9 @@ static void render_scene_to_planar( DRW_draw_pass(psl->depth_pass_clip); DRW_draw_pass(psl->depth_pass_clip_cull); + /* Background */ + DRW_draw_pass(psl->probe_background); + EEVEE_create_minmax_buffer(vedata, tmp_planar_depth, layer); /* Rebind Planar FB */ diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index c1112eedf0d..8cd9dd4829d 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -343,8 +343,9 @@ void EEVEE_materials_init(EEVEE_StorageList *stl) frag_str = BLI_dynstr_get_cstring(ds_frag); BLI_dynstr_free(ds_frag); - e_data.default_background = DRW_shader_create_fullscreen( - datatoc_default_world_frag_glsl, NULL); + e_data.default_background = DRW_shader_create( + datatoc_background_vert_glsl, NULL, datatoc_default_world_frag_glsl, + NULL); e_data.default_prepass_sh = DRW_shader_create( datatoc_prepass_vert_glsl, NULL, datatoc_prepass_frag_glsl, @@ -668,7 +669,7 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata) } { - psl->background_pass = DRW_pass_create("Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); + psl->background_pass = DRW_pass_create("Background Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL); struct Gwn_Batch *geom = DRW_cache_fullscreen_quad_get(); DRWShadingGroup *grp = NULL; |