问题标签 [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.
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 上,我找不到解决方案。我尝试了几种标志组合,但这个程序总是崩溃。
有人知道出了什么问题吗?
谢谢你
c++ - 基于窗口位置的 Direct X 裁剪位图并将其渲染回窗口
我正在研究一个使用DirectX
和Direct Composition
. 我正在尝试创建类似于 windows 丙烯酸模糊的类似效果。使用直接合成,我能够将模糊效果、饱和度和混合应用于给定的输入。windows 丙烯酸模糊使用窗口后面的内容作为模糊的输入,但在 win32 中是不可能的,所以我决定使用桌面背景作为模糊功能的输入。但问题是我能够根据窗口位置裁剪背景,但是如果我将窗口移动到新位置,位图会根据新RECT
窗口进行裁剪,但在移动到新位置时会闪烁。
这是预览:
这是实际窗口的屏幕截图:
此处红色框包含使用窗口 RECT 饱和和裁剪的位图(参见色差)。
这是重现问题的简单代码:
Please don't forget to replace "C:/Users/selas/Downloads/wallpaper.jpg" with your desktop wallpaper
注意:示例视频实际上是经过编辑的,而不是我得到的输出。
winapi - vulkan 可以与直接合成进行互操作以实现窗口背景模糊效果吗?
是否可以将 Win10 合成器用于“丙烯酸模糊”效果但使用 Vulkan 进行渲染?似乎可能是通过创建 DXGI 交换链并以某种方式使用 Vulkan 外部内存扩展。但我找不到任何这样的例子。
另外我不知道创建 Vulkan 交换链并以某种方式将其共享给 Direct Composition 或创建 D3D12 交换链并以某种方式与 Vulkan 共享以进行渲染是否更好?
winapi - DCompositionCreateDevice2: E_INVALIDARG 一个或多个参数无效
使用 VS 2015 编译的函数运行 Win32C++ 源代码时出现异常问题DCompositionCreateDevice2
。源代码编译没有任何错误,但显示上述运行时错误。用VS 2019重新编译和运行相同的源代码,没有运行时错误。测试示例代码是下面列出的 Windows SDK 示例:
TouchInputDirectManipulation
知道这个问题的根源是什么吗?我正在做 WTL 开源项目,并不想将构建环境限制为 VS 2019。
uwp - 为 CompositionClip 使用复杂路径
Visual
UWP/WinUI 中的 s 可以Clip
对它们应用一个CompositionClip
. 其中一种类型CompositionClip
是 a GeometricClip
,它可以具有Geometry
从类派生的各种类型CompositionGeometry
。我正在寻找一个具有圆角矩形形状但具有不同椭圆角半径的剪辑,如下所示
这将非常适合,CompositionRoundedRectangleGeometry
但该类有一个限制,即它支持在所有四个角上具有相同的椭圆半径,不允许不同的半径。所以剩下CompositionPathGeometry
的Path
就是由一个CompositionPath
实例定义的。这是我走到了死胡同的地方。
这CompositionPath
实现了IGeometrySource2D
接口。我不知道如何使用这个IGeometrySource2D
界面来构造一条带有线条和曲线的复杂路径。在线搜索导致这篇文章也避开了使用该接口,而是使用围绕CanvasPathGeometry
它构建的类Windows Community Toolkit
,如果我理解正确,仅适用于C#
根据此GitHub 页面的项目,并且对我不起作用,因为我需要一些东西在 C++ 中。
所以问题是:
- 我们如何使用
IGeometrySource2D
和CompositionPath
创建复杂的形状?如果不可行,那么 - 语言投影有什么等价
CanvasPathGeometry
物吗?C++/WinRT
PS我知道WinUI 3提供RectangleClip
(根据this answer)适用于我的情况,但在UWP中不可用,所以这对我来说不是一个可行的解决方案。
编辑:
Win2D.UWP
根据评论中共享的建议/指针,这是使用 NuGet 包的尝试。
这似乎有效
现在,下一步将努力删除对et al的Win2D
依赖,并使用其他接口来提供,因为我不希望将 NuGet 包作为项目依赖。CanvasPath
ID2D1Geometry
IGeomterySource2D
c++ - DirectManipulation ScrollTo 功能
我正在使用DirectComposition和DirectManipulation编写一个 Win32 应用程序 (C++) 。我通过设置视口和内容视觉效果成功地创建了自己的滚动视图控件。
这一切都很好,但我似乎无法弄清楚如何以编程方式移动视口中的内容。我想创建ScrollTo
一些行为,您可以在其中看到一些内容。
我一直在摆弄,SyncContentTransform
但它似乎没有做任何事情。我是否需要调用其他函数来提交同步?文档和示例几乎不存在,我希望有人可以帮助我。
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 一起使用?有什么我错过的吗?
c++ - direct2d:优化位图上几个 BGRA 矩形的渲染
我正在将一个工具包(即 EFL)引擎从纯 GDI 移植到 Direct2D。更准确地说,我正在添加一个 Direct2D 引擎。目的是拥有比 GDI 更快的引擎。
这个工具包是跨平台的,已经存在很长时间了,所以我不能修改它。我可以使用它提供给我的东西。
它有一个状态完整的画布。当必须绘制窗口的内容时,它会提供一个 BGRA 矩形数组(x、y、w、h 和 BGRA 数据),该数组自上一个窗口内容以来已被修改。
我已经在考虑 DirectComposition 的情况下设置了 D2D(还具有每个像素的透明度,并且 Kenny Kerr 说过它比没有直接组合的情况要快)。
天真的方法是创建一个大小为寡妇大小的位图,并保留它以供渲染。然后我执行以下步骤:
- 我遍历矩形,对于每个矩形,我调用 CopyFromMemory() 来更新位图中的每个矩形区域
- 我打电话给 BeginDraw()
- 我调用 DrawBitmap() 来渲染整个位图
- 我打电话给 EndDraw()
有用。这是完整的代码:
该代码的第一部分是创建和销毁窗口,第二部分处理 Direct2D。函数 render() 渲染背景。函数 draw() 呈现 2 个 BGRA 矩形(实际上是正方形......)。
我的问题:有没有比调用多次 CopyFromMemory() 更快的方法,比如在我的 draw() 函数中,来实现这一点?
谢谢你
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