问题标签 [direct-composition]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
306 浏览

c++ - 在 C++ 中使用 Windows 合成引擎的每像素透明窗口

我想在窗口上显示原始 BGRA 数据(所以我有一个无符号整数 *,具有宽度和高度),以便考虑 alpha 分量以具有每像素透明度。最终目的是将其集成到图形工具包中。

阅读 Kenny Kerr 的文章后(https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/june/windows-with-c-high-performance-window-layering-using-the-windows- composition-engine ) 我认为它可以解决我的问题。

我已经编写了一个完整的代码来完成文章中描述的操作(使用 C++ 中的 Windows 组合引擎的透明窗口):带半透明磁盘的透明窗口

所以,基本上,我现在正在做的是:

  • 从交换链中获取缓冲区(一个表面)
  • 使用 CreateBitmapFromDxgiSurface 获取位图
  • 我分配了一个 BGRA 测试数据
  • 使用 CopyFromMemory 将我的 BGRA 数据复制到位图上
  • 在 BeginDraw 和 EndDraw 之间,我称之为 DrawBitmap

但是,无论我为传递给 CreateBitmapFromDxgiSurface 的属性的 bitmapOptions 使用什么标志,应用程序都会崩溃,并且 D2D 调试层会提到如下错误:“警告:D2D 调试错误 - 位图选项 [0x1] 必须是与DXGI 表面。”

完整的代码在这里:

在互联网上搜索 1 周后,尤其是在 msdn 上,我找不到解决方案。我尝试了几种标志组合,但这个程序总是崩溃。

有人知道出了什么问题吗?

谢谢你

0 投票
1 回答
170 浏览

c++ - 基于窗口位置的 Direct X 裁剪位图并将其渲染回窗口

我正在研究一个使用DirectXDirect Composition. 我正在尝试创建类似于 windows 丙烯酸模糊的类似效果。使用直接合成,我能够将模糊效果、饱和度和混合应用于给定的输入。windows 丙烯酸模糊使用窗口后面的内容作为模糊的输入,但在 win32 中是不可能的,所以我决定使用桌面背景作为模糊功能的输入。但问题是我能够根据窗口位置裁剪背景,但是如果我将窗口移动到新位置,位图会根据新RECT窗口进行裁剪,但在移动到新位置时会闪烁。

这是预览:

这是实际窗口的屏幕截图:

窗户

此处红色框包含使用窗口 RECT 饱和和裁剪的位图(参见色差)。

这是重现问题的简单代码:

Please don't forget to replace "C:/Users/selas/Downloads/wallpaper.jpg" with your desktop wallpaper

注意:示例视频实际上是经过编辑的,而不是我得到的输出。

0 投票
0 回答
135 浏览

winapi - vulkan 可以与直接合成进行互操作以实现窗口背景模糊效果吗?

是否可以将 Win10 合成器用于“丙烯酸模糊”效果但使用 Vulkan 进行渲染?似乎可能是通过创建 DXGI 交换链并以某种方式使用 Vulkan 外部内存扩展。但我找不到任何这样的例子。

另外我不知道创建 Vulkan 交换链并以某种方式将其共享给 Direct Composition 或创建 D3D12 交换链并以某种方式与 Vulkan 共享以进行渲染是否更好?

0 投票
1 回答
145 浏览

winapi - DCompositionCreateDevice2: E_INVALIDARG 一个或多个参数无效

使用 VS 2015 编译的函数运行 Win32C++ 源代码时出现异常问题DCompositionCreateDevice2。源代码编译没有任何错误,但显示上述运行时错误。用VS 2019重新编译和运行相同的源代码,没有运行时错误。测试示例代码是下面列出的 Windows SDK 示例: TouchInputDirectManipulation

DCompV2Backface 和 D2DBatching

知道这个问题的根源是什么吗?我正在做 WTL 开源项目,并不想将构建环境限制为 VS 2019。

0 投票
0 回答
147 浏览

uwp - 为 CompositionClip 使用复杂路径

VisualUWP/WinUI 中的 s 可以Clip对它们应用一个CompositionClip. 其中一种类型CompositionClip是 a GeometricClip,它可以具有Geometry从类派生的各种类型CompositionGeometry。我正在寻找一个具有圆角矩形形状但具有不同椭圆角半径的剪辑,如下所示

在此处输入图像描述

这将非常适合,CompositionRoundedRectangleGeometry但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。所以剩下CompositionPathGeometryPath就是由一个CompositionPath实例定义的。这是我走到了死胡同的地方。

CompositionPath 实现IGeometrySource2D接口。我不知道如何使用这个IGeometrySource2D界面来构造一条带有线条和曲线的复杂路径。在线搜索导致这篇文章也避开了使用该接口,而是使用围绕CanvasPathGeometry它构建的类Windows Community Toolkit,如果我理解正确,仅适用于C#根据GitHub 页面的项目,并且对我不起作用,因为我需要一些东西在 C++ 中。

所以问题是:

  • 我们如何使用IGeometrySource2DCompositionPath创建复杂的形状?如果不可行,那么
  • 语言投影有什么等价CanvasPathGeometry物吗?C++/WinRT

