GDIを使用しないネイティブdirectx9でフォントを作成およびレンダリングするためのチュートリアル/情報を持っている人はいますか?(たとえば、ID3DXFontを使用しません)。
これは(GDIにアクセスするため)最善の解決策ではないことを読んでいますが、dxでフォントをレンダリングするための「正しい」方法は何ですか?
4 に答える
なぜこれは良い解決策ではないのですか?
GDIレンダリングとD3Dレンダリングを同じウィンドウに混在させることはお勧めできません。
ただし、ID3DXFontはそれを使用しません。GDIを使用して、グリフをテクスチャにラスタライズします。そして、そのテクスチャを使用して実際のテキストをレンダリングします。
唯一の選択肢は、別のライブラリ(FreeTypeなど)を使用してグリフをテクスチャにラスタライズすることですが、それが実質的なメリットをもたらすかどうかはわかりません。
もちろん、単純な(たとえば非アジアの)フォントの場合、すべてのグリフを事前にテクスチャにラスタライズし、そのテクスチャを使用して実行時にテキストを描画することができます。このように、ランタイムはフォントレンダリングライブラリを使用する必要はなく、テクスチャを使用して四角形を描画するだけです。このアプローチは、大きなフォントサイズや文字数の多いフォントでは適切に拡張できません。また、複雑なタイポグラフィをうまく処理できません(たとえば、文字を結合する必要がある場合など)。
ID3DXFont は、使いやすく、早期のデバッグ出力に最適です。ただし、フォントのラスタライゼーションに GDI を使用し (ハードウェア アクセラレーションではありません)、パフォーマンスが大幅に低下します (試してみてください。実際には非常に顕著です)。ただし、DirectX 11 の時点では、フォントは Direct2D でレンダリングされ、ハードウェア アクセラレーションが適用されます。
テキストをレンダリングする最速の方法は、「ビットマップ フォント」と呼ばれるものを使用することです。これを行う方法を説明しますが、この手法を実装するにはさまざまな方法があり、それぞれ複雑さと機能が異なります。事前に作成されたテクスチャをロードしてそこから文字を描画するシステムや、フォントを Windows にサイレントに登録し、ロード時にメモリ内にテクスチャを作成するシステムなど、単純なものにすることができます (私が友人と開発したエンジンこれを行いました、それは非常に滑らかでした)。いずれにせよ、ビットマップ フォントを使用すると、パフォーマンスが大幅に向上するはずです。
個人的には、ID3DXFont が最適だと思います。本当に独自のフォント ルーチンを作成したい場合は、http: //creators.xna.com/en-us/utilities/bitmapfontmakerを参照することをお勧めします。
これを使用して、すべての文字が印刷されたビットマップを作成できます。次に、テクスチャをロードして、関連する文字を画面の適切な場所にブリットするだけです。(これは XNA がフォント描画に使用するものです)
作業ははるかに多くなりますが、ターゲット PC にフォントをインストールする必要はありません。また、Photoshop にアクセスしてそこでフォントの外観を編集できるという利点があります。
DirectX で標準フォントをレンダリングする正しい方法は、GDI を使用することです。
ただし、IF
- クロス プラットフォームのフォント レンダリングをサポートしたい
- 国際化の適切なサポート - フォント内のすべての文字のグリフを維持することが非現実的な極東言語を含む
- および/または独自のフォントを配布し、「インストール」せずにレンダリングしたい...
次に、libfreetypeが探しているものかもしれません。簡単だとは言いません。ネイティブ フォント API を使用するよりもはるかに複雑です。