OpenGL:文字を書く

opengl-text.png

文字コード表

このページを参照

OpenGL3以降

OpenGL3以降 文字を描く系のAPIはすべて非推奨になってしまいました。
どうやらテクスチャを用意して描くのが推奨されているようです。

FTGL+OpenGL3の困ったところ

  • FTGL..FreeTypeを利用した文字を描画するライブラリ

FTGLで文字の位置をしていするにはglRasterPosで指定しますが、glRasterPosはOpenGL3において非推奨関数なので、FTGLはOpenGL3に合ってるとは言えません。残念。。。

FreeType+OpenGL3

  • wikibook-OpenGLではFreetypeを利用することがおすすめされている。

やってみたが失敗して挫折。。。orz

BitmapFontのテクスチャを使って直接的に描画する

詳細はOpenGL テクスチャを利用して文字を描画する
ソースコード(git)Text.cpp

OpenGL2時代

OpenGL3以降 文字を描く系のAPIはすべて非推奨になってしまいました。
以下はOpenGL2時代にどうやって文字を描いていたかについて記します。

書けない!時

glBeginとglEndの間に書いたら出てこないよ。
glRasterPosの位置が変じゃないか確認

freeglutが必要
オリジナルのGLUTは、1文字1文字のフォント描画しかなかった。
freeglutでは、文字列の描画ができるようになった。

  • void glutBitmapString( void* font, const unsigned char *string );
  • void glutStrokeString( void* font, const unsigned char *string );

指定できるフォントはオリジナルのGLUTと同じ。
【ストロークフォント】
GLUT_STROKE_ROMAN
GLUT_STROKE_MONO_ROMAN

【ビットマップフォント】
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_8_BY_13
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12
GLUT_BITMAP_HELVETICA_18
使い方

#include <gl/freeglut.h>
... ...
//もしフォントを変数にしたいならこんなかんじ
void *font = GLUT_BITMAP_HELVETICA_18;
 
... ...
glRasterPos3d(0, 0, 0);//0,0,0位置をスタート位置にする
glutBitmapString(GLUT_BITMAP_HELVETICA_18,(const unsigned char*)("Hello Free glut Font"));

【メモ】
第2引数は、キャストをする必要がある。C++の場合は「reinterpret_cast」を使う
2Dバージョン
void DrawString2D(double _x,double _y,unsigned char _r,unsigned char _g,unsigned char _b){
    glColor3ub(_r,_g,_b);
    glRasterPos2d(_x,_y);
 
    stringstream message;
    message.setf(ios::floatfield,8);
 
    message<<"("<<_x<<","<<_y<<")";
    glutBitmapString(GLUT_BITMAP_HELVETICA_18,reinterpret_cast<const unsigned char*>(message.str().c_str()));
 
}

各フォントについて

GLUT_BITMAP_8_BY_13
8×13ピクセルの長方形にフィットする固定幅フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-misc-fixed-medium-r-normal—13-120-75-75-C-80-iso8859-1

GLUT_BITMAP_9_BY_15
9×15ピクセルの長方形にフィットする固定幅フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-misc-fixed-medium-r-normal—15-140-75-75-C-90-iso8859-1

GLUT_BITMAP_TIMES_ROMAN_10
10ポイントの比例幅 Times Roman フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-adobe-times-medium-r-normal—10-100-75-75-p-54-iso8859-1

GLUT_BITMAP_TIMES_ROMAN_24
24ポイントの比例幅 Times Roman フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-adobe-times-medium-r-normal—24-240-75-75-p-124-iso8859-1

GLUT_BITMAP_HELVETICA_10
10ポイントの比例幅 Helvetica フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-adobe-helvetica-medium-r-normal—10-100-75-75-p-56-iso8859-1

GLUT_BITMAP_HELVETICA_12
12ポイントの比例幅 Helvetica フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-adobe-helvetica-medium-r-normal—12-120-75-75-p-67-iso8859-1

GLUT_BITMAP_HELVETICA_18
18ポイントの比例幅 Helvetica フォント. 用いられる正確なビットマップ名は以下の標準的な X のグリフ・ビットマップである:
-adobe-helvetica-medium-r-normal—18-180-75-75-p-98-iso8859-1
http://wiki.livedoor.jp/mikk_ni3_92/d/freeglut%ca%d404
OpenGL ストロークフォント描画ライブラリ開発

WebGLの場合

WebGL自体に文字列を書く関数は用意されていないらしい。
なので、

  • HTML+スタイルシートで頑張る1
  • javascriptで書く
  • HTML5 の canvas element が持つ 2D context を利用することで文字の表示が可能になります。2

方法が現在取られているようだ。

文字の位置

glRasterPosを使えばglVertex使うのと同じかんじで文字の位置を指定できる。
glWindowPosならば直接スクリーン座標で文字の位置を指定できる。(*ただしOpenGL1.4以降)
より詳細はラスターポジションのページを見てください

Bibliography
1. Survey Of OpenGL Font Technology…ちょっと古い資料

ftgl string text

サポートサイト Wikidot.com ftglstringtext