PS我知道WinUI 3提供RectangleClip(根据this answer)适用于我的情况,但在UWP中不可用,所以这对我来说不是一个可行的解决方案。

编辑:

Win2D.UWP根据评论中共享的建议/指针,这是使用 NuGet 包的尝试。

这似乎有效

Win2DRoundedRecangle

现在,下一步将努力删除对et al的Win2D依赖,并使用其他接口来提供,因为我不希望将 NuGet 包作为项目依赖CanvasPathID2D1GeometryIGeomterySource2D

0 投票
1 回答
19 浏览

c++ - DirectManipulation ScrollTo 功能

我正在使用DirectCompositionDirectManipulation编写一个 Win32 应用程序 (C++) 。我通过设置视口和内容视觉效果成功地创建了自己的滚动视图控件。

这一切都很好,但我似乎无法弄清楚如何以编程方式移动视口中的内容。我想创建ScrollTo一些行为,您可以在其中看到一些内容。

我一直在摆弄,SyncContentTransform但它似乎没有做任何事情。我是否需要调用其他函数来提交同步?文档和示例几乎不存在,我希望有人可以帮助我。

0 投票
1 回答
133 浏览

c# - ICompositorDesktopInterop 在 TFM .NET 5 中引发异常

我试图将 C# 代码从 .NET 4.8 移植到 .NET 5,旧版本的 .NET 正在使用Microsoft.Windows.SDK.Contracts,在 .NET 5Microsoft.Windows.SDK.Contracts中被目标框架名字对象(TFM)替换我使用相同的代码并尝试将合成器转换为ICompositorDesktopInterop 但它抛出异常:

System.PlatformNotSupportedException:“.NET 运行时不支持编组为 IInspectable。”

这是代码:

这是我使用的 Com 接口定义:

为什么它不能与 TFM 一起使用?有什么我错过的吗?

0 投票
0 回答
96 浏览

c++ - 使用 IDCompositionGaussianBlurEffect 时的白色边框

我的主要目标是在 Windows 的 C++ 中创建像在 Windows UWP 设置 UI 中一样的亚克力效果。为了创建回视觉,我使用私有 API DwmpCreateSharedVirtualDesktopVisual,这是可行的。但是现在,当我使用 IDCompositionGaussianBlurEffect 将高斯效果应用于产生下图中的白色边框的 rootvisual 时,我尝试了几种方法,例如缩放 root visual 和平移以隐藏边框,但它不起作用。

在此处输入图像描述

0 投票
0 回答
84 浏览

c++ - direct2d:优化位图上几个 BGRA 矩形的渲染

我正在将一个工具包(即 EFL)引擎从纯 GDI 移植到 Direct2D。更准确地说,我正在添加一个 Direct2D 引擎。目的是拥有比 GDI 更快的引擎。

这个工具包是跨平台的,已经存在很长时间了,所以我不能修改它。我可以使用它提供给我的东西。

它有一个状态完整的画布。当必须绘制窗口的内容时,它会提供一个 BGRA 矩形数组(x、y、w、h 和 BGRA 数据),该数组自上一个窗口内容以来已被修改。

我已经在考虑 DirectComposition 的情况下设置了 D2D(还具有每个像素的透明度,并且 Kenny Kerr 说过它比没有直接组合的情况要快)。

天真的方法是创建一个大小为寡妇大小的位图,并保留它以供渲染。然后我执行以下步骤:

  1. 我遍历矩形,对于每个矩形,我调用 CopyFromMemory() 来更新位图中的每个矩形区域
  2. 我打电话给 BeginDraw()
  3. 我调用 DrawBitmap() 来渲染整个位图
  4. 我打电话给 EndDraw()

有用。这是完整的代码:

该代码的第一部分是创建和销毁窗口,第二部分处理 Direct2D。函数 render() 渲染背景。函数 draw() 呈现 2 个 BGRA 矩形(实际上是正方形......)。

我的问题:有没有比调用多次 CopyFromMemory() 更快的方法,比如在我的 draw() 函数中,来实现这一点?

谢谢你

0 投票
2 回答
55 浏览

c++ - 包含导致大量错误

我刚刚在我的 d3d11 应用程序中实现了 dcomp,在尝试编译后,我遇到了 1.5k 错误,这些错误都与 d2d 相关。我根本没有在我的应用程序中使用 d2d 并且很困惑,在查看 dcomp.h 时,很明显 dcomp 包含 d2d1_1.h 作为其中的一部分。每当我包含 dcomp.h 或 d2d1_1.h 时,我都会遇到这些错误。大多数与 dcommon.h 相关的未定义类型(我尝试包括与错误没有区别)

我已尝试通过执行以下操作来解决此包含问题:包含 dcommon.h、包含 d2d1.h、将 windows sdk 更新到最新版本。这些都没有解决问题,我仍然不能在不包括 d2d1_1.h 的情况下包括 dcomp.h。有谁知道如何解决这个问题?这个问题与代码无关,因为无论我的 dcomp 代码如何,都会发生这些错误,纯粹包含这些文件会引发这些错误。

示例错误: Severity Code Description Project File Line Suppression State Error (active) E0020 identifier "D2D_RECT_L" is undefined ext C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\d2d1_1.h 57