使用DX Compositor的UWP App实时模糊背景

所以UWP Composition支持已经出现了一段时间我正在寻找一种方法来实时模糊元素(移动或加载时的实时模糊,而不是静态快照)。 到目前为止,我一直在看stackoverflow上的一些答案,谷歌导致我使用Lumia Imaging SDK Sample和Win2D。 它们都不足以支持实时模糊。 我知道在组合中可以实时模糊,因为我已经看过模糊video的演示,并且有一个过时的项目XAMLFx ,它允许你在8.1 Apps上使用DX模糊几乎任何东西。

我不想使用RenderTargetBitmap (希望保持我的UI线程免费)。 如何仅使用组合API来执行此操作:

 ContainerVisual rootVisual = GetVisual(this.Content); Compositor compositor = rootVisual.Compositor; // what next? 

任何帮助是极大的赞赏 :)

注意:这些function(模糊和背景画笔)需要Windows 10周年更新。您目前可以通过Windows Insider程序预览SDK

先决条件

  1. 针对Windows 10周年更新
  2. 对Visual Layer的基本了解以及Visual Tree的工作原理。 你可以在这里找到更多。

此外,您可以查看我在此处写的要点,这是在XAML应用程序中使用Composition API启动和运行的快速方法。 它也使用效果进行演示。 不仅如此,它还包括使用Composition API(使用我编写的包)加载图像。

入门

在Composition API中有两种方法可以消除模糊效果。 一种是适用于单个表面的正常效果。 另一种是将它用作“背景”画笔,它将所有内容置于其后面并使其模糊。

要使用模糊效果,您需要使用Win2D中的GaussianBlurEffect定义。 这是这样的:

 GaussianBlurEffect blurEffect = new GaussianBlurEffect() { Name = "Blur", BlurAmount = 0.0f, // You can place your blur amount here. BorderMode = EffectBorderMode.Hard, Optimization = EffectOptimization.Balanced, Source = new CompositionEffectSourceParameter("source") }; 

下一步是创建一个效果工厂:

 var effectFactory = compositor.CreateEffectFactory(blurEffect, new[] {"Blur.BlurAmount"}); 

第二个参数不是必需的,但提供它可以让您在编译效果后设置动画或更改命名属性。 在这种情况下,我们现在可以更改或动画BlurAmount。 如果您想重复使用模糊效果工厂来创建多个模糊效果画笔,但是它们都使用不同的BlurAmount,这将非常有用。

下一步取决于您希望效果如何工作。

单面

如果您希望它仅应用于单个曲面,您将执行以下操作:

 var effectBrush = effectFactory.CreateBrush(); effectBrush.SetSourceParameter("source", someOtherSurfaceBrush); visual.Brush = effectBrush; 

背景

但是,如果要在给定视觉后面动态模糊大量内容,则可以执行以下操作:

 var effectBrush = effectFactory.CreateBrush(); effectBrush.SetSourceParameter("source", compositor.CreateBackdropBrush()); visual.Brush = effectBrush; 

请注意,这看起来与第一种方法非常相似,但不是给它一个表面画笔,而是给它一个BackdropBrush。 这将实时显示视觉背后的内容并将其输入到效果源中。 在这种情况下,视觉的“后面”任何东西都会模糊。

性能

如果您只是模糊单个图像,最好模糊单个表面。 您应该尝试仅在真正需要时使用BackdropBrush。

告诉我更多!

要了解更多信息,请访问我们的GitHub页面 ! 我们已经创建了一个自定义XAML控件,可以帮助你在这里 ,你可以在这里看到它。 你也可以在这里看到// build talk。