Eevee: Draw background after depth prepass.

Reduce overdraw. 0.4ms goes to 0.01ms if background is completely occluded.
This commit is contained in:
2017-07-31 15:15:42 +02:00
parent 683e31fd80
commit 1be1600c32
3 changed files with 13 additions and 12 deletions

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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;