5

wglUseFontBitmaps を使用して OpenGL で描画するフォントは、すべての文字に等しいスペース (幅) を使用するため、「.」たとえば、「M」と同じくらいのスペースが必要です。フォント作成のピッチ パラメータを に変更しましたVARIABLE_PITCHが、何も変わりません。実際に wglUseFontBitmaps で実行できますか、それとも、生成されたすべてのビットマップが等しいスペースを取るという性質ですか?

さらに、ラスター化されたビットマップ テキストの幅/高さを GetTextExtentPoint32W() でクエリしています。返される幅は問題ありませんが、高さが常に大きすぎます。黒いテキストの後ろに明るい四角形を描いて、3D シーン内で常に読めるようにしています。質問された高さはなぜそんなに大きいのですか? 上位文字用に予約されているスペースは、この「É」のようなものですか?

私のセットアップ:

HFONT   font;                                       // Windows Font ID
font = CreateFont(  -12,                            // Height Of Font
        0,                              // Width Of Font
        0,                              // Angle Of Escapement
        0,                              // Orientation Angle
        FW_EXTRALIGHT,                      // Font Weight
        FALSE,                          // Italic
        FALSE,                          // Underline
        FALSE,                          // Strikeout
        ANSI_CHARSET,                   // Character Set Identifier
        OUT_TT_PRECIS,                  // Output Precision
        CLIP_DEFAULT_PRECIS,            // Clipping Precision
        ANTIALIASED_QUALITY,            // Output Quality
        FF_DONTCARE | VARIABLE_PITCH,       // Family And Pitch
        (LPCWSTR)L"Arial");             // Font Name

    SelectObject(this->hDeviceContext, font);

     //init display lists for text drawing
    bool createFontLists = wglUseFontBitmaps(this->hDeviceContext, 0, 255, 1000);
4

1 に答える 1

5

私は自分で問題を解決しました。フォントがすべての文字を等間隔または等幅で描画しているようにしか見えませんが、実際には OpenGL はすべての文字の間にスペース " " を描画しました。問題は、 でstd::wstring生成されたディスプレイリストを呼び出すための の使用法でしたwglUseFontBitmaps。間違った図は次のようになりました。

int length = wcslen(text.c_str());
glCallLists (sizeof(wchar_t) * length, GL_UNSIGNED_BYTE, text.c_str());

最初のパラメータ (呼び出されるリストの数) が間違っています。だけでなければなりlengthません。text.c_str 内のすべての文字を、次に呼び出すディスプレイ リストを定義するオフセット番号として解釈する方法を OpenGL に指示する 2 番目のパラメータは、ここでは間違っています。0 ~ 65535 の 2 バイトである GL_UNSIGNED_SHORT でなければなりません。GL_UNSIGNED_BYTE では、2 バイト文字の wstring の 2 番目のバイトに使用されるすべての「0」がスペースとして解釈されていました。したがって、正しい呼び出しは次のとおりです。

glCallLists (length, GL_UNSIGNED_SHORT, text.c_str());

これは私の場合には機能しますが、wglUseFontBitmaps で Unicode 文字を使用する一般的な方法ではありません。ここでは、wstring からの ASCII 文字のみを安全にカバーします。

于 2013-05-23T08:20:37.750 に答える