IndexSoftwareCoding memoMisc.BBSLinkContact

SDL+OpenGLによるフォント表示

2003/11/23

ゲーム等で画面に文字が表示されるのは当然のことですが,OpenGLを用いてフォントを 表示するのは初心者にとって面倒な問題です.私も同様にOpenGLで文字を表示させたい と思いweb上を渡り歩き,OpenGLによるフォント表示について調査し, 私なりの実装を試みました. ここではその結果を示したいと思います.


サンプルプログラム実行画面

対象者

ここで対象とするのはOpenGLについて基本的な知識を持った方です. 表題にはSDL+OpenGLとありますが,フォント表示についてはOpenGLの機能のみを 使用していますので,SDLを知らない方でも参考になるかと思います.

サンプルプログラム

サンプルプログラムはこちらからダウンロードしてください.
ここでは本プログラムで採用したフォント表示の方式と, 中心的なクラスであるGFontの使用法について簡単に触れたいと思います.
 はじめにフォント表示方式ですが,本プログラムではビットマップフォントを 用いたフォント表示を行っています.この方式はフォント拡大時には若干美しさが 損なわれますが,高速描画が可能なため,ゲーム等のインタラクティブなアプリケーションに 適しています.ビットマップフォントとは予めサイズ(2^n, 2^n)の正方形ビットマップ中にフォントを並べたものです. (下図参照)


ビットマップフォント

本プログラムで用いたビットマップは32bit targaフォーマットです. これですとアルファチャネルがあるので背景にあたる部分を抜いて表示することができます. ビットマップ生成にはフリーのBitmapFontBuilderを用いました.
 次に,実際にフォントを用いて文字列表示を行うclass GFontの使用法をご説明します. まず次のコードをご覧ください.

1: GLuint texid;
2: texid = tgaLoadAndBind("QuickExpressFont_grad.tga", TGA_DEFAULT);
3: GFont *font = new GFont(texid, true);
4: font->SetPitch(0.9f);
5: font->SetSize(40, 40);

これはGFont初期化部分です.上記コード2行目のtgaLoadAndBind()でビットマップロードおよび OpenGLテクスチャオブジェクト生成を行い,そのIDを返します. このIDはglGenTexture()が生成するものです. 4行目のSetPitch()は文字間隔を設定します.1.0fのときデフォルトの文字間隔になります.(下図参照)


SetPitch(1.f)のとき


SetPitch(0.9f)のとき


SetPitch(0.6f)のとき

表示にはPrint()メソッドを用います.第1第2引数がx, y座標を表しますが,その後の引数は C言語標準ライブラリのprintf()と同じです.

6: font->Print(10, 430, "FONT DRAWING TEST");

以上がGFontの使用法でした.

終わりに

 ここでは,サンプルプログラムを中心に,OpenGLにおけるフォント表示についてご説明しました.
最後に,本プログラムのソースコードの利用は商用・非商用にかかわらず許可します. ただし,ソースコードを改変無く用いる場合は著作権表示をお願いします. 改変した場合は自分のものとされて構いません. また本プログラムとソースコードの利用は利用者の責任において行っていただくようお願い いたします.また,次空は本プログラム,ソースコード利用中に生じた損害に対する責 任を負いません.