こんにちは、masm11 です。
今回は、タイトルの通りなのですが、OpenGL と FTGL というライブラリを使って、 3D 空間に日本語を描画したいと思います。
その前に
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, character);
という関数もありますが、この関数は、unicode 文字に対応しておらず、 また描画できるのも1文字だけです。
今回使うライブラリは、UTF-8 に対応していて、また描画するのは 文字列で、3D 空間に描画してくれます。
FTGL の使い方
インストールする
Arch Linux の場合は、pacman でインストールできます。
sudo pacman -S ftgl
Arch Linux の ftgl パッケージは freetype2 に依存しているので、 freetype2 もインストールされます (まぁ、私の趣味環境なので、既に入ってましたが)。 自前でビルドする場合は freetype2 も必要になります。
コードを書く
チュートリアルは↓こちらにあります。
https://ftgl.sourceforge.net/docs/html/ftgl-tutorial.html
OpenGL は boilerplate が大きいので、 OpenGL のプログラムが既に動いている前提とします。
ヘッダを include します。
#include <FTGL/ftgl.h>
変数を宣言します。
static FTGLfont *font;
準備はこんな感じ。
font = ftglCreateOutlineFont("/usr/share/fonts/noto-cjk/NotoSansCJK-Medium.ttc"); if (font == NULL) { fprintf(stderr, "No font.\n"); exit(1); } ftglSetFontFaceSize(font, 72, 72);
ここでは ftglCreateOutlineFont
関数を使用しました。
引数はフォントファイルのパスです。
この関数の返り値を使うことで、文字の輪郭 (outline) を描画できます。
他にも、例えば ftglCreatePolygonFont
もあり、これを使うと中を塗りつぶした形になります。
返り値が NULL の場合は失敗していますので、終了します。
ftglSetFontFaceSize
を使用して、フォントサイズを指定します。
ここまでは準備です。では実際に描画します。
ftglRenderFont(font, "FTGLで3D空間に", FTGL_RENDER_ALL); glTranslatef(0, -72, 0); ftglRenderFont(font, "日本語を描画", FTGL_RENDER_ALL);
これだけです。 現在の行列の示す位置・向き・サイズで文字列を描画してくれます。 文字列のローカル座標系で、X軸がちょうど文字の baseline になるようです。
コンパイル
FTGL は pkg-config に対応していますので、
gcc `pkg-config --cflags --libs ftgl` offscreen.c -lGL -lGLU -lglut -lm
pkg-config をこんな感じに指定すればコンパイルできます。
実行してみる
コード全体は以下に掲載してあります (ファイルに出力するコードが大きいです)。
https://github.com/masm11/ftgl-sample
make
して
make run
すると、tmp.mpg が生成されますので、 お好みの動画プレイヤーで再生してください。 記事冒頭に掲載したような動画が再生されます。
まとめ
FTGL を使って 3D 空間に日本語を描画しました。
make run
すると、
FPS = 142.857143
と出力されます。頂点数多いと思うのですが、結構速いですね。 まぁこのくらいで音を上げてたら、3D ゲームなんて描画できないですかね。
ではまた!