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>2018-05-12 22:01:07 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-05-13 00:28:55 +0300
commitd25ec499d89daf200c37ed547c50b1706d1b3557 (patch)
tree0f0a064a097be91c40adb2146e6a19bc3cebaaea /source/blender/draw/engines/eevee/eevee_depth_of_field.c
parent2dc5a84fad264da411b066706fbc7031770ac852 (diff)
Eevee: Depht Of Field: Merge Scatter passes together.
This means only one texture to draw to and only one sprite per pixel. The texture is twice as large and near and far planes are side by side. The sprite choose the biggest coc to expand to and is redirected to the area (layer) it belongs to. The fragment shader discard every pixel that does not belong to the correct layer.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_depth_of_field.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_depth_of_field.c40
1 files changed, 11 insertions, 29 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
index f4d534c4ccc..1ba9b5f9de4 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -120,18 +120,11 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
/* Go full 32bits for rendering and reduce the color artifacts. */
GPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F;
- effects->dof_far_blur = DRW_texture_pool_query_2D(buffer_size[0], buffer_size[1], fb_format,
- &draw_engine_eevee_type);
- GPU_framebuffer_ensure_config(&fbl->dof_scatter_far_fb, {
+ effects->dof_blur = DRW_texture_pool_query_2D(buffer_size[0] * 2, buffer_size[1], fb_format,
+ &draw_engine_eevee_type);
+ GPU_framebuffer_ensure_config(&fbl->dof_scatter_fb, {
GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(effects->dof_far_blur),
- });
-
- effects->dof_near_blur = DRW_texture_pool_query_2D(buffer_size[0], buffer_size[1], fb_format,
- &draw_engine_eevee_type);
- GPU_framebuffer_ensure_config(&fbl->dof_scatter_near_fb, {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(effects->dof_near_blur),
+ GPU_ATTACHMENT_TEXTURE(effects->dof_blur),
});
/* Parameters */
@@ -178,8 +171,7 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
/* Cleanup to release memory */
GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_down_fb);
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_far_fb);
- GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_near_fb);
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_fb);
return 0;
}
@@ -221,17 +213,16 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
const int sprite_ct = ((int)viewport_size[0] / 2) * ((int)viewport_size[1] / 2); /* brackets matters */
grp = DRW_shgroup_empty_tri_batch_create(e_data.dof_scatter_sh, psl->dof_scatter, sprite_ct);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->unf_source_buffer);
+ DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near);
+ DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_down_far);
DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc);
- DRW_shgroup_uniform_vec2(grp, "layerSelection", effects->dof_layer_select, 1);
DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2);
psl->dof_resolve = DRW_pass_create("DoF Resolve", DRW_STATE_WRITE_COLOR);
grp = DRW_shgroup_create(e_data.dof_resolve_sh, psl->dof_resolve);
+ DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur);
DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer);
- DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_near_blur);
- DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_far_blur);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1);
DRW_shgroup_uniform_vec3(grp, "dofParams", effects->dof_params, 1);
@@ -255,18 +246,9 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata)
GPU_framebuffer_bind(fbl->dof_down_fb);
DRW_draw_pass(psl->dof_down);
- /* Scatter Far */
- effects->unf_source_buffer = effects->dof_down_far;
- copy_v2_fl2(effects->dof_layer_select, 0.0f, 1.0f);
- GPU_framebuffer_bind(fbl->dof_scatter_far_fb);
- GPU_framebuffer_clear_color(fbl->dof_scatter_far_fb, clear_col);
- DRW_draw_pass(psl->dof_scatter);
-
- /* Scatter Near */
- effects->unf_source_buffer = effects->dof_down_near;
- copy_v2_fl2(effects->dof_layer_select, 1.0f, 0.0f);
- GPU_framebuffer_bind(fbl->dof_scatter_near_fb);
- GPU_framebuffer_clear_color(fbl->dof_scatter_near_fb, clear_col);
+ /* Scatter */
+ GPU_framebuffer_bind(fbl->dof_scatter_fb);
+ GPU_framebuffer_clear_color(fbl->dof_scatter_fb, clear_col);
DRW_draw_pass(psl->dof_scatter);
/* Resolve */