本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

GL_NV_Path_Renderingを試す その3

一応、ASCII文字は表示できたので今回は日本語文字列を表示させてみたいと思います。
日本語はUNICODEリテラルとして設定して、UNICODEにおけるBMP領域しか使わないものとして(UCS2範囲で)扱うので、UTF-16タイプでセットすることで描画できることが確認出来ました。

const wchar_t szString[] = L"日本語でテスト";

const int allOfUnicode = 0x10FFFFU+1;
glyphBase = glGenPathsNV( allOfUnicode );
float emScale = 2048;
GLuint templatePathObject = ~0;

glPathGlyphRangeNV( glyphBase, 
    GL_SYSTEM_FONT_NAME_NV, "MS 明朝", GL_NONE,
    0, allOfUnicode, GL_SKIP_MISSING_GLYPH_NV, templatePathObject, emScale );
glPathGlyphRangeNV( glyphBase, 
    GL_SYSTEM_FONT_NAME_NV, "Arival", GL_NONE,
    0, allOfUnicode, GL_SKIP_MISSING_GLYPH_NV, templatePathObject, emScale );
glPathGlyphRangeNV( glyphBase,
    GL_SYSTEM_FONT_NAME_NV, "Missing", GL_NONE,
    0, allOfUnicode, GL_USE_MISSING_GLYPH_NV, templatePathObject, emScale );

まずはこのように、使用するフォントを登録します。この場合は MS明朝 > Arival > Missing という優先度でフォント検索が行われます。
また使用する文字コード範囲分グリフのパスを準備しておきます。

続いて前回同様フォントメトリクスを取得

wordLen = wcslen( szString );
glGetPathMetricRangeNV(GL_FONT_Y_MIN_BOUNDS_NV|GL_FONT_Y_MAX_BOUNDS_NV,
                    glyphBase, /*count*/1,
                    2*sizeof(GLfloat),
                    yMinMax);

float* horizontalAdvance = (float*)HeapAlloc( GetProcessHeap(), 0, sizeof(float)*wordLen );
glGetPathMetricsNV( 
    GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV, 
    wordLen, 
    GL_UTF16_NV, szString, 
    glyphBase, sizeof(GLfloat), 
    horizontalAdvance );

xoffset = (GLfloat*) HeapAlloc( GetProcessHeap(), 0, sizeof(float)*wordLen );
xoffset[0] = 0;
for( int i = 1; i < wordLen; ++i ) {
    xoffset[i] = xoffset[i-1] + horizontalAdvance[i-1];
}
    
totalAdvance = xoffset[wordLen-1] + horizontalAdvance[wordLen-1];
HeapFree( GetProcessHeap(), 0, horizontalAdvance );

文字列の指定に、GL_UTF16_NV を使用しているところと、文字列長に合わせてオフセット配列を取得するように変更しています。
この後、前回と同様に文字列描画コードを書くと(GL_UTF16_NVを使うようには修正が必要ですが)日本語でも表示させることが出来ました。
こんな感じの結果が得られました。

プロジェクション行列で文字列の描画矩形分で設定しているため、文字の縦横アスペクト比がちょっとおかしいです。

OpenGLプログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました