- wglUseFontBitmaps関数でマルチバイト文字表示 - |
Windows環境でOpenGLで文字を表示するにはwglUseFontBitmapを使います。 wglUseFontBitmapは指定したフォントを使って文字のビットマップをディスプレイリストとして作成してくれます。 (TextOut等のWindowsのGDIも使えますが、OpenGLではダブルバッファで描画する為ちらつき等が発生してしまいます) そんなwglUseFontBitmapを使って日本語(マルチバイト文字)を表示してみます。 wglUseFontBitmapでの文字表示の流れとしては、 1.ディスプレイリスト領域を確保。 2.wglUseFontBitmapsで文字のディスプレイリストを作成。 3.glCallListでディスプレイリストを呼んで描画。 基本的にはこんな感じです。ただ、色々準備があります。 では、とりあえずソースを見て見ましょう。 [ソース] int drawTextOnGL(char *text, HDC hdc, HFONT font, GLfloat red, GLfloat green, GLfloat blue, GLfloat posX, GLfloat posY, GLfloat posZ, GLfloat xmove) { unsigned int textLength; //引数で受け取ったテキストの長さ WCHAR * unicodeText; //textをUNICODEに変換した文字列を格納する GLuint listbaseIdx; //ディスプレイリストの最初のインデックス //日本語の文字列として扱うよう設定 setlocale(LC_CTYPE, "jpn"); //textの文字数を取得 textLength = (unsigned int)_mbstrlen(text); if(textLength == -1) return -1; //textの文字数分のワイド文字列の領域を作成 unicodeText = (WCHAR *)calloc(textLength + 1, sizeof(WCHAR)); if(unicodeText == NULL) { return -2; } //取得したジョイントIDをUNICODEに変換する if(MultiByteToWideChar(CP_ACP, 0, text, -1, unicodeText, (sizeof(WCHAR) * textLength) + 1) == 0) return -3; SelectObject(hdc, font); //文字数分のディスプレイリストを確保し、ディスプレイリストの最初のインデックスを取得 listbaseIdx = glGenLists(textLength); for(unsigned int textCnt = 0; textCnt < textLength; ++textCnt) { if(wglUseFontBitmapsW(hdc, unicodeText[textCnt], 1, listbaseIdx + textCnt) == FALSE) { //MessageBox(hwnd, "wglUseFontBitmaps() Error!!", "wgl Error", MB_OK); } } //文字色の指定 glColor3f(red, green, blue); //1文字描画したら文字を何bitずらすか glBitmap( 0, 0, 0, 0, xmove/*x move*/, 0/*y move*/, NULL ); //文字を描画する位置を決める glRasterPos3f(posX, posY, posZ); //ディスプレイリストを実行する for(unsigned int textCnt = 0; textCnt < textLength; textCnt++) { glCallList(listbaseIdx + (GLuint)textCnt); } return 1; } [詳細]
|