RSS2.0

LWJGFont の開発をはじめました。

LWJGL で好きな True Type Font を使うためのライブラリ LWJGFont を作り始めました。

以前書いた記事: LWJGL で日本語フォントを使ってみるで、Java AWT の Graphics を使って文字列を描き、それを Image からテクスチャーに随時変換して表示していく方法についてご紹介しました。Java SDK の java.awt.Font を使って True Type Font を読み込むので、比較的簡単な実装で日本語のテキストを LWJGL で表示することができます。ただ、OpenGL ではテクスチャーの生成にそれなりのコストがかかるため、表示する文字列が変わるたびにテクスチャーを再生成するというのはリアルタイム性に課題が残るやり方でした。

LWJGL をラップする形で実装されている Slick2D では TrueTypeFont や UnicodeFont というクラスが用意されているそうですが、サンプルプログラムを見る限り、これらのクラスも java.awt.Font を利用して文字列を表示しているようです。.ttf ファイルの読み込み自体は実行時に行われるようなので、おそらく同じような仕組みで動いているのではないかと思います。

そうは言っても、文字列表示はゲームでも重要な要素であるわりに、LWJGL で実現しようとするとそれなりに敷居が高いのが現状です。そこで、以前の日本語フォントを表示する方法とは少し違ったアプローチで、開発者にとって、もう少し手軽に文字列表示を実現しようというのが LWJGFont 開発のゴールになります。

lwjgfont.png

ライブラリを準備する際にひと手間加えなければならないのですが、文字列の表示処理自体は以下のようなシンプルな呼び出しでできるようになります。
MyFont myFont = new MyFont();

myFont.drawString("捲土重来!!!", 100, 400, 0);
LWJGFont で提供するのは、Java AWT などでよく見かける drawString(String, flaot, float, float) というメソッドです。第一引数は表示する文字列、第二~第四引数は表示する座標(X, Y, Z)になります。

今週にかけてそれなりに時間をかけていたので、ようやくひとまずの完成形が見えてきました。
今回は開発の経緯とコンセプトを少し書くだけですが、そう遠くないうちに LWJGL のサードパーティライブラリとして公開できるのではないかと思います。

2012/02/25 追記

LWJGFont ver 1.0 を公開しました。公式ページをご覧ください。

LWJGFont のコンセプト

LWJGL 公式 wiki にあるSlick-Util Library - Part 3 - TrueType Fonts for LWJGLの中でも、True Type Font を使って本当の意味でスケールする綺麗な文字を表示しなければならない場面がいったいどれだけあるだろうか、ということが言われています。True Type Font はどんなサイズでも、綺麗に文字を描くことができるというのが最大の特徴になります。しかし実際にゲームを開発していると、大抵表示する文字列というのは表示領域が決まっているため、大きさも一定であることがほとんどなのです。

だからこそ LWJGL の開発者側としては、Java AWT を駆使してリアルタイムに True Type Font を利用するよりも、あらかじめすべての文字を画像ファイルに描いておくビットマップフォントを使うことを推奨しています。OpenGL を使う上で注意しなければならないテクスチャ生成コストも、すべての文字を描いておいた画像を読み込み、そこから切り貼りするだけなら、最小限に抑えられるわけです。

ただし、以前の記事でもふれた通り、たかだか大文字小文字のアルファベットと数字、記号程度しかない英語と違い、常用漢字だけでも 2000 字強ある日本語では、すべての文字を描き込んだ画像を用意するというのはなかなかハードルの高いことです。
しかもその画像を切り貼りするには、どの文字が画像のどの位置にあるかを知っていなければなりません。すべての文字が同じ横幅となる等幅フォントではまだこれもなんとかなるレベルですが、見た目の美しさを追求するため、文字によって横幅が異なるプロポーショナルフォントでは更に難易度が上がってきます。

この日本語特有の、ビットマップフォント生成の面倒くささを自動化することで解決しようというのが LWJGFont のコンセプトになります。Java はそもそもコンパイル言語なので、実行時に毎回文字列表示に必要な画像を生成するのではなく、開発時やビルドの過程であらかじめ文字を書き込んでおいた画像を作ってしまい、かつ各文字の画像内での配置場所まで計算しておこうという思想に基づいています。

なので、LWJGFont は本当の意味での True Type Font をサポートするライブラリではありません。(任意のサイズの)任意のフォントを、ビットマップフォントとして LWJGL から手軽に使えることを目的としています。


  LWJGFont 開発  コメント (0)  2014/02/13 23:59:31


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2019, 11>>
272829303112
3456789
10111213141516
17181920212223
24252627282930