WPF中的硬件加速3D线

时间:2016-03-24 16:13:45

标签: wpf 3d directx direct3d hardware-acceleration

我需要为工业WPF应用程序每秒绘制数千条3D线,但WPF似乎没有原生的HW加速线功能。

通过“3D”我的意思是它们可以在3个轴上旋转,以透视等方式显示。“线条”我的意思就是 - 这些不是3D对象的线框所以我做想要3D表面的细分,我想要这些点亮或阴影。

之前已经在StackOverflow上询问过这个问题的变化。人们建议:

  • XNA,但不推荐使用XNA
  • Helix3D但其线条有奇怪的,不可接受的渲染工件
  • OpenGL(例如,OpenTK或SharpGL),但我在OpenGL论坛上与人们进行了很多讨论,所有与WPF的OpenGL接口似乎都存在与其他WPF功能接口的主要问题,并且需要黑客来解决。

我认为我最好的选择是使用DirectX或Direct3D。但我不知道如何将它们与WPF集成。此外,Direct3D也没有原生线原语(它使用纹理三角形),请参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/bb323719%28v=vs.85%29.aspx

如果有必要,我愿意做2D硬件加速线并进行自己的3D-2D映射。

但最重要的是,这必须与WPF顺利集成,以便我可以使用透明的WPF Canvas覆盖图形,我可以在其上绘制标记,文本,ROI等。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

Direct3D可以在有或没有光照的情况下原生绘制单像素线,有或没有纹理映射位图。 Direct3D不能天真地画出什么样的线条' Direct2D可以通过发射纹理三角形或使用软件光栅化来绘制样式线。

  

绘制'样式线的deprecated D3DX9功能' legacy Managed DirectX 1.1 Microsoft.DirectX.Direct3D.Line类使用纹理三角形,这就是MSND提到的那个。 Direct2D更先进,并具有硬件加速路径。

WPF为Direct3D提供了D3DImage类互操作,但它仅支持Direct3D9 / Direct3D9Ex。您可以使用DXGI共享表面技巧使其与DirectX 11一起使用。请参阅this article,它告诉您如何使用Direct3D 10. Direct3D 11是相同的。

GitHub上的WPFDXInterop项目应该有用,因为它实现了D3D11Image类。

对于DirectX的C#interop,最好的选择是使用SharpDXSlimDX