Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_depth_of_field.c
| Show First 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | if (scene_eval->eevee.flag & SCE_EEVEE_DOF_ENABLED) { | ||||
| RegionView3D *rv3d = draw_ctx->rv3d; | RegionView3D *rv3d = draw_ctx->rv3d; | ||||
| const bool use_alpha = !DRW_state_draw_background(); | const bool use_alpha = !DRW_state_draw_background(); | ||||
| if (!e_data.dof_downsample_sh[use_alpha]) { | if (!e_data.dof_downsample_sh[use_alpha]) { | ||||
| eevee_create_shader_depth_of_field(use_alpha); | eevee_create_shader_depth_of_field(use_alpha); | ||||
| } | } | ||||
| if (camera) { | if (camera) { | ||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_render_size_get(); | ||||
| Camera *cam = (Camera *)camera->data; | Camera *cam = (Camera *)camera->data; | ||||
| /* Retrieve Near and Far distance */ | /* Retrieve Near and Far distance */ | ||||
| effects->dof_near_far[0] = -cam->clip_start; | effects->dof_near_far[0] = -cam->clip_start; | ||||
| effects->dof_near_far[1] = -cam->clip_end; | effects->dof_near_far[1] = -cam->clip_end; | ||||
| int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2}; | int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2}; | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | ||||
| EEVEE_TextureList *txl = vedata->txl; | |||||
| if ((effects->enabled_effects & EFFECT_DOF) != 0) { | if ((effects->enabled_effects & EFFECT_DOF) != 0) { | ||||
| /** Depth of Field algorithm | /** Depth of Field algorithm | ||||
| * | * | ||||
| * Overview : | * Overview : | ||||
| * - Downsample the color buffer into 2 buffers weighted with | * - Downsample the color buffer into 2 buffers weighted with | ||||
| * CoC values. Also output CoC into a texture. | * CoC values. Also output CoC into a texture. | ||||
| * - Shoot quads for every pixel and expand it depending on the CoC. | * - Shoot quads for every pixel and expand it depending on the CoC. | ||||
| * Do one pass for near Dof and one pass for far Dof. | * Do one pass for near Dof and one pass for far Dof. | ||||
| * - Finally composite the 2 blurred buffers with the original render. | * - Finally composite the 2 blurred buffers with the original render. | ||||
| */ | */ | ||||
| DRWShadingGroup *grp; | DRWShadingGroup *grp; | ||||
| struct GPUBatch *quad = DRW_cache_fullscreen_quad_get(); | struct GPUBatch *quad = DRW_cache_fullscreen_quad_get(); | ||||
| const bool use_alpha = !DRW_state_draw_background(); | const bool use_alpha = !DRW_state_draw_background(); | ||||
| psl->dof_down = DRW_pass_create("DoF Downsample", DRW_STATE_WRITE_COLOR); | psl->dof_down = DRW_pass_create("DoF Downsample", DRW_STATE_WRITE_COLOR); | ||||
| grp = DRW_shgroup_create(e_data.dof_downsample_sh[use_alpha], psl->dof_down); | grp = DRW_shgroup_create(e_data.dof_downsample_sh[use_alpha], psl->dof_down); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); | DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", txl->depth ? &txl->depth : &dtxl->depth); | ||||
| DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); | DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); | ||||
| DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); | DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); | ||||
| DRW_shgroup_call_add(grp, quad, NULL); | DRW_shgroup_call_add(grp, quad, NULL); | ||||
| psl->dof_scatter = DRW_pass_create("DoF Scatter", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE_FULL); | psl->dof_scatter = DRW_pass_create("DoF Scatter", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE_FULL); | ||||
| /* This create an empty batch of N triangles to be positioned | /* This create an empty batch of N triangles to be positioned | ||||
| * by the vertex shader 0.4ms against 6ms with instancing */ | * by the vertex shader 0.4ms against 6ms with instancing */ | ||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_render_size_get(); | ||||
| const int sprite_len = ((int)viewport_size[0] / 2) * ((int)viewport_size[1] / 2); /* brackets matters */ | const int sprite_len = ((int)viewport_size[0] / 2) * ((int)viewport_size[1] / 2); /* brackets matters */ | ||||
| grp = DRW_shgroup_empty_tri_batch_create(e_data.dof_scatter_sh[use_alpha], psl->dof_scatter, sprite_len); | grp = DRW_shgroup_empty_tri_batch_create(e_data.dof_scatter_sh[use_alpha], psl->dof_scatter, sprite_len); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near); | 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, "farBuffer", &effects->dof_down_far); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc); | DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc); | ||||
| DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2); | DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2); | ||||
| psl->dof_resolve = DRW_pass_create("DoF Resolve", DRW_STATE_WRITE_COLOR); | psl->dof_resolve = DRW_pass_create("DoF Resolve", DRW_STATE_WRITE_COLOR); | ||||
| grp = DRW_shgroup_create(e_data.dof_resolve_sh[use_alpha], psl->dof_resolve); | grp = DRW_shgroup_create(e_data.dof_resolve_sh[use_alpha], psl->dof_resolve); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur); | 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, "colorBuffer", &effects->source_buffer); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", txl->depth ? &txl->depth : &dtxl->depth); | ||||
| DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); | DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1); | ||||
| DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); | DRW_shgroup_uniform_vec2(grp, "dofParams", effects->dof_params, 1); | ||||
| DRW_shgroup_call_add(grp, quad, NULL); | DRW_shgroup_call_add(grp, quad, NULL); | ||||
| if (use_alpha) { | if (use_alpha) { | ||||
| DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha); | DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha); | ||||
| } | } | ||||
| } | } | ||||
| Show All 38 Lines | |||||