FTGL で 3D 空間に日本語を描画

こんにちは、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 ゲームなんて描画できないですかね。

ではまた!