web-dev-qa-db-ja.com

WPF 3Dは、複雑なアプリケーション向けにDirectXとOpenGLの代替として適していますか?

私はWPFの3D機能を学習に使用し、いくつかの実装に使用しました。非常に有能であることがわかりました。また、DirectX 11を学習しています。私は非常に基本的なことだけにWPF 3Dを使用しました。私の質問は次のとおりです。

WPF 3Dは、3Dモデリングツール、ゲームエンジン、3Dシミュレーションなどの高度なアプリケーションにDirectXやOpenGLの代替品として同等に適していますか?

同じリーグに何か他のものがある場合は、それも言及してください。

48
SpeedBirdNine

良い質問。答えは、それは依存します!!

もっと便利なことに、私はこう言うことができます。数年前、私はOpenGLでCADスタイルの3Dレンダリングアプリケーションを開発しました。これは、CAD最大1,000,000個のオブジェクトを持つ石油掘削装置のモデルを表示し、ユーザーが詳細にズームインしたり、オブジェクトを移動したりズームアウトしたりできるようにする必要がありました。このアプリケーションはC++/CLIを使用して開発され、.NET GUI(ツールバー、ウィンドウ)からC++にOpenGL(レンダリングサーフェス)にブリッジされ、さらにはWPFはこのタイプのアプリケーションには適していません。 thunking により、ネイティブC++/OpenGLアプリケーションにパフォーマンスヒットが発生しました。したがって、最高のパフォーマンスが必要な場合は、DirectXまたはOpenGLでネイティブC++に勝つことはできません。

WPFは、高性能な3Dグラフィックスと、よりシンプルな3Dアプリケーション向けのスムーズなインタラクティブ機能を提供できます。たとえば、3Dチャートサーフェスまたは3Dカルーセル、3D CADモデルビューアーでも、モデルがかなり単純である限り。オブジェクトカウントが増加し始めると、レンダリングエンジンに気付くでしょう。それを処理できません-それは、GPUへの直接アクセスを許可するレンダリングエンジンに切り替える必要がある場合です。

ハーフウェイハウスソリューション(管理+ DirectX)の場合は、 SharpDX を試してください。これは基本的にManaged DirectXのオープンソース実装であり、非常に強力で多用途です。マネージドとネイティブC++のパフォーマンスへの影響はわずか(約5%)であり、適切に実行すると、マネージドDirectXのパフォーマンスが非常に向上します。

D3DImage を使用して、DirectXをWPFに直接統合しました。これは、描画にDirectX11を使用する(WPF3Dではなく) WPF 3D Chart Control で実現しました。これは、ネイティブDirectXからWPFに直接共有されますが、高速の作成に使用した SharpDX を使用して同等の良好な結果を得ることができます WPF Drawing Plugin .

WPF3Dのショーケースについては、 このリンク を試すことをお勧めします。ご存知のように、WPF3Dは非常に視覚的に魅力的で、時には複雑な例を作成できますが、1,000,000個のオブジェクトオイルリグはそこにありません;)

最後に、WPF 3Dでやりたいことは何ですか?関心のある点、または実装する特定のプロジェクトがあり、それが適切かどうかを知りたいですか?

宜しくお願いします、

55
Dr. ABT

3Dグラフィックスには2つのモデルがあります。1.パイプラインまたは無限ループアプローチ(3Dゲーム、ハードレベル100.000以上のオブジェクトを含む3D CADシステム-メッシュ)2. OOPOnDraw、OnPaintメソッドなしの古典的なサポートを備えたスマート抽象モデルWPF3D。 WPFのMedia3Dメソッドを正しい方法で使用するため、最も重要なことは、OnDrawなし、OnPaintです。

アプリケーションのタイプと機能を分析して選択する必要があります。

ほとんどの単純なアプリケーションのようにWPF 3Dについて正しい意見ではありませんが、完全に管理されたOOPオブジェクト。たとえば、私のサイトのスクリーンショットを見てください TIMO Structural CAE

完全に管理された3D WPFアプリです。

9
Sergey Orlov

本当に複雑なことをしたい場合は、DirectXまたはOpenGLを直接使用するのではなく、確立されたグラフィックエンジン(通常はゲーム用に開発された)を使用することをお勧めします。 WPF 3Dエンジンは、同様のレベルの抽象化を提供しますが、機能セットは大幅に小さくなります(シャドウ、反射、屈折、バンプマップ、骨格アニメーションなどが必要な場合は、かなり一生懸命作業する必要があります)

そうは言っても、社内の3Dシミュレーションツールの視覚化にはこれをうまく使用しており、私のニーズには十分すぎるほどです。混み合ったシーンでも十分に機能し、ジオメトリを明確に視覚化するには基本的な照明サポートで十分です。仕事をするのも非常に簡単でしたが、これは私の本では大きなプラスです(視覚化の開発に投資する時間はあまりありませんでした)。

6
Dan Bryant

WPFの3Dによって、ハードウェアアクセラレーションの3Dグラフィックスを表示できることを意味する場合は、「はい」と言います。ただし、WPFの3Dフレームワークを意味する場合、それから私はノーと言いたくなるでしょう。

私は多くのWPF 3Dフレームワークを使用していませんが、使用したことから、多くのハードコードされたポイントが関係していることがわかりました。そうは言っても、おそらくそれを回避する方法はありますが、フレームワークが高度な3Dグラフィックス(モデリングツールやゲームエンジンなど)を念頭に置いて構築されたことは一般的にないと思います。

しかし、私が得意とするのは、3Dレンダリングされたコンテンツを表示し、レンダリングされたコンテンツをUIコンポジションシステムとスムーズに統合することです。このように、特に3Dモデリングコンテキストの観点から、3Dコンテンツをレンダリングおよび操作するためのアプリケーションホストとしてWPFを広範囲に使用しました。

そのような状況では、 D3DImage WPFアプリケーションに埋め込まれたコントロールにより、DirectXコンテンツをアプリケーションに直接レンダリングできます。 DirectX自体、または SlimDX などのマネージラッパーを使用して、このサーフェスにレンダリングできます。後者はDirectXバージョン9、10、および11をサポートし、非常に薄いラッパーなので、DirectX APIの多くがほぼ同じ方法で使用できるため、非常に優れていることがわかりました。

全体として、3Dシステムの必要な使用法に完全に依存すると言います。

4
Samuel Slade

答えはもちろんですが、それは異なります。私は大胆に、WPF 3Dは学習、シンプルなニーズ、および3Dを2Dアプリケーションに統合するのに最適であると言います。

WPFを検討しているので、C#を使用してWindowsにインストールするものを作成することを検討していると仮定します。他の人が推奨するものに加えて、XNAを参照することをお勧めします、これはWPFの一部ではありませんが、Silverlight 5で使用できるサブセットです(XAMLに固執したい場合)。

OpenGLでC、DirectXをC++、Managed DirectX(廃止)およびWPF 3Dでプログラミングしました。 WPF 3Dは、非常に高度な抽象化を提供し、多くの便利な機能を提供し、一部のアプリケーションに適しています。過去に2Dと3Dのグラフィックスを組み合わせたアプリケーションで使用しましたが、このアプリケーションでうまく機能しました。この場合、任意のクリッピングプレーンが必要でしたが、これは利用できない機能であり、この機能を提供するが高度な利便性の多くを持たない別のAPIを使用するよりも手動でクリッピングを行う方が簡単でした。

3
Peter Tate