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

8
我有一个WPF应用程序,旨在叠加一个HUD到实时流中。最初的想法是创建一个xsplit插件(一个用于呈现实时流的流行应用程序)来显示WPF应用程序的内容。这种方法的问题在于将位图渲染到xsplit的COM接口会严重损害CPU性能,因此无法发布该应用程序(因为我认为xsplit的COM接口存在问题,使用RenderTargetBitmap也会对CPU造成负担)。
我一直在考虑直接将叠加层渲染到游戏中(目标DirectX应用程序),因为这样做提供了许多好处。主要是绕过xsplit中的性能问题,同时也使该应用程序适用于各种流媒体和捕获应用程序。
我不是很熟悉DirectX,但我认为这是解决方案的大纲:
  1. 初始化WPF应用程序并捕获WPF的Direct3d设备(通过此方法)

  2. 找到并钩住目标DirectX应用程序的EndScene调用(使用EasyHook+Slimdx)

  3. 在钩住的DirectX应用程序上方渲染WPF设备表面的内容


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

你是怎么做到的呢?我也遇到了类似的情况,卡住了。 - alDiablo
1个回答

1

我也在尝试做同样的事情。目前我发现可以将你的WPF可视树渲染成位图,然后将该位图写入到第2点捕获的D3D设备中。

void render(Direct3D.Device device)
{

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

}

我还没有测试过这个,但我认为我在正确的轨道上。我现在唯一的问题是我的窗口失去了所有的交互性。按钮点击等操作将不再被捕获...

如果有任何帮助,将不胜感激。


你在做的事情上有任何成功了吗? - alDiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接