Windows APIを使用してXNAで任意のテキストをレンダリングしますか?


9

Andrewの他の質問に対するコメントで、彼は、SpriteBatchで直接テキストを描画する代わりに、Windows APIを使用してテキストをTexture2Dにレンダリングすることが可能であると述べました。これはどのように行われますか?画像データをTexture2Dに書き込む前に、中間ステップがあると思います。

これにより、SpriteFontを使用して必要なすべてのグリフを事前にレンダリングする必要がなく、オンザフライでUnicode文字をレンダリングできるようになるので(韓国語と日本語のグリフが多すぎて、このルートを実行できないようにするのは悲しいことです)。ありがとう!

回答:


4

一部の反射を使用して、Texture2DからDirect3Dサーフェスポインターを取得できます。そこから、DXサーフェスにレンダリングできる任意のAPIを使用できます。最近、WPFのD3DImage(アルファチャネルをサポート)でXNAコンテンツをホストするためにこれを行いました。DirectWriteはDXサーフェスにレンダリングでき、マネージAPIを使用できる場合もあります。そのリンクのDirectX .NETラッパーは、Direct3D 10および11のみをサポートし、Direct3D 9(XNAはAFAIKを使用)はサポートしません。ただし、それでも機能する可能性があります。余談ですが、ベクターグラフィックスをレンダリングする場合、Direct2Dと相互運用するために同様のアプローチを使用できる場合があります。もちろん、これはWindows以外のXNA対応プラットフォームでは機能しません。


1
xnaのウィンドウハンドルを取得して、代わりにwin32パネルのようなものにレンダリングするように指示できることを指摘したいだけです。その後、バックバッファをwin32コントロールに描画するだけなので、ゲーム上にレンダリングしたい任意のメソッドを使用できます。これは非常に汚いですが、Tablet PCの入力パネルをXNAとマージするとうまくいきました。その結果、標準のXNAウィンドウのように見えましたが、手書き認識が見えませんでした。私は単にxnaの上にストロークを表示しました。もちろん、text / labels / buttonsも機能します。ただし、これをWPFで試したことはありません。
zfedoran 2010年

1
あなたの方法には「空域」の問題があると思います、アリュー。アルファチャネルをそのままにして、XNAウィンドウの上にコンテンツをレンダリングできましたか?原則として、ピクセルは1つのグラフィックスAPIによってのみ「所有」され、透明または半透明のコンテンツで問題が発生します。これがメソッドにも当てはまる場合、無地の背景以外の上にテキストをレンダリングすることは問題になります。
Mike Strobel、

すみません、少し混乱していたかもしれません。私が説明した方法は、パネルにその背景にテクスチャを描くように指示すること以外に何もしません。どのように描画するかをimageboxに伝える方法と同様です。しかし、ファイルであるテクスチャ/画像の代わりに、それはxnaバックバッファです。パネル/ウィンドウの上または上に描画していませんでした。したがって、「空域」の問題はありませんでした。
zfedoran 2010年

ああ、分かった。したがって、あなたのアプローチは、WPFでXNAコンテンツをホストした方法(D3DImageを使用)と非常に似ています。一般的なビットマップソースの代わりに、画像ソースはXNA / Direct3Dサーフェスです。利用可能なオプションを考慮した場合、これが最良のアプローチであることに同意します。空域の問題はなく、不必要なコピー/ブリッティングが必要ないため、パフォーマンスはかなり良好です。
Mike Strobel、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.