DirectXTKでフォント表示、日本語対応

デバッグ用の情報を表示するためにフォント表示を実装します。DirectX10まではフォント表示機能がありましたが、DirectX11にはないため、DirectXTKのフォント表示を使ってみます。それと日本語に対応していないようなので(バグかも)、DirectXTKを改造して無理やり日本語に対応させます。かなりいい加減な日本語対応だけどデバッグ用なので気にしない。
ss_dx11DirectXTKFont


DirectXTK フォント表示(アスキー文字)

DirectX11用の便利機能を提供するライブラリです。ここから入手(DirectXTK)
フォント表示にはSpriteFontクラスを使用します。
使用バージョン:February 22, 2013

コンパイル

コンパイルするとフォント画像を作成するコマンドラインツールも同時に作成されます。このツールで作成した画像をテクスチャとして読み込みフォント表示を行います。

フォント画像作成

ツールの場所は、DirectXTK\MakeSpriteFont\bin\Release\MakeSpriteFont.exe
コマンドプロンプトで引数に出力ファイルパスや作成する文字などを指定、実行します。

readme.txtの使用例では”Comic Sans”フォントを指定していますが、ないので代わりに”MS ゴシック”を使用しています。

SpriteFontクラスの作成

フォントの表示


DirectXTK 日本語フォント対応

最初に

デバッグ用の仮対応、DirectXTKのソースコードを変更します。
利用は自己責任で!

DirectXTKでの問題

unicode(UTF16)を使用しているため日本語にも対応していそうですが、いくつか問題がありそのままでは使用できませんでした。

MakeSpriteFontが応答しない

漢字ひらがななど約2万文字を指定してツールを起動すると、数時間たっても終了しない。文字数が増えると指数関数的に処理時間が増加するようです。いつか終了するかもしれませんが、これでは使えません。

文字幅がおかしい

フォント画像は正常に作成されるようですが、フォントの文字幅設定がおかしく、全角文字の表示が重なってしまいます。

問題の解決

ツール(MakeSpriteFont)を修正して問題を解決します。

文字幅

文字コードから文字幅を取得するためにGetCharABCWidthsFloatという関数を使用していますが、でたらめな値を返しているようです。正常に動作させる方法がわからないので、半角か全角か調べ固定の文字幅を設定するように変更しました。

全角の判定、文字幅もとりあえず”MS ゴシック”fontSize=12のときに合うようにしているだけです。違うサイズ、フォントで正常に表示されるかわかりません。

ツールの処理時間

時間がかかり過ぎるので調べてみると、文字を追加する時の空き領域を検索する処理が原因でした。検索方法を見てみると、毎回左上から1ドット単位で空きを総当たりで検索……2万文字だと終わるのに何日かかるのか。効率よく画像を詰め込むための処理でしょうが、日本語の固定幅表示では不要なので順次、左上から詰めていくように改造しました。

日本語フォント画像作成


サンプルプログラム

“DirectXTK MakeSpriteFont日本語対応” をダウンロード MakeSpriteFontModify.zip – 82 回のダウンロード – 12 KB

注意

変更したソースファイルのみ
デバッグ目的の仮対応

「DirectXTKでフォント表示、日本語対応」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.