从WPF的内部渲染到Directx应用程序

时间:2012-04-29 21:13:04

标签: wpf directx overlay code-injection slimdx

我有一个WPF应用程序,用于在实时流中覆盖HUD。最初的想法是为xsplit(一种用于呈现实时流的流行应用程序)创建一个插件,以显示WPF应用程序的内容。这种方法的问题在于,向xsplit的COM接口渲染位图远远会损害CPU性能以释放应用程序(我相信在xsplit的COM接口中存在问题以及使用RenderTargetBitmap对CPU征税)。 p>

我一直在寻找将叠加层直接渲染到游戏中(目标DirectX应用程序),因为它提供了许多好处。它主要解决了xsplit中的性能问题,但也可以将应用程序打开到各种流媒体和捕获应用程序。


我对DirectX不是很有经验,但我认为这是解决方案的概要

  1. 初始化WPF应用程序并捕获WPF的Direct3d设备(via this method)

  2. 查找并挂钩目标DirectX应用程序的EndScene调用(using EasyHook+Slimdx)

  3. 在挂钩的DirectX应用程序的顶部渲染WPF设备表面的内容


  4. 我的主要问题是如何使用SlimDX完成第3步。我希望解决方案可以某种方式重用表面而不依赖于复制,因为目标是不影响钩子应用程序的性能。我也希望能够限制区域并支持透明度。我也想知道在钩住的DirectX应用程序的设备中使用WPF的Direct3d设备是否会导致任何不稳定。

    任何见解都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

我正在努力做同样的事情。到目前为止我发现你可以将你的wpfvisualtree渲染成位图,然后将位图写入第2点捕获的d3d设备。

void render(Direct3D.Device device)
{

wpfRenderTargetBitmap.Render(WpfVisualTree);
wpfRenderTargetBitmap.CopyPixels(devicePtr);

}

我还没有测试过,但我认为我已经走上正轨了。我现在唯一的问题是我从窗口中放松了所有的交互性。按钮点击等将不再被捕获......

任何帮助都会很好。