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

我已经使用WPF的3Dfunction进行学习,并且在一些实现中,我发现它的function非常强大,而且我也学习了DirectX 11,与在WPF中使用3D类相比,它非常棘手。 我只使用WPF 3D非常基本的东西,我的问题是:

WPF 3D同样适用于3Dbuild模工具,游戏引擎和3D模拟等高级应用程序,是否可以替代DirectX和OpenGL?

如果同一联盟还有其他事情,请提一下。

好问题。 答案是这取决于

在一个更有用的说明中,我可以这样说:几年前,我在OpenGL中开发了一个CAD风格的3D渲染应用程序。 这必须显示具有高达1,000,000个对象的石油钻机CAD模型,并允许用户放大到细节,或缩小,移动对象等…我可以肯定地说,WPF将不适合这个应用程序的types,因为它会太慢。 这个应用程序是使用C ++ / CLI开发的,并且从.NET GUI(工具栏,窗口)到C ++桥接到OpenGL(渲染曲面),甚至由于thunking而导致了本机C ++ / OpenGL应用程序的性能。 所以,如果你想获得最高的性能, 你不能用DirectX或者OpenGL打败原生的C ++。

WPF可以为更简单的3D应用程序提供高性能的3Dgraphics和stream畅的交互性。 例如,3D模型表面或3D轮播,甚至3D CAD模型查看器,只要模型相当简单。 一旦对象数量开始增加,您将注意到渲染引擎无法处理它 – 这是当您需要切换到允许直接访问GPU的渲染引擎。

对于中途之家解决scheme(pipe理+ DirectX),请尝试SharpDX 。 这基本上是托pipeDirectX的开源实现,function非常强大,function也很多。 托pipe与本机C ++的性能差异很小(〜5%),如果做得好,托pipe的DirectX可以非常高效。

我们所做的是通过D3DImage将DirectX直接与WPF集成。 我们已经在WPF 3D图表控件中实现了这一点,该控件使用DirectX11作为绘图(而不是WPF3D)。 这直接从本机DirectX共享WPF,但你可以用SharpDX ,我们已经用来创build一个高速WPFgraphics插件这里得到同样好的结果。

为了展示WPF3D,我build议你试试这个链接 。 正如你所注意到的,WPF3D可以使视觉效果非常吸引人,有时甚至是复杂的例子,但是你不会在那里find任何100万个对象的石油钻井平台;)

最后,你想在WPF 3D中做什么? 只是一个兴趣点,或者你有一个具体的项目来执行,并想知道它是否合适?

最好的祝福,

有两种3Dgraphics模型:1.pipe道或无限循环方法(3D游戏, 具有100.000和更多对象的 硬件 3D CAD系统– 网格 )2.智能抽象模型WPF3D与OOP的经典支持, 没有任何OnDraw,OnPaint方法。 正确使用WPF的Media3D方法是非常重要的。 所以最重要的是没有任何OnDraw,OnPaint

您必须分析您的应用程序types和function并select。

对于WPF 3D而言,对于最简单的应用程序来说并不是那么正确,但是对于完全托pipe的OOP对象来说。 例如,看看我的网站上的截图TIMO Structural CAE

它是完全托pipe的3D WPF应用程序。

如果你真的想做一些复杂的事情,你最好使用一个已经build立的graphics引擎(通常是为游戏而开发),而不是直接使用DirectX或者OpenGL。 WPF 3D引擎提供了类似的抽象级别,尽pipe它具有极小的特征集(如果需要阴影,reflection,折射,凹凸贴图,骨骼animation等,您仍然必须努力工作)

也就是说,我已经成功地将它用于内部3D仿真工具的可视化,而且这对我的需求来说已经足够了。 即使拥挤的场景,它的performance也相当好,基本的照明支持足以清晰地显示几何graphics。 工作也很容易,这在我的书中是一个很大的优势(没有太多时间投资开发可视化)。

如果通过WPF的3D你的意思是能够显示硬件加速的3Dgraphics,那么我会说是的。 但是,如果你的意思是WPF的3D框架, 那么我会试着说不。

我没有使用大量的WPF 3D框架,但从我用过的,我发现它涉及到大量的硬编码点。 也就是说,这可能是有方法的,但是我一般不认为这个框架是有史以来build立起来的(比如build模工具和游戏引擎)。

但是,我发现它擅长的是显示3D渲染内容,并将渲染内容与其UI构图系统平滑地整合在一起。 我以这种方式广泛使用了WPF,作为渲染和操作3D内容的应用程序主机 – 特别是在3Dbuild模上下文中。

对于这种情况,您可以使用embedded在WPF应用程序中的D3DImage控件来允许直接在您的应用程序上呈现DirectX内容。 您可以使用DirectX本身渲染到该表面,也可以使用SlimDX之类的托pipe包装。 后者我发现它是非常好的,因为它支持DirectX版本9,10和11,它是一个相当薄的包装,所以很多DirectX API可用于几乎相同的方式。

总的来说,我认为完全取决于您对3D系统的使用要求。

答案当然要看情况。 我会大胆地说,WPF 3D是伟大的学习,简单的需求,并将3D集成到另外的2D应用程序。

既然你正在考虑WPF,我假定你正在使用C#编写在Windows上安装的东西。 除了别人推荐的之外, 我build议你看一下XNA ,它不是WPF的一部分,但是其中的一个子集可以在Silverlight 5中使用(如果你想坚持使用XAML)。

我在OpenGL中编写了C,C ++中的DirectX和Managed DirectX(obsolte)以及WPF 3D。 WPF 3D提供了非常高的抽象级别,提供了许多方便的function,并且适用于某些应用程序。 我曾经在一个结合了2D和3Dgraphics的应用程序中使用过它,它在这个应用程序中运行良好。 在这种情况下,我需要任意的裁剪平面,这是一个不可用的function,手动裁剪比使用提供此function的其他API更容易,但缺less很多高级的便利。