diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-01-24 19:28:51 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-01-25 17:02:49 +0300 |
commit | 3f6e14e667c4442bcc1f4d1fc795633cc706150f (patch) | |
tree | c0501be8f98350b1d5907d7a37b4382f38c1a4b7 /source/blender/draw/engines/workbench/workbench_deferred.c | |
parent | aae2bf77351103b15e5a97daed7f396a546c001c (diff) |
Workbench: Depth Of Field: Initial Commit
The algorithm used is borrowed from :
http://tuxedolabs.blogspot.com/2018/05/bokeh-depth-of-field-in-single-pass.html
This makes it possible to have a decent blur for foreground over defocused
background in one pass only.
The algorithm is using a gather approach that is much faster
than the scatter approach used in Eevee. This makes it possible to have
custom bokeh shapes (not implemented yet) which would be impossible with
a separable gaussian technique.
The blur is done in 2 steps. The first one define the shape of the bokeh
and the second that fill the undersampling.
A downsample max-CoC tile texture speed up the gathering process.
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_deferred.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_deferred.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index b48e64293fa..d1e32ea42d9 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -343,6 +343,9 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) WORKBENCH_PassList *psl = vedata->psl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); + RegionView3D *rv3d = draw_ctx->rv3d; + View3D *v3d = draw_ctx->v3d; + Object *camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL; if (!stl->g_data) { /* Alloc transient pointers */ @@ -406,6 +409,8 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) WORKBENCH_PrivateData *wpd = stl->g_data; workbench_private_data_init(wpd); + workbench_dof_engine_init(vedata, camera); + { const float *viewport_size = DRW_viewport_size_get(); const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]}; @@ -448,7 +453,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx), }); - GPU_framebuffer_ensure_config(&fbl->volume_fb, { + GPU_framebuffer_ensure_config(&fbl->color_only_fb, { GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(e_data.composite_buffer_tx), }); @@ -514,6 +519,10 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) workbench_aa_create_pass(vedata, &e_data.color_buffer_tx); } + { + workbench_dof_create_pass(vedata, &e_data.composite_buffer_tx); + } + if (CAVITY_ENABLED(wpd)) { int state = DRW_STATE_WRITE_COLOR; GPUShader *shader = workbench_cavity_shader_get(SSAO_ENABLED(wpd), CURVATURE_ENABLED(wpd)); @@ -583,6 +592,7 @@ void workbench_deferred_engine_free(void) workbench_volume_engine_free(); workbench_fxaa_engine_free(); workbench_taa_engine_free(); + workbench_dof_engine_free(); } static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp) @@ -1089,10 +1099,11 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata) DRW_draw_pass(psl->background_pass); if (wpd->volumes_do) { - GPU_framebuffer_bind(fbl->volume_fb); + GPU_framebuffer_bind(fbl->color_only_fb); DRW_draw_pass(psl->volume_pass); } + workbench_dof_draw_pass(vedata); workbench_aa_draw_pass(vedata, e_data.composite_buffer_tx); } |