diff options
6 files changed, 62 insertions, 3 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 0864d869451..8fb73bd605f 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -241,6 +241,7 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_ if (use_alpha) { DRW_shgroup_uniform_texture_ref(grp, "scatterAlphaBuffer", &effects->dof_blur_alpha); + DRW_shgroup_uniform_bool_copy(grp, "unpremult", DRW_state_is_image_render()); } } } diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 79b4cb231a8..a4d3bc5b276 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -168,6 +168,11 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, effects->enabled_effects |= EFFECT_NORMAL_BUFFER; } + /* Alpha checker if background is not drawn in viewport. */ + if (!DRW_state_is_image_render() && !DRW_state_draw_background()) { + effects->enabled_effects |= EFFECT_ALPHA_CHECKER; + } + /** * Ping Pong buffer */ @@ -361,6 +366,23 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_mat4(grp, "pastPersmat", effects->velocity_past_persmat); DRW_shgroup_call_add(grp, quad, NULL); } + + if ((effects->enabled_effects & EFFECT_ALPHA_CHECKER) != 0) { + psl->alpha_checker = DRW_pass_create("Alpha Checker", + DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL_UNDER); + + GPUShader *checker_sh = GPU_shader_get_builtin_shader(GPU_SHADER_2D_CHECKER); + + DRWShadingGroup *grp = DRW_shgroup_create(checker_sh, psl->alpha_checker); + + copy_v4_fl4(effects->color_checker_dark, 0.15f, 0.15f, 0.15f, 1.0f); + copy_v4_fl4(effects->color_checker_light, 0.2f, 0.2f, 0.2f, 1.0f); + + DRW_shgroup_uniform_vec4(grp, "color1", effects->color_checker_dark, 1); + DRW_shgroup_uniform_vec4(grp, "color2", effects->color_checker_light, 1); + DRW_shgroup_uniform_int_copy(grp, "size", 8); + DRW_shgroup_call_add(grp, quad, NULL); + } } #if 0 /* Not required for now */ @@ -491,6 +513,26 @@ void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, GPUTexture *texture_src, i DRW_stats_group_end(); } +void EEVEE_draw_alpha_checker(EEVEE_Data *vedata) +{ + EEVEE_PassList *psl = vedata->psl; + EEVEE_StorageList *stl = vedata->stl; + EEVEE_EffectsInfo *effects = stl->effects; + + if ((effects->enabled_effects & EFFECT_ALPHA_CHECKER) != 0) { + float mat[4][4]; + unit_m4(mat); + + /* Fragile, rely on the fact that GPU_SHADER_2D_CHECKER + * only use the persmat. */ + DRW_viewport_matrix_override_set(mat, DRW_MAT_PERS); + + DRW_draw_pass(psl->alpha_checker); + + DRW_viewport_matrix_override_unset(DRW_MAT_PERS); + } +} + void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) { EEVEE_PassList *psl = vedata->psl; diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 6232640aac8..b82df5d7968 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -311,6 +311,9 @@ static void eevee_draw_background(void *vedata) GPU_framebuffer_bind(dfbl->default_fb); DRW_transform_to_display(stl->effects->final_tx, true, use_render_settings); + /* Draw checkerboard with alpha under. */ + EEVEE_draw_alpha_checker(vedata); + /* Debug : Output buffer to view. */ switch (G.debug_value) { case 1: diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 8e21c7f389c..b2aeffb0d1a 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -246,6 +246,7 @@ typedef struct EEVEE_PassList { struct DRWPass *color_downsample_cube_ps; struct DRWPass *velocity_resolve; struct DRWPass *taa_resolve; + struct DRWPass *alpha_checker; /* HiZ */ struct DRWPass *minz_downlevel_ps; @@ -537,6 +538,7 @@ typedef enum EEVEE_EffectsFlag { EFFECT_VELOCITY_BUFFER = (1 << 12), /* Not really an effect but a feature */ EFFECT_TAA_REPROJECT = (1 << 13), /* should be mutually exclusive with EFFECT_TAA */ EFFECT_DEPTH_DOUBLE_BUFFER = (1 << 14), /* Not really an effect but a feature */ + EFFECT_ALPHA_CHECKER = (1 << 15), /* Not really an effect but a feature */ } EEVEE_EffectsFlag; typedef struct EEVEE_EffectsInfo { @@ -598,6 +600,9 @@ typedef struct EEVEE_EffectsInfo { struct GPUTexture *dof_coc; struct GPUTexture *dof_blur; struct GPUTexture *dof_blur_alpha; + /* Alpha Checker */ + float color_checker_dark[4]; + float color_checker_light[4]; /* Other */ float prev_persmat[4][4]; /* Bloom */ @@ -1073,6 +1078,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, struct GPUTexture *depth_src, int layer); void EEVEE_downsample_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level); void EEVEE_downsample_cube_buffer(EEVEE_Data *vedata, struct GPUTexture *texture_src, int level); +void EEVEE_draw_alpha_checker(EEVEE_Data *vedata); void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata); void EEVEE_effects_free(void); diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl index 8a10962c6ef..d8cec17af58 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl @@ -5,6 +5,7 @@ uniform sampler2D colorBuffer; uniform sampler2D depthBuffer; uniform vec2 dofParams; +uniform bool unpremult; #define dof_mul dofParams.x /* distance * aperturesize * invsensorsize */ #define dof_bias dofParams.y /* aperturesize * invsensorsize */ @@ -241,8 +242,12 @@ void main(void) fragColor = (far_col + near_col + focus_col) * inv_weight_sum; # ifdef USE_ALPHA_DOF - /* Unpremult */ - fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0; + /* Sigh... viewport expect premult output but + * the final render output needs to be with + * associated alpha. */ + if (unpremult) { + fragColor.rgb /= (fragColor.a > 0.0) ? fragColor.a : 1.0; + } # endif } diff --git a/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl b/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl index 518eff29c62..ac6751fb5fb 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl @@ -39,7 +39,6 @@ vec3 clip_to_aabb(vec3 color, vec3 minimum, vec3 maximum, vec3 average) void main() { ivec2 texel = ivec2(gl_FragCoord.xy); - float depth = texelFetch(depthBuffer, texel, 0).r; vec2 motion = texelFetch(velocityBuffer, texel, 0).rg; /* Decode from unsigned normalized 16bit texture. */ @@ -96,6 +95,9 @@ void main() color_history = (out_of_view) ? color : color_history; FragColor = safe_color(color_history); + /* There is some ghost issue if we use the alpha + * in the viewport. Overwritting alpha fixes it. */ + FragColor.a = color.a; } #else |