web-dev-qa-db-fra.com

WPF 3D est-il une bonne alternative à DirectX et OpenGL pour les applications complexes?

J'ai utilisé les capacités 3D de WPF pour l'apprentissage et pour quelques implémentations, et je l'ai trouvé très capable, et j'apprends également DirectX 11, et c'est très difficile par rapport à l'utilisation de classes 3D dans WPF. Je n'ai utilisé WPF 3D que pour des choses très basiques, ma question est:

WPF 3D est-il également bon pour les applications avancées telles que les outils de modélisation 3D, les moteurs de jeu et les simulations 3D, etc. pour être une alternative à DirectX et OpenGL?

S'il y a autre chose dans la même ligue, merci de le mentionner également.

48
SpeedBirdNine

Bonne question. La réponse est cela dépend !!

Sur une note plus utile, je peux dire ceci: Il y a quelques années, j'ai développé une application de rendu 3D de style CAO dans OpenGL. Cela devait afficher CAD modèles de plates-formes pétrolières avec jusqu'à 1 000 000 d'objets et permettre à l'utilisateur de zoomer droit dans les détails, ou de faire un zoom arrière, de déplacer des objets, etc. Je peux dire avec certitude que WPF ne conviendrait pas à ce type d'application car il serait tout simplement trop lent. Cette application a été développée en utilisant C++/CLI et pontée à partir d'une interface graphique .NET (barre d'outils, fenêtre) vers C++ vers OpenGL (surface de rendu) et même qui a introduit un impact sur les performances d'une application C++/OpenGL native en raison de thunking . Donc, si vous voulez les performances les plus élevées, vous ne pouvez pas battre C++ natif avec DirectX ou OpenGL. =

WPF peut fournir des graphiques 3D hautes performances et une interactivité fluide pour des applications 3D plus simples. Par exemple, une surface de graphique 3D ou un carrousel 3D, même un visualiseur de modèle 3D CAD tant que le modèle est assez simple. Une fois que le nombre d'objets commence à augmenter, vous remarquerez le moteur de rendu ne peut pas le gérer - c'est là que vous devez basculer vers un moteur de rendu qui permet un accès direct au GPU.

Pour une solution de maison de transition (gérée + DirectX), essayez SharpDX . Il s'agit essentiellement d'une implémentation open source de Managed DirectX et elle est extrêmement puissante et polyvalente. Le niveau de performance du C++ managé par rapport au C++ natif est mineur (~ 5%) et lorsqu'il est bien fait, le DirectX géré peut être extrêmement performant.

Quelque chose que nous avons fait est d'intégrer DirectX directement avec WPF via D3DImage . Nous y sommes parvenus dans un WPF 3D Chart Control qui utilise DirectX11 pour le dessin (pas WPF3D). Cela partage directement de DirectX natif vers WPF mais vous pouvez obtenir des résultats tout aussi bons avec SharpDX , que nous avons utilisé pour créer une vitesse élevée WPF Drawing Plugin ici.

Pour une vitrine de WPF3D, je vous suggère d'essayer ce lien . Comme vous le remarquez, WPF3D peut rendre des exemples extrêmement attrayants visuellement et parfois complexes, mais vous n'y trouverez pas de 1 000 000 plates-formes pétrolières;)

Enfin, qu'est-ce que tu voulais faire dans WPF 3D? Juste un point d'intérêt ou avez-vous un projet spécifique à mettre en œuvre et souhaitez-vous savoir s'il conviendrait?

Meilleures salutations,

55
Dr. ABT

Il existe deux modèles de graphiques 3D: 1. Approche par pipeline ou boucle infinie (Jeux 3D, Niveau difficile Systèmes 3D Cad avec 100 000 objets et plus - mailles ) 2. Modèle abstrait intelligent WPF3D avec prise en charge classique de OOP sans OnDraw , Méthodes OnPaint . Il est très important d'utiliser correctement les méthodes Media3D de WPF. La chose la plus importante est donc sans OnDraw, OnPaint .

Vous devez analyser le type et les fonctionnalités de votre application et choisir.

