diff --git a/engine/src/flutter/impeller/entity/contents/filters/blend_filter_contents.cc b/engine/src/flutter/impeller/entity/contents/filters/blend_filter_contents.cc index 64c7559c5ad..682e8af1195 100644 --- a/engine/src/flutter/impeller/entity/contents/filters/blend_filter_contents.cc +++ b/engine/src/flutter/impeller/entity/contents/filters/blend_filter_contents.cc @@ -93,7 +93,8 @@ static std::optional AdvancedBlend( }); auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer); - auto options = OptionsFromPassAndEntity(pass, entity); + auto options = OptionsFromPass(pass); + options.blend_mode = BlendMode::kSource; std::shared_ptr> pipeline = std::invoke(pipeline_proc, renderer, options); diff --git a/engine/src/flutter/impeller/entity/entity_pass.cc b/engine/src/flutter/impeller/entity/entity_pass.cc index 71a7bd735c5..a2b5dfd5e11 100644 --- a/engine/src/flutter/impeller/entity/entity_pass.cc +++ b/engine/src/flutter/impeller/entity/entity_pass.cc @@ -205,7 +205,7 @@ bool EntityPass::Render(ContentContext& renderer, Entity entity; entity.SetContents(contents); - entity.SetBlendMode(BlendMode::kSourceOver); + entity.SetBlendMode(BlendMode::kSource); entity.Render(renderer, *render_pass); } @@ -535,7 +535,7 @@ bool EntityPass::OnRender( FilterContents::MakeBlend(result.entity.GetBlendMode(), inputs); contents->SetCoverageCrop(result.entity.GetCoverage()); result.entity.SetContents(std::move(contents)); - result.entity.SetBlendMode(BlendMode::kSourceOver); + result.entity.SetBlendMode(BlendMode::kSource); } //-------------------------------------------------------------------------- diff --git a/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl b/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl index 84e4781d99a..066644229e9 100644 --- a/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl +++ b/engine/src/flutter/impeller/entity/shaders/blending/advanced_blend.glsl @@ -23,12 +23,14 @@ in vec2 v_src_texture_coords; out vec4 frag_color; void main() { - vec4 dst = IPUnpremultiply(IPSampleWithTileMode( - texture_sampler_dst, // sampler - v_dst_texture_coords, // texture coordinates - blend_info.dst_y_coord_scale, // y coordinate scale - kTileModeDecal // tile mode - )); + vec4 dst_sample = + IPSampleWithTileMode(texture_sampler_dst, // sampler + v_dst_texture_coords, // texture coordinates + blend_info.dst_y_coord_scale, // y coordinate scale + kTileModeDecal // tile mode + ); + + vec4 dst = IPUnpremultiply(dst_sample); vec4 src = blend_info.color_factor > 0 ? blend_info.color : IPUnpremultiply(IPSampleWithTileMode( @@ -38,7 +40,8 @@ void main() { kTileModeDecal // tile mode )); - vec3 blended = Blend(dst.rgb, src.rgb); + vec4 blended = vec4(Blend(dst.rgb, src.rgb), 1) * dst.a; - frag_color = vec4(blended, 1) * src.a * dst.a; + frag_color = mix(dst_sample, blended, src.a); + //frag_color = dst_sample; }