WPF 3D是否是复杂应用程序的DirectX和OpenGL良好替代品?

53

我曾经利用WPF的三维功能进行学习和实现过一些项目,我发现它非常强大。目前我也在学习DirectX 11,相比于使用WPF的3D类来说,使用DirectX 11非常棘手。虽然我只是用WPF 3D来完成一些基础工作,但我的问题是:

对于像三维建模工具、游戏引擎和三维模拟等高级应用,WPF 3D是否足够好以成为DirectX和OpenGL的替代品?

如果有其他同类产品,请也一并提及。

5个回答

64

好问题。答案是取决于!!

更有用的是,我可以说:几年前,我开发了一个基于OpenGL的CAD风格3D渲染应用程序。这必须显示高达1,000,000个对象的油井CAD模型,并允许用户缩放到细节,或者缩小、移动对象等... 我可以肯定地说,WPF不适合这种类型的应用程序,因为它会太慢。这个应用程序是使用C++/CLI开发的,并从.NET GUI(工具栏、窗口)桥接到C++到OpenGL(渲染表面),即使这样也会由于thunking而导致性能下降,而原生的C++/OpenGL应用程序则无此问题。所以,如果你想要最高的性能,你不能打败使用DirectX或OpenGL的本机C++。

WPF可以为简单的三维应用程序提供高性能的三维图形和流畅的交互,例如三维图表表面或三维旋转木马,甚至是三维CAD模型查看器,只要模型相对简单。一旦对象数量开始增加,您会注意到渲染引擎无法处理它 - 这就是您需要切换到允许直接访问GPU的渲染引擎的时候。

对于半路上的解决方案(托管+DirectX),请尝试SharpDX。这基本上是Managed DirectX的开源实现,非常强大和多功能。管理与本机C ++相比的性能损失很小(约5%),并且当正确完成时,Managed DirectX可以非常高效。

我们所做的一件事情是通过D3DImage直接将DirectX与WPF集成。我们在WPF 3D图表控件中实现了这一点,该控件使用DirectX11进行绘制(而不是WPF3D)。这直接从本机DirectX共享到WPF,但您可以使用SharpDX获得同样好的结果,在这里我们已经用它创建了一个高速WPF绘图插件
如果您想展示WPF3D,我建议您尝试此链接。正如您所注意到的,WPF3D可以制作极具视觉吸引力且有时复杂的示例,但您不会在其中找到任何100万个对象的油井;)

最后,你在WPF 3D中想做什么?只是出于兴趣还是你有一个具体的项目要实现,并想知道它是否合适?


3
没问题。我建议你查看这个链接http://helixtoolkit.codeplex.com/,因为它展示了WPF 3D功能的很好的示例。最好的问候 - Dr. Andrew Burnett-Thompson
1
@Dr.ABT SlimDx最后一次发布是在2012年3月,因此我不确定它是否支持.net 4.5。有什么替代方案吗?我正在使用vb.net和WPF,并且感觉需要更强大的3D工具。 - CTZStef
1
我们使用SharpDX(类似于SlimDX)获得了良好的结果。顺便说一下,.NET4.0程序集可以在.NET4.5环境中正常加载。 - Dr. Andrew Burnett-Thompson
@Dr.ABT,SharpDX在2016年仍然是一个可行的选择吗?我的项目有一个3D地球仪,用于实时显示轨迹(比如飞机)。它是建立在OpenGL 1.2上的古老产品。对于有限的轨迹数量,它运行良好,但随着轨迹数量的增加,它变得困难。我们是一个基于.NET的产品,所以我想从OpenGL转移到DirectX。希望能找到一个好的基于.NET的图形库,而SharpDX似乎符合要求。这是一个向前迈进的好选择吗?谢谢您的时间。 - Matt Davis
我有一些用C++编写的D3D应用程序源代码。我能将其渲染到WPF应用程序中吗? - jungle_mole
显示剩余7条评论

10

有两种3D图形模型: 1. 流水线或无限循环方法(用于3D游戏,3D CAD系统中的高难度具有10万个及以上物体-网格的系统) 2. 智能抽象模型WPF3D,具有经典的OOP支持,没有任何OnDraw,OnPaint 方法。正确使用WPF的Media3D方法非常重要,所以最重要的是没有任何OnDraw,OnPaint

您必须分析应用程序类型和功能并进行选择。

关于WPF 3D并不适用于大多数简单应用程序,这并不是一个很正确的观点,但适用于完全托管的OOP对象。例如,请查看我网站上的屏幕截图 TIMO Structural CAE

这是完全托管的3D WPF应用程序。


6
如果您真的想做一些复杂的事情,实际上最好使用一个已经建立的图形引擎(通常是为游戏开发的),而不是直接使用DirectX或OpenGL。WPF 3D引擎提供了类似的抽象层级,但它具有大大较小的功能集(如果您想要阴影、反射、折射、凹凸贴图、骨骼动画等,仍然需要努力工作)。
话虽如此,我成功地使用它来可视化内部3D模拟工具,并且它对我的需求完全足够。即使在拥挤的场景下,它的性能表现也相当不错,基本的照明支持足以清晰地可视化几何体。而且,让它工作起来也相当容易,这对我来说是一个很大的优点(没有太多时间用于开发可视化)。

4
如果您说到WPF的3D,指的是它显示硬件加速的3D图形的能力,那么我会说是的。然而,如果您指的是WPF的3D框架,则我倾向于说不是。
我并没有使用过太多WPF 3D框架,但从我使用过的内容来看,我发现它牵涉到许多硬编码点。话虽如此,也许有办法解决这个问题,但我通常认为该框架从未考虑过高级3D图形(例如建模工具和游戏引擎)。
然而,我发现它擅长于显示3D渲染内容,并将渲染内容与其UI组合系统平稳地集成。我已经广泛使用WPF以这种方式作为应用程序主机来呈现和操作3D内容 - 具体来说,是在3D建模环境中。
对于这种情况,您可以使用嵌入在WPF应用程序中的D3DImage控件,允许将DirectX内容直接呈现在您的应用程序上。您可以使用DirectX本身或类似SlimDX之类的托管包装器向此表面进行渲染。我发现后者非常好,因为它支持DirectX版本9、10和11,并且是一个相当轻量级的包装器,因此几乎可以以相同的方式使用大量的DirectX API。
总体而言,我认为这完全取决于您对3D系统的要求。

3
当然,答案取决于具体情况。我敢说WPF 3D非常适合学习、简单需求和将3D集成到原本是2D应用程序中。
由于您正在考虑使用WPF,我假设您正在使用C#编写可在Windows上安装的应用程序。除了其他人推荐的内容外,我建议您看看XNA,它不是WPF的一部分,但Silverlight 5中提供了其中的子集(如果您想坚持使用XAML)。
我曾经使用C语言的OpenGL、C++的DirectX和Managed DirectX(已过时)以及WPF 3D进行编程。WPF 3D提供了非常高级的抽象层、许多方便的功能,并且适用于某些应用程序。我曾经在一个结合了2D和3D图形的应用程序中使用过它,并且对这个应用程序效果很好。在这种情况下,我需要任意剪裁平面,但这个特性并不可用,手动剪裁比使用另一个API更容易,后者虽然提供了此特性,但缺少许多高级便利功能。

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