Ce n'est pas une opinion aussi correcte sur WPF 3D que pour la plupart des applications simples, mais pour les objets OOP) entièrement gérés. Par exemple, jetez un œil aux captures d'écran sur mon site TIMO Structural CAE

Il s'agit d'une application WPF 3D entièrement gérée.

9
Sergey Orlov

Si vous voulez vraiment faire quelque chose de complexe, il vaut mieux utiliser un moteur graphique établi (généralement développé pour les jeux), plutôt que d'utiliser DirectX ou OpenGL directement. Le moteur WPF 3D fournit un niveau d'abstraction similaire, bien qu'il ait un ensemble de fonctionnalités considérablement plus petit (vous devrez toujours travailler assez dur si vous voulez des ombres, des réflexions, de la réfraction, des cartes de relief, une animation squelettique, etc.)

Cela dit, je l'ai utilisé avec succès pour la visualisation d'un outil de simulation 3D en interne et il est plus que suffisant pour mes besoins. Il fonctionne assez bien même avec une scène bondée et le support d'éclairage de base est suffisant pour visualiser clairement la géométrie. Il était également assez facile de travailler, ce qui est un gros plus dans mon livre (je n'ai pas eu beaucoup de temps pour investir dans le développement de la visualisation).

6
Dan Bryant

Si par 3D de WPF vous voulez dire sa capacité à afficher des graphiques 3D accélérés par matériel, alors je dirais que oui. Si, cependant, vous voulez dire le cadre 3D de WPF; alors je serais tenté de dire non.

Je n'ai pas beaucoup utilisé le framework WPF 3D, mais d'après ce que j'ai utilisé, j'ai trouvé qu'il impliquait beaucoup de points codés en dur. Cela étant dit, il existe probablement des moyens de contourner cela, mais je ne pense généralement pas que le cadre ait jamais été conçu avec des graphiques 3D avancés à l'esprit (tels que des outils de modélisation et des moteurs de jeu).

Cependant, ce que j'ai trouvé bon, c'est d'afficher du contenu rendu 3D et d'intégrer en douceur le contenu rendu avec son système de composition d'interface utilisateur. J'ai largement utilisé WPF de cette manière comme hôte d'application pour le rendu et la manipulation de contenu 3D - en particulier en termes de contexte de modélisation 3D.

Pour de telles situations, vous pouvez utiliser D3DImage contrôle intégré dans une application WPF pour permettre au contenu DirectX d'être rendu directement sur votre application. Vous pouvez effectuer le rendu sur cette surface à l'aide de DirectX lui-même ou d'un wrapper géré tel que SlimDX . Ce dernier, que j'ai trouvé très bon car il prend en charge les versions DirectX 9, 10 et 11, et c'est un wrapper assez mince, donc une grande partie de l'API DirectX est utilisable presque de la même manière.

Dans l'ensemble, je dirais que cela dépend entièrement de votre utilisation requise du système 3D.

4
Samuel Slade

Bien que la réponse soit, bien sûr, cela dépend. Je vais être audacieux et dire que WPF 3D est idéal pour l'apprentissage, les besoins simples et l'intégration de la 3D dans une application autrement 2D.

Puisque vous envisagez WPF, je suppose que vous envisagez d'utiliser C # pour écrire quelque chose qui s'installe sur Windows. En plus de ce que les autres recommandent, je suggère de regarder XNA, qui ne fait pas partie de WPF, mais dont un sous-ensemble est disponible dans Silverlight 5 (si vous voulez vous en tenir à XAML).

J'ai programmé en OpenGL avec C, DirectX en C++ et Managed DirectX (obsolte) et WPF 3D. WPF 3D offre un niveau d'abstraction très élevé, offre de nombreuses fonctionnalités pratiques et convient à certaines applications. Je l'ai utilisé dans le passé sur une application combinant des graphiques 2D et 3D et cela fonctionnait bien pour cette application. Dans ce cas, j'avais besoin de plans de détourage arbitraires, une fonctionnalité qui n'était pas disponible, et il était plus facile de faire manuellement le détourage que d'utiliser une autre API qui fournissait cette fonctionnalité mais manquait beaucoup de commodité de haut niveau.

3
Peter Tate