Rendre du texte arbitraire dans XNA à l'aide de l'API Windows?

9

Dans le commentaire d'Andrew sur mon autre question , il a noté qu'il était possible de restituer du texte à un Texture2D en utilisant l'API Windows, au lieu de dessiner le texte directement avec un SpriteBatch. Comment cela se fait-il? Je suppose qu'il y a une étape intermédiaire avant d'écrire les données d'image sur un Texture2D.

Je demande parce que cela me permettrait de rendre les caractères Unicode à la volée, au lieu d'avoir à pré-rendre tous les glyphes nécessaires à l'aide d'un SpriteFont (trop de glyphes en coréen et en japonais pour rendre cette route irréalisable, malheureusement). Merci!

ThatsGobbles
la source

Réponses:

4

En utilisant une réflexion, vous pouvez saisir le pointeur de surface Direct3D à partir d'un Texture2D. À partir de là, vous pouvez utiliser toutes les API pouvant effectuer un rendu sur une surface DX. Je l'ai fait récemment pour héberger du contenu XNA avec le D3DImage de WPF (avec prise en charge du canal alpha). DirectWrite peut effectuer un rendu sur une surface DX et vous pouvez même utiliser des API gérées . Les wrappers DirectX .NET de ce lien ne prennent en charge que Direct3D 10 et 11, et non Direct3D 9 (que XNA utilise AFAIK). Cependant, vous pourrez toujours le faire fonctionner. Sur une note latérale, si vous souhaitez rendre des graphiques vectoriels, vous pourrez peut-être utiliser une approche similaire pour interagir avec Direct2D. Naturellement, rien de tout cela ne fonctionnera sur une plate-forme prise en charge par XNA autre que Windows.

Mike Strobel
la source
1
Je veux juste souligner que vous pouvez également obtenir le handle de fenêtre pour xna et lui dire de se rendre à quelque chose comme un panneau win32 à la place. Ensuite, vous pouvez utiliser n'importe quelle méthode que vous souhaitez afficher en haut du jeu, car vous dessinez simplement le backbuffer sur un contrôle win32. C'est très sale mais cela a bien fonctionné pour moi lorsque j'ai fusionné le panneau de saisie Tablet PC avec XNA. Le résultat a été ce qui semblait être une fenêtre XNA standard mais avec une reconnaissance d'écriture invisible. J'ai simplement affiché des traits sur le dessus de xna. Bien sûr, le texte / les étiquettes / les boutons fonctionneront également. Cependant, je n'ai pas essayé cela avec WPF.
zfedoran
1
Je pense qu'il y aurait des problèmes "d'espace aérien" avec votre méthode, Arriu. Avez-vous pu afficher du contenu au-dessus d'une fenêtre XNA avec le canal alpha intact? La règle générale est qu'un pixel ne peut être "détenu" que par une seule API graphique, ce qui pose des problèmes de contenu transparent ou translucide. Si cela vaut également pour votre méthode, il serait problématique de rendre le texte au-dessus d'un fond de couleur unie.
Mike Strobel
Désolé, j'ai peut-être été un peu déroutant. La méthode que j'ai décrite ne fait que dire au panneau de dessiner une texture sur son arrière-plan. Similaire à la façon dont vous pouvez dire à une imagebox quelle image dessiner. Mais au lieu que la texture / image soit un fichier, c'est le backbuffer xna. Je ne dessinais pas sur ou sur le panneau / la fenêtre. Il n'y avait donc aucun problème avec "l'espace aérien".
zfedoran
Ah, je vois. Votre approche est donc très similaire à la façon dont j'ai hébergé du contenu XNA dans WPF (en utilisant D3DImage). Au lieu d'une source bitmap typique, la source d'image est une surface XNA / Direct3D. Je suis d'accord que c'est la meilleure approche compte tenu des options disponibles - il n'y a pas de problèmes d'espace aérien et les performances sont plutôt bonnes car aucune copie / blitting inutile n'est requise.
Mike Strobel