问题标签 [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 回答
2640 浏览

c++ - DirectComposition 渲染到纹理?

我想让直接合成渲染到纹理。这可能吗?

这样做的原因是我希望能够将 gpu 加速的无窗口透明 Flash 播放器 activex 控件渲染到纹理。这通常是不可能的,但我希望通过 DirectComposition 实现。

0 投票
1 回答
766 浏览

c# - WIC 或 DirectComposition 是否取代了 GDI+?

我有一个项目可能涉及一些基本的服务器端图像创建(缩放、转换、一些文本堆肥)。过去我曾使用 GDI+ 来做类似的事情,但微软现在将其标记为 Legacy Graphics并列出了一些替代品,例如DirectCompositionWindows Imaging Component

我有点不清楚区别,那么哪些(如果有)是 GDI+ 的最佳替代品?

0 投票
3 回答
1807 浏览

wpf - 如何在 WPF 窗口中使用 WinRT SwapChainPanel 控件?

我在 WPF 项目中添加了对 WinRT dll 的引用,我想SwapChainPanel在 WPF 窗口中使用。真的有可能吗?现在我无法让它工作。

0 投票
0 回答
83 浏览

c++ - 从 IDCompositionVisual 取回内容

我有一个 IDCompositionVisual 指针,我想知道与之关联的内容,也许将其保存为位图。它有 SetContent 方法,但我想不出一种方法来获取它的内容。

0 投票
0 回答
128 浏览

bitmap - 您可以对对象使用直接合成吗?

我发现本教程windows 分层,我想知道这是否可以使用 3d 对象,如本。我只想在透明背景上看到一个对象。谢谢你。

0 投票
1 回答
102 浏览

c++ - 如何使用 IDirectManipulationViewport::SetViewportRect?

这是来自 Windows 8 经典示例的稍微修改的 Direct Manipulation Sample 应用程序。我删除了除单个视口及其内容(方格纹理)之外的所有元素。当我设置 IDirectManipulationVewport::SetViewportRect() 偏移到原点(例如 SetViewportRect(100, 100, client_rect.right, client_rect.bottom) 我希望内容在 100, 100 处对齐。但是内容总是在窗口(父 IDirectCompositionVisual)原点。

在此处输入图像描述

我也尝试了 IDirectManipulationViewport::SetViewportTransform() 与翻译矩阵,但结果是一样的。

将视口定位在视觉而不是原点的正确方法是什么?可能吗?或者我应该用视口创建另一个子 IDirectCompositionVisual,用 SetOffsetX/Y 定位它并向它添加内容?

这是文档的链接

Rita Han 回答后的 UPD:如果您仅对示例进行以下修改:

如果缩小,您将看到以下内容: 在此处输入图像描述 红色 - 实际不正确的视口矩形(_viewportOuterRect.left 和顶部坐标被忽略,但大小已更改)。

绿色 - 预期的视口矩形。

蓝色 - 预期的内容对齐位置。

0 投票
1 回答
121 浏览

windows - 如何使用 DirectComposition 或 Windows.UI.Composition 平铺位图

如何使用合成器 API 创建平铺图像背景?

D2D 位图画笔有SetExtendModeX/Y,但CompositionSurfaceBrush似乎没有等价物。

TileEffect标记为“NoComposition”。

我想避免创建屏幕大小的表面和“手动”平铺(即使用 D2D)。

0 投票
1 回答
399 浏览

resize - Window 的合成引擎 (DWM) 中的背景颜色伪影

来自Kenny Kerr 博客的上下文:

Windows Vista 引入了一项称为桌面窗口管理器的服务。这个名字过去和现在都具有误导性。将其视为 Windows 合成引擎或合成器。这个合成引擎完全改变了应用程序窗口在桌面上的呈现方式。不是让每个窗口直接渲染到显示器或显示适配器,而是每个窗口都渲染到屏幕外表面或缓冲区。系统为每个顶级窗口分配一个这样的表面,并且所有 GDI、Direct3D 以及,当然还有 Direct2D 图形都被渲染到这些表面。这些屏幕外表面称为重定向表面,因为 GDI 绘图命令甚至 Direct3D 交换链表示请求都被重定向或复制(在 GPU 内)到重定向表面。

在某些时候,独立于任何给定的窗口,合成引擎会根据最新的一批更改决定是时候合成桌面了。这包括将所有这些重定向表面组合在一起,添加非客户区域(通常称为窗口镶边),可能添加一些阴影和其他效果,并将最终结果呈现给显示适配器。


上一个 SO 问题的背景(见图片) :

在 DirectX 中调整大小时,在右/下边缘会出现 win32 背景的伪影。这可以通过应用WS_EX_NOREDIRECTIONBITMAP样式来纠正。由于交换链比窗口小还是大都没有关系,如果没有WS_EX_NOREDIRECTIONBITMAP合成引擎,似乎将一个太小的矩形复制到重定向表面(因为窗口大小滞后于鼠标位置/“拖动矩形”)。


实际问题

但是,WS_EX_NOREDIRECTIONBITMAP仅适用于顶级窗口,我正在尝试将 DirectX 作为子窗口嵌入到 WPF 中,并且来自子窗口背景的工件仍在通过。这让我想到了一些相关的问题:

  1. (可选)当交换链小于窗口大小时,窗口的其余部分被填充为黑色(见图)。这是从交换链复制到重定向表面的结果,其中目标步幅的剩余部分(在源宽度之后)被清零?
  2. (可选)win32后台的神器是怎么出现的?在从交换链复制之前,重定向表面是否填充了这种颜色?
  3. (可选)是否每次调整窗口大小时都会调整重定向表面的大小?
  4. (必需)每个子窗口是否都有一个重定向表面,该重定向表面又被复制到顶级窗口的重定向表面。如果没有,孩子的win32后台神器是怎么出现的?
  5. (必填)这是否意味着嵌入到WPF中的win32窗口的帧率仅限于WPF的可变帧率?(将 DirectX 窗口嵌入 WPF 的目的是获得恒定的 60fps 帧速率)
0 投票
2 回答
311 浏览

c++ - 直接合成,IDCompositionGaussianBlurEffect 抛出访问冲突异常

我正在研究一个基于这篇文章使用直接合成的项目:

Windows with C++ : 使用 Windows 组合引擎的高性能窗口分层

我能够重新创建示例并且它正在工作。目前我正在尝试将 IDCompositionGaussianBlurEffect 应用于我的视觉(variable: visual),但编译器引发访问冲突异常。有什么方法可以使用直接合成将模糊效果应用于我的视觉效果。

例外:

在这一行抛出异常:

这是完整的代码:

我尝试更改每段代码,但仍然引发异常。我是 Directx 的新手, IDCompositionDevice3代码中的设备实际上是我自己创建的,我不知道这是对还是错,因为 Microsoft 提供的文档中没有太多描述。

这是完整的项目代码:直接合成模糊

0 投票
1 回答
229 浏览

c++ - 在 C++ 中使用 Windows 组合引擎的透明窗口

首先,我想说我是使用direct2d 的新手。

我的最终目的是拥有每个像素的透明窗口。我发现了这篇不错的文章:

https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/june/windows-with-c-high-performance-window-layering-using-the-windows-composition-engine

似乎它回答了我的问题。在编写每像素透明窗口之前,我只是尝试测试该链接中的代码。但是当我运行程序时,窗口中应该显示的磁盘根本没有显示出来。

这是我编写的完整代码,仅使用 C++ win api,没有作者 Kenny Kerr 添加的 COM 内容。它的功能很少,主要是:

  • d2d_init() :它设置 Direct2D
  • render() : 显示场景
  • main() :它创建并显示窗口,调用 d2d_init()
  • 在 WM_PAINT 中调用 render() 的窗口过程

现在,我被封锁了。上周我在互联网上搜索了很多,但我没有看到任何可以帮助我的代码。

有人看到我的错误在哪里吗?

谢谢你