C# UWP应用程序使用DX合成器实时模糊背景

C# UWP应用程序使用DX合成器实时模糊背景,c#,directx,win-universal-app,composition,uwp-xaml,C#,Directx,Win Universal App,Composition,Uwp Xaml,因此,UWP合成支持已经推出一段时间了,我正在寻找一种方法来实时模糊元素(在元素移动或加载时实时模糊,而不是静态快照)。到目前为止,我一直在寻找有关stackoverflow和google的一些答案,这些答案引导我使用和Win2D。它们都不足以提供实时模糊支持。我知道在合成中实时模糊是可能的,因为我看过模糊视频的演示,还有一个过时的项目,它允许你在8.1应用程序上使用DX模糊几乎任何东西 我不想使用RenderTargetBitmap(想保持我的UI线程空闲)。我如何仅使用合成API来实现这一点

因此,UWP合成支持已经推出一段时间了,我正在寻找一种方法来实时模糊元素(在元素移动或加载时实时模糊,而不是静态快照)。到目前为止,我一直在寻找有关stackoverflow和google的一些答案,这些答案引导我使用和Win2D。它们都不足以提供实时模糊支持。我知道在合成中实时模糊是可能的,因为我看过模糊视频的演示,还有一个过时的项目,它允许你在8.1应用程序上使用DX模糊几乎任何东西

我不想使用
RenderTargetBitmap
(想保持我的UI线程空闲)。我如何仅使用合成API来实现这一点:

ContainerVisual rootVisual = GetVisual(this.Content);
Compositor compositor = rootVisual.Compositor;

// what next?

非常感谢您的帮助:)

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

先决条件

  • 针对Windows 10周年更新
  • 对可视化层和可视化树如何工作的基本理解。你可以找到更多
  • 此外,您可以查看我编写的要点,这是在XAML应用程序中使用CompositionAPI快速启动和运行的一种方法。它还演示了如何使用效果。不仅如此,它还包括使用CompositionAPI加载图像(使用我编写的包)

    入门

    有两种方法可以在合成API中使用模糊效果。一种是应用于单个曲面的法线效果。另一种方法是将其用作“背景”画笔,将其后面的所有内容都提取出来并使其模糊

    要使用模糊效果,需要使用Win2D中的高斯模糊效果定义。事情是这样的:

    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"});
    
    第二个参数不是必需的,但如果提供该参数,则可以在编译效果后设置命名属性的动画或更改命名属性。在这种情况下,我们现在可以更改或设置模糊量的动画。如果要重用模糊效果工厂来创建多个模糊效果笔刷,但使它们都使用不同的模糊量,则此选项非常有用

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

    单个曲面

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

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

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

    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

    给我看更多


    要看更多,请前往我们的网站!我们已经创建了一个自定义XAML控件,可以帮助您解决问题,您可以看到它的实际操作。你也可以看到//build谈话。

    我会等到//build(明天开始)-我怀疑那里会宣布一些有助于在UWP中模糊的东西。是的,他们可能会,但我不在参加build的富人之列,所以可能会有人分享它,至少是其中的一部分,channel9将主持接下来的所有会议:)已经一个接一个地进行了。到目前为止还没有消息。我真的很想看看这些示例,但我无法在Visual Studio中加载任何项目。我有最新版本的VS2015和更新2,它不断弹出消息说,一个或多个项目需要平台SDK,但我的系统(10.0.14332.0)上没有安装。在消息对话框中有一个安装SDK的链接,但当我单击该链接时,它将指向Microsoft官方主页。erotavlas,您是否查看了此wiki页面上的“已知问题”部分:?我会将你系统的Windows版本与你安装的SDK进行比较,确保它们匹配。此外,您可能需要打开csproj文件并编辑目标版本号和最小版本号,以匹配现有版本号。