Beliebigen Text in XNA mithilfe der Windows-API rendern?

9

In Andrews Kommentar zu meiner anderen Frage stellte er fest, dass es möglich war, Text mithilfe der Windows-API in Texture2D zu rendern, anstatt den Text direkt mit einem SpriteBatch zu zeichnen. Wie wird das gemacht? Ich vermute, es gibt einen Zwischenschritt, bevor die Bilddaten in eine Texture2D geschrieben werden.

Ich frage, weil dies mir erlauben würde, Unicode-Zeichen im laufenden Betrieb zu rendern, anstatt alle benötigten Glyphen mit einem SpriteFont vorab zu rendern (zu viele Glyphen auf Koreanisch und Japanisch, um diese Route leider nicht durchführbar zu machen). Vielen Dank!

ThatsGobbles
quelle

Antworten:

4

Mit etwas Reflexion können Sie den Direct3D-Oberflächenzeiger von einer Texture2D abrufen. Von dort aus können Sie alle APIs verwenden, die auf einer DX-Oberfläche gerendert werden können. Ich habe dies kürzlich getan, um XNA-Inhalte mit D3DImage von WPF (mit Alpha-Kanal-Unterstützung) zu hosten. DirectWrite kann auf einer DX-Oberfläche gerendert werden, und Sie können möglicherweise sogar verwaltete APIs verwenden . Die DirectX .NET-Wrapper in diesem Link unterstützen nur Direct3D 10 und 11 und nicht Direct3D 9 (das XNA AFAIK verwendet). Möglicherweise können Sie es jedoch trotzdem zum Laufen bringen. Nebenbei bemerkt, wenn Sie Vektorgrafiken rendern möchten, können Sie möglicherweise einen ähnlichen Ansatz für die Zusammenarbeit mit Direct2D verwenden. Natürlich funktioniert nichts davon auf einer anderen XNA-unterstützten Plattform als Windows.

Mike Strobel
quelle
1
Ich möchte nur darauf hinweisen, dass Sie auch das Fensterhandle für xna erhalten und es anweisen können, stattdessen in etwas wie einem Win32-Panel zu rendern. Dann können Sie jede Methode verwenden, die Sie über dem Spiel rendern möchten, da Sie einfach den Backbuffer auf ein Win32-Steuerelement zeichnen. Das ist sehr schmutzig, aber es hat gut funktioniert, als ich das Tablet PC-Eingabefeld mit XNA zusammengeführt habe. Das Ergebnis schien ein Standard-XNA-Fenster mit unsichtbarer Handschrifterkennung zu sein. Ich habe einfach Striche über xna angezeigt. Natürlich funktionieren auch Text / Beschriftungen / Schaltflächen. Ich habe dies jedoch nicht mit WPF versucht.
Zfedoran
1
Ich würde denken, dass es "Luftraum" -Probleme mit Ihrer Methode geben würde, Arriu. Konnten Sie Inhalte über einem XNA-Fenster mit intaktem Alphakanal rendern? Die allgemeine Regel lautet, dass ein Pixel nur einer Grafik-API "gehören" kann, was Probleme mit transparentem oder durchscheinendem Inhalt verursacht. Wenn dies auch für Ihre Methode gilt, ist es problematisch, Text auf etwas anderem als einem einfarbigen Hintergrund zu rendern.
Mike Strobel
Entschuldigung, ich war vielleicht etwas verwirrend. Die von mir beschriebene Methode weist das Bedienfeld lediglich an, eine Textur auf den Hintergrund zu zeichnen. Ähnlich wie Sie einer Imagebox mitteilen können, welches Bild gezeichnet werden soll. Aber anstatt dass die Textur / das Bild eine Datei ist, ist es der xna-Backbuffer. Ich habe nicht auf oder über der Tafel / dem Fenster gezeichnet. Es gab also keine Probleme mit dem "Luftraum".
Zfedoran
Ah ich sehe. Ihr Ansatz ist also sehr ähnlich dem, wie ich XNA-Inhalte in WPF gehostet habe (mit D3DImage). Anstelle einer typischen Bitmap-Quelle ist die Bildquelle eine XNA / Direct3D-Oberfläche. Ich bin damit einverstanden, dass dies angesichts der verfügbaren Optionen der beste Ansatz ist - es gibt keine Luftraumprobleme und die Leistung ist ziemlich gut, da kein unnötiges Kopieren / Blitting erforderlich ist.
Mike Strobel