如何将WPF窗口渲染到DirectX缓冲区中?

时间:2019-08-26 05:54:46

标签: c# wpf 3d directx rendering

我想将WPF窗口渲染到我自己的缓冲区中,并将其添加到渲染循环中,渲染到我自己的场景中,进行操作等。

是否有内置的方法来捕获WPF窗口的底层DirectX缓冲区/交换链?

1 个答案:

答案 0 :(得分:3)

可能,但并不容易。

耶利米·莫里尔(Jeremiah Morrill)在尝试实现这一目标时发现了两篇很棒的文章。

A Critical Deep Dive into the WPF Rendering System

How to get access to WPF’s internal Direct3D guts

耶利米使用用C ++编写的Dynamic Link Library (DLL)钩住DirectX函数,并导出其中用C#调用的initialise函数。

这仍然不会阻止您使用Easyhook并以C#而非耶利米斯的方式进行操作。

当我自己这样做时,这就是我的流程:

  1. 挂钩DirectX 9/10/11(当前存在EndScene)。
  2. .NET域中的回调 和使用PInvoke
  3. 封送缓冲区数据
  4. 操纵缓冲区返回 操纵缓冲区返回C ++库
  5. 将最终图像缓冲区显示到 屏幕,即WPF ...

我的经验:在速度上有一个折衷,但是我相信优化可能是可行的解决方案。

另一种解决方案 您可以通过钩子D3D11CreateDeviceAndSwapChain来钩住d3d11.dll由于WPF在引擎盖下使用DirectX 9,因此无法使用。

更新:

在周末反转WPF之后,我发现未托管的wpfgfx.dll包含milcore,这是迄今为止DirectX 9的包装。您可以在下图的WPF体系结构中看到这一点。

WPF Architecture

在模块wpfgfx.dll中,它包含MILCore DirectX包装器。有关WPF Architecture

的更多信息
相关